1 参考文献
宋宝华: CPU是如何访问到内存的?--MMU最基本原理
https://mp.weixin.qq.com/s?__biz=Mzg2OTc0ODAzMw==&mid=2247501995&idx=1&sn=902ee4c6515aab8a32b486f73ea8984c&source=41#wechat_redirect
图解MMU
https://zhuanlan.zhihu.com/p/487386274
2 MMU技术总结
2.1 核心概念
- MMU叫内存管理单元,现在是处理器/核中的一个硬件单元,
通常每个核有一个MMU - CPU发出的地址是虚拟地址,MMU通过页表技术,
把虚拟地址转换为物理地址,再去访问物理内存条。 - 虚拟地址到物理地址的转换
- MMU产生的原因:为了解决 20M程序能在4M内存上跑起来
2.2 一级页表
- 如果采用4KB的page大小,cpu发出的虚拟地址包含12bit的页内偏移和20bit的页表VPN
- 2^20=1M
- 2^12=4K
页表每一行表示4K空间,总共1M行,恰好是4K*1M=4GB,所以页表能表示4G空间的寻址- 当CPU访问虚拟地址4KB的时候,MMU会去查上面页表的第1行(
4KB/4KB=1),发现第1行命中 - 一级页表因为一行是32bit, 乘以总行数1M行,因此一级页表大小空间总占用为
32bit*1M=4MB。因此4G空间的寻址Linux就需要4M的存储 - 页表中的每一条叫做页表条目PTE(page table entry),其大小为4个字节
2.3 页表条目PTE(page table entry)
- 任何一个虚拟地址,都可以用地址的高20位(2^20=1M), 再加上页内4K偏移寻址,组合起来就是4G空间
- 以这张页表为例, 当CPU发出的虚拟地址中页表Index是3时,MMU会去查页表的第3行,发现第3行没有命中,MMU会给CPU发出page fault,CPU自动跳到fault的代码去处理fault。当CPU发出的虚拟地址中页表Index是2时,MMU会去查页表的第2行,发现第2行命中了物理地址1124KB,MMU会访问内存条1124KB这个物理地址。
- 操作系统中每个进程都有自己的页表,当CPU在运行某个进程时,MMU的页表地址寄存器中会放置这个进程页表的物理地址,根据这个地址找到此进程的页表,然后根据此表进行地址转换。
- 上面我们已经介绍了每个页表的大小是4MB,覆盖了整个0-4GB的虚拟地址空间。每个进程都占用4M的物理地址,而且这个空间还必须是连续的。那整个操作系统的所有进程光页表就要消耗很大的物理内存。
3 2级页表
- 对于32位地址空间,会将VPN中的前10位用于索引页表目录(一级页表),紧接下来的10位用于索引所选的页表(二级页表)