x64四级分页机制
4级分页
因为硬件限制64位系统只使用64位虚拟地址的低48位,48位虚拟地址被分为9-9-9-9-12,4个9分别表示PML4T,PDPT,PDT,PTT的PFN页帧编号(与物理页帧区分)
PML4T,PDPT,PDT,PTT的每一项都是8个字节,CR3指向的是PML4T(Page Map Level 4 table)4级页映射表。CR3的35-12位为PML4T物理地址的高24位,低12位置零。
PML4E的35-12位为PDPT页目录指针表物理地址的高24位,低12位置0。
当PDPTE的PS位为1时表示启用1GB(2的 9+9+12=30 次方)大物理页,也就是不会有PDE和PTE了,其35-30位(PFN物理页帧)为物理地址的高6位,低30位置0,对应的页内偏移为9+9+12的值。
当PDPTE的PS位为0时表示不启用1GB的大物理页,其35-12位为PDT的物理地址。
当PDE的PS位为1时表示启用2MB(2的 9+12=21 次方)大物理页,也就是不会有PTE了,其35-21位(PFN物理页帧)为物理地址的高15位,低21位置0,对应的页内偏移为9+12的值。
当PDE的PS位为0时表示不启用2MB的大物理页,其35-12位为PTT的物理地址。
当没有启用1GB和2MB的大物理页时,PTB的35-12位为物理内存的起始地址。
4级分页验证
运行代码得到szName字符串的虚拟地址为:0x30F640
char szName[0x100] = "Hello World!";
printf("szName:%x\n", szName);
对64位虚拟地址的低48位进行拆分,得到PML4T,PDPT,PDT,PTT的PFN页面帧编号,以及物理地址偏移。
根据对应的规则找到虚拟地址对应的物理地址。