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

分段

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

分段 :是更好分离和共享

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

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

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

段 机制的硬件实现方案 :

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

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

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

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

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

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

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

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

分页:

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

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

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

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

逻辑页的地址寻址方式:

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

具体步骤:

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

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

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

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

段页式内存管理

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

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

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

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

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

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

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

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

相关推荐
深山老宅5 天前
九浅一深Jemalloc5.3.0 -- ④浅*配置
内存管理·内存分配·malloc·jemalloc 5.3.0
Android小贾9 天前
HarmonyOS Next开发学习手册——内存管理(GC)
jvm·学习·移动开发·harmonyos·内存管理·arkui·应用开发
fxm树鹿12 天前
GO内存管理
golang·内存管理
橘色的喵13 天前
针对ARM64嵌入式系统的Linux内核参数优化
性能优化·linux内核·嵌入式·arm·内存管理·arm64·网络优化
未来可期LJ19 天前
【Linux 内存管理】
内存管理·linux 系统
汽车电子嵌入式20 天前
【OS基础】符合AUTOSAR标准的RTAOS-Alarms详解
autosar·os·alarm
计算机学无涯1 个月前
操作系统微助教题库(组卷)
操作系统·os
Voltline2 个月前
HawkEye—高效、细粒度的大页管理算法
linux·算法·操作系统·内存管理·os·大页内存管理·透明大页
ThinkPet2 个月前
笔记-用Python脚本启停JAR程序
java·python·jar·signal·os·subprocess
Android小贾3 个月前
OpenHarmony 资源调度之内存管理源码分析
数据库·性能优化·移动开发·harmonyos·内存管理·openharmony