内存管理 -----分段分页

分段

分段:程序的分段地址空间,分段寻址方案 两个问题

分段 :是更好分离和共享

左边是有序的逻辑地址,右边是无序的物理地址,然后需要有一种映射的关系(段关联机制)

各个程序的分配相应的地址

逻辑地址是内存上的,物理地址是硬盘上的

段 机制的硬件实现方案 :

程序是由若干个逻辑分段组成的,如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的,所以就用分段(Segmentation)的形式把这些段分离出来。

分段机制下,虚拟地址和物理地址是如何映射的?

分段机制下的虚拟地址由两部分组成,段选择因子段内偏移量

段选择因子和段内偏移量:

  • 段选择子 就保存在段寄存器里面。段选择子里面最重要的是段号 ,用作段表的索引。段表 里面保存的是这个段的基地址、段的界限和特权等级等。

  • 虚拟地址中的段内偏移量应该位于 0 和段界限之间,如果段内偏移量是合法的,就将段基地址加上段内偏移量得到物理内存地址。

在上面,知道了虚拟地址是通过段表与物理地址进行映射的,分段机制会把程序的虚拟地址分成 4 个段,每个段在段表中有一个项,在这一项找到段的基地址,再加上偏移量,于是就能找到物理内存中的地址,如下图:

如果要访问段 3 中偏移量 500 的虚拟地址,我们可以计算出物理地址为,段 3 基地址 7000 + 偏移量 500 = 7500。

分页:

在分段机制中,尺寸是可变的,分页中尺寸是不可变的;

物理(页)帧的地址寻址方式:

(3,6),3表示的是帧号,帧的偏移量是6;

计算地址就是:2的9(帧的大小空间)次方乘以3(帧号),加上6(帧的偏移量)

逻辑页的地址寻址方式:

、有个tlb 存了页号和帧号的对应关系

具体步骤:

总结一下,对于一个内存地址转换,其实就是这样三个步骤:

  • 把虚拟内存地址,切分成页号和偏移量;

  • 根据页号,从页表里面,查询对应的物理页号;

  • 直接拿物理页号,加上前面的偏移量,就得到了物理内存地址。

段页式内存管理

内存分段和内存分页并不是对立的,它们是可以组合起来在同一个系统中使用的,那么组合起来后,通常称为段页式内存管理

段页式内存管理实现的方式:

  • 先将程序划分为多个有逻辑意义的段,也就是前面提到的分段机制;
  • 接着再把每个段划分为多个页,也就是对分段划分出来的连续空间,再划分固定大小的页;

这样,地址结构就由段号、段内页号和页内位移三部分组成。

用于段页式地址变换的数据结构是每一个程序一张段表,每个段又建立一张页表,段表中的地址是页表的起始地址,而页表中的地址则为某页的物理页号,如图所示:

段页式地址变换中要得到物理地址须经过三次内存访问:

  • 第一次访问段表,得到页表起始地址;
  • 第二次访问页表,得到物理页号;
  • 第三次将物理页号与页内位移组合,得到物理地址。

可用软、硬件相结合的方法实现段页式地址变换,这样虽然增加了硬件成本和系统开销,但提高了内存的利用率。

相关推荐
叼烟扛炮17 小时前
C++第五讲:内存管理
c++·算法·面试·内存管理
Han_shuo_shi2 天前
用C语言实现单片机malloc功能:TLSF算法实现单片机malloc函数及单片机malloc原理详解和测试
内存管理
星马梦缘6 天前
操作系统实验4 —— 计算机系统中的 IPC
操作系统·共享内存·os·管道·ipc
mounter6259 天前
Linux Kernel Design Patterns (Part 2):从经典链表到现代 XArray,拆解内核复杂数据结构的设计哲学
linux·数据结构·链表·设计模式·内存管理·kernel
CoderMeijun10 天前
C++ 智能指针:auto_ptr
c++·内存管理·智能指针·raii·auto_ptr
mounter62515 天前
【内核新动向】告别物理槽位束缚:深度解析 Linux Virtual Swap Space 机制
linux·内存管理·kernel·swap·virtual swap
jolimark19 天前
C语言存在的问题及Zig语言如何改进,差异对比全在这
c语言·内存管理·系统编程·类型系统·zig语言
无小道20 天前
OS——进程间关系与守护进程
os·守护进程·进程间关系
少司府21 天前
C++基础入门:内存管理
c语言·开发语言·c++·内存管理·delete·new·malloc
无小道22 天前
OS——信号
信号·os