Linux是几级页表?
地址:逻辑地址 --(段表)–> 线性地址 --(页表)–> 物理地址
页表的启用,体现在线性地址上,若启用页表,要完成线性地址和物理地址的转化;逻辑地址到线性地址,就是取低48位,64位中用于寻址的,实际只用了48位。
先看下系统的页表大小:
root@hw2:~# getconf PAGE_SIZE
4096
Linux的页表分配是根据cpu来设计的,不同平台(cpu)分页不同,这里考虑x86平台:
平台 | linux页表 | 地址分配 | 可表示大小 |
---|---|---|---|
x86 | 二级页表 | 10,10,12=32 | 4GB |
x86_amd | 四级页表 | 9,9,9,9,12=48(线性地址) | 256TB |
intel 48物理地址划分:
对应是:
单元 | 描述 |
---|---|
页全局目录 | Page Global Directory |
页上级目录 | Page Upper Directory |
页中间目录 | Page Middle Directory |
页表 | Page Table |
页内偏移 | Page Offset |
Linux把计算机分成独立层/依赖层两个层次,对于页面的映射和管理也是;linux从最初的2级页表,到3级页表(x86支持物理地址扩展),再到4级页表(64cpu)。
总结来说:页表大小位4KB,所以页内地址需要12位,虚拟地址64位,需要8B,那一页最多存储4KB/8B=2^9,即一级页表占用9位,intel x86_64平台使用48位物理地址,剩余的48-32=9x4可以构成四级页表,48位物理地址可以表示多大的内存空间,2^48B=256TB,此外,x86系列是向后兼容的,为什么是4级页表?因为linux一路从2级页表、3级页表,再到当前的4级页表,满足当前需要,若未来那天不够用了,当然会扩展出更大的。
参考: