分段
分段:程序的分段地址空间,分段寻址方案 两个问题
分段 :是更好分离和共享
左边是有序的逻辑地址,右边是无序的物理地址,然后需要有一种映射的关系(段关联机制)
各个程序的分配相应的地址
逻辑地址是内存上的,物理地址是硬盘上的
段 机制的硬件实现方案 :
程序是由若干个逻辑分段组成的,如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的,所以就用分段(Segmentation)的形式把这些段分离出来。
分段机制下,虚拟地址和物理地址是如何映射的?
分段机制下的虚拟地址由两部分组成,段选择因子 和段内偏移量
段选择因子和段内偏移量:
-
段选择子 就保存在段寄存器里面。段选择子里面最重要的是段号 ,用作段表的索引。段表 里面保存的是这个段的基地址、段的界限和特权等级等。
-
虚拟地址中的段内偏移量应该位于 0 和段界限之间,如果段内偏移量是合法的,就将段基地址加上段内偏移量得到物理内存地址。
在上面,知道了虚拟地址是通过段表与物理地址进行映射的,分段机制会把程序的虚拟地址分成 4 个段,每个段在段表中有一个项,在这一项找到段的基地址,再加上偏移量,于是就能找到物理内存中的地址,如下图:
如果要访问段 3 中偏移量 500 的虚拟地址,我们可以计算出物理地址为,段 3 基地址 7000 + 偏移量 500 = 7500。
分页:
在分段机制中,尺寸是可变的,分页中尺寸是不可变的;
物理(页)帧的地址寻址方式:
(3,6),3表示的是帧号,帧的偏移量是6;
计算地址就是:2的9(帧的大小空间)次方乘以3(帧号),加上6(帧的偏移量)
逻辑页的地址寻址方式:
、有个tlb 存了页号和帧号的对应关系
具体步骤:
总结一下,对于一个内存地址转换,其实就是这样三个步骤:
-
把虚拟内存地址,切分成页号和偏移量;
-
根据页号,从页表里面,查询对应的物理页号;
-
直接拿物理页号,加上前面的偏移量,就得到了物理内存地址。
段页式内存管理
内存分段和内存分页并不是对立的,它们是可以组合起来在同一个系统中使用的,那么组合起来后,通常称为段页式内存管理。
段页式内存管理实现的方式:
- 先将程序划分为多个有逻辑意义的段,也就是前面提到的分段机制;
- 接着再把每个段划分为多个页,也就是对分段划分出来的连续空间,再划分固定大小的页;
这样,地址结构就由段号、段内页号和页内位移三部分组成。
用于段页式地址变换的数据结构是每一个程序一张段表,每个段又建立一张页表,段表中的地址是页表的起始地址,而页表中的地址则为某页的物理页号,如图所示:
段页式地址变换中要得到物理地址须经过三次内存访问:
- 第一次访问段表,得到页表起始地址;
- 第二次访问页表,得到物理页号;
- 第三次将物理页号与页内位移组合,得到物理地址。
可用软、硬件相结合的方法实现段页式地址变换,这样虽然增加了硬件成本和系统开销,但提高了内存的利用率。