多级页表与快表
什么是页表
页表就是一个用于将虚拟地址转换为物理地址的工具。
转换的公式就是: 通过页表先找到页,在使用页内偏移地址找到最终对应的实际物理内存
页表带来的问题
在页式内存管理中有两个重要的问题
- 虚拟物理地址到物理地址转换要快
- 当虚拟空间很大的时候页表也会变的很大
所以为了解决第一个问题就有了快表
所以为了解决第二个问题就有了多级页表
快表
快表一般存放在 CPU 内部的高速缓冲存储器 Cache。
快表可以直接理解为页式内存管理的高速缓存(Cache)
快表的原理是基于局部性原理、
- 时间局部性: 也就是某个数据被访问过那么这个数据不久很可能再次访问
- 空间局部性: 就是某个存储单元被访问过,那么它周围的存储单元很有可能被访问
快表的作用:加速虚拟地址到物理地址的转换速度
快表中存放着页表的一部分甚至全部内容
快表作为页表的高速缓存器(Cache),作用与页表的本质作用一致,只不过提高了页表的访问速度
原理:如果用页表做地址转换,则读写数据内存时,CPU要访问内存两次。当使用快表,有时只要访问一次高速缓存器,一次主存,这样就可以加速查找并提高指令执行速度
使用快表之后的地址转换流程:
- 根据虚拟地址中的页号查找快表
- 若该页在快表中,则直接从快表中读取对应的物理地址
- 若该页不在快表中,则访问内存中的页表,再从页表中读取物理地址,同时将该页表中的物理地址映射到快表中
- 当快表填满时,又要增加新的页表,就按照一定的淘汰策略删掉一页
多级页表
为了提高内存空间利用率,页应该小,页小了那么页表就大了
如果只有一级页表那么4G
的虚拟地址空间就需要4M
的连续内存来存放页表,开销太大
这时候就出现了多级页表,用来节约内存
使用二级页表的画,就只需要一个4k
的页表来管理1024
个二级页表,这时候你会有疑问怎么消耗的内存更大了,
其实不然,这里的内存不是都要放在内存里面的,根据局部性原理只有一级页表在内存,二级页表都存放在外部磁盘。只有当缺页中断的时候才会调用进去内存中
三级页表转换法
- 逻辑地址转物理地址
段起始地址+段内偏移地址=线性地址
一个32位的线性地址被划分为三部分
- 10bit 页目录索引
- 10bit 页吧表索引
- 12bit 页内偏移量
- 线性地址转物理地址
从cr3
(页表寄存器)中拿出页目录地址
页目录地址+页目录索引=页表地址+页表索引=页地址+业内偏移=物理地址