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

分段

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

分段 :是更好分离和共享

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

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

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

段 机制的硬件实现方案 :

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

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

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

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

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

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

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

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

分页:

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

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

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

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

逻辑页的地址寻址方式:

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

具体步骤:

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

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

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

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

段页式内存管理

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

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

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

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

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

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

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

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

相关推荐
linweidong23 天前
GO后端开发内存管理及参考答案
golang·内存管理·trace·三色标记法·go面试·go面经·go gc
qwfys2001 个月前
从零起步认知微内核操作系统(AGI)
os·微内核
Thanks_ks1 个月前
29 C 语言内存管理与多文件编程详解:栈区、全局静态区、static 与 extern 深度解析
内存管理·c 语言·多文件编译·栈区·全局静态区·static 关键字·extern 声明
Dovis(誓平步青云)1 个月前
破解C/C++内存分配与管理:内存对象模型硬核剖析
开发语言·c++·内存管理·解读
我不是帅戈2 个月前
STM32单片机内存分配详细讲解
stm32·单片机·嵌入式·内存管理·.map文件
开源架构师2 个月前
JVM 与云原生的完美融合:引领技术潮流
jvm·微服务·云原生·性能优化·serverless·内存管理·容器化
charlie1145141912 个月前
内核深入学习3——分析ARM32和ARM64体系架构下的Linux内存区域示意图与页表的建立流程
linux·学习·架构·内存管理
羑悻的小杀马特2 个月前
【Linux篇章】Linux 进程信号2:解锁系统高效运作的 “隐藏指令”,开启性能飞跃新征程(精讲捕捉信号及OS运行机制)
linux·运维·服务器·学习·os·进程信号
tianyuanwo2 个月前
不同OS版本中的同一yum源yum list差异排查思路
yum·rpm·os
清源妙木真菌2 个月前
高并发内存池
linux·性能优化·内存管理