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

分段

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

分段 :是更好分离和共享

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

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

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

段 机制的硬件实现方案 :

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

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

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

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

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

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

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

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

分页:

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

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

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

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

逻辑页的地址寻址方式:

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

具体步骤:

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

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

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

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

段页式内存管理

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

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

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

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

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

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

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

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

相关推荐
点云SLAM5 天前
C++中内存池(Memory Pool)详解和完整示例
开发语言·c++·内存管理·内存池·new/delete·malloc/free
点云SLAM9 天前
Boost库中Pool 基础内存池(boost::pool<>)的详细用法解析和实战应用
内存管理·new/delete·malloc/free·boost库·pool基础内存池应用·内部机制
HyperAI超神经11 天前
【vLLM 学习】Load Sharded State
llm·大语言模型·内存管理·vllm·推理加速·kv 缓存·中文文档
qwertyuiop_i15 天前
windows内核研究(内存管理-线性地址的管理)
内存管理·windows内核研究·线性地址的管理
缘友一世1 个月前
操作系统PV专题题型突破(考研版)
考研·操作系统·pv·os
wa的一声哭了1 个月前
python基础知识pip配置pip.conf文件
java·服务器·开发语言·python·pip·risc-v·os
HIT_Weston1 个月前
71、【OS】【Nuttx】【启动】启动函数分析
启动·os·nuttx
linweidong2 个月前
GO后端开发内存管理及参考答案
golang·内存管理·trace·三色标记法·go面试·go面经·go gc
qwfys2003 个月前
从零起步认知微内核操作系统(AGI)
os·微内核
Thanks_ks3 个月前
29 C 语言内存管理与多文件编程详解:栈区、全局静态区、static 与 extern 深度解析
内存管理·c 语言·多文件编译·栈区·全局静态区·static 关键字·extern 声明