虚拟内存机制

一、虚拟内存机制示意图

本文假定从虚拟地址查得其映射的物理地址的步骤只有寄存器 cr3 → 页目录 → 页表 → 物理页框四步,某些操作系统可能有多级页目录或多级页表,但原理类似。

虚拟地址转化为物理地址的过程


二、线性地址、虚拟地址与物理地址

线性地址等于段基址加上偏移地址,分页机制将线性地址转换成物理地址。

虚拟地址指的是“段基址 + 偏移地址”中的偏移地址。

Linux 把所有段的段基址都设置为 0,所有段基址都为 0,故线性地址在数值上等同于虚拟地址。

程序员手在程序中访问变量或函数的地址一律是虚拟地址,CPU 寻查的地址一律是物理地址。


三、页和页框

  • 把虚拟地址空间划分为若干个等大的区域,这个区域叫做页。

  • 把物理地址空间划分为若干个等大的区域,这个区域叫做页框。

  • 一般页和页框的大小相同,都为 2 10 2^{10} 210 1024 1024 1024 个字节。


四、寄存器 cr3,页目录和页表

  • 寄存器 cr3 用于保存一个页目录的 32 位物理地址。

  • 一个页目录用于保存每一个页表的 32 位物理地址。

  • 一个页表用于保存每一个页框的 32 位物理地址。

  • Intel 规定,页目录的物理地址、页表的物理地址和页框的物理地址必须按 4K 对齐即必须是 4096 的倍数,故以上 3 类物理地址的低 12 位一定全是 0,操作系统可以利用低 12 位存放一些标志比如权限位、存在位等,提取物理地址之前用掩码将低 12 位设为 0 即可忽略标志位的影响,从而得到真正的物理地址。

  • 以上四点说的是页目录或页表每一项存放的内容是什么,那一个页目录或一个页表最多能存放多少项内容呢?假设虚拟(线性)地址的低 a 位代表页框内偏移地址,中间 b 位代表页表索引,高 c 位代表页目录索引,则一个页表最多能存放 2 b 2^{b} 2b 项页框物理地址,一个页目录最多能存放 2 c 2^{c} 2c 项页表物理地址。一般 a = 12,b = 10, c = 10。


五、虚拟内存机制的作用

​ 对于一个进程来说,当下需要被访问的数据所在的虚拟内存页才会被映射到物理页框,尚未被访问的数据所在的虚拟内存页则不会,如果要访问的数据所在的虚拟内存页未被映射到物理页框,则会触发缺页中断,对目标虚拟内存页进行映射再继续被中断的访问,这有利于节省物理内存资源。


六、参考资料

Linux 线性地址,逻辑地址和虚拟地址的关系? - Hao Lee的回答 - 知乎
《Intel 64 and IA-32 Architectures Software Developer’s Manual》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值