x64内核实验3-页机制的研究(1)
CR4寄存器
在白皮书的第三卷2.5章对控制寄存器有详细的介绍,下面是白皮书中CR寄存器的结构图(这里要说明一下cr4的第12位是由被使用的这个位在2.5章的后半部分有介绍是控制是否开启5级分页的位否则是四级分页)

首先是smep和smap两个位,这部分因为之前的实验会用到所以已经在段机制的部分介绍过了,这里就不再赘述
其余一些位置的功能后面用到了会继续介绍,这边有个结构的概念就可以了
64位下分页机制的变化
下面我们来梳理一下64位cpu中分页机制的变化过程:
- 在64位内核中因为物理地址范围扩充到了48位所以页表也因此扩充了,首先大家思考一下我们现在是有64位的虚拟地址可以用还按照4k分页的话那么我们的虚拟地址中就要留出12位来作为4k物理页中的寻址
- 其次我们还剩下了48位可以用,101012分页不知道大家还记得不,在32位的2级分页中我们是ptt和pdt中存放了1024个物理地址指向pte和pde,现在我们的物理地址位数增加到了64那么我们的一个页表里就只能存放512个页表项了,所以我们不在需要10位来寻址1024个页表项而是需要9位来寻址512个页表项
- 然后我们还需要考虑到现在的64位下真正的地址线是有48根的那么我们真正的寻址范围是48位也就是512g我们现在用掉了12位那么就还剩下36位,每一级页表需要9位那么最终的分页机制就是9-9-9-9-12的四级分页(当然这只是我的理解,64位cpu还支持5级分页只是带上自己的思考能够更好的帮助自己理解分页机制的原理)
然后我们看一下白皮书里对目前分页机制的一个图表介绍,如下:第一个图是32位下的三级分页机制2-9-9-12,第二个图是64位的四级分页(这边贴上三级分页希望能更好的帮助看文章的各位对照着32位下的pae模式来理解四级分页)


简单的讲一下上面这张图
图里的第一行是CR3的描述
第二行PML5E是五级分页才会用到的这里不多赘述五级分页因为我还没有碰到五级分页的操作系统
第三行的PML4E是一级页表项当p=1时说明当前页表项有效否则是无效
第四行的PDPTE是二级页表项,当p=1时有效而且ps位=1的时候是1G的大页(第7位)1G的话大家可以拆分一下看看1G需要的页内寻址偏移为30位,我们的虚拟地址到拆分到二级的时候使用掉了18位正好剩下30位意味着我们的分页变为了9-9-30,如果ps=0的话就还按照9-9-9-9-12分页
第五行的PDE是三级页表项,当p=1时有效而且ps位=1的时候是2MB的大页(第7位)2MB的话大家可以拆分一下看看2MB需要的页内寻址偏移为21位,我们的虚拟地址到拆分到三级的时候使用掉了27位正好剩下30位意味着我们的分页变为了9-9-9-21,如果ps=0的话就还按照9-9-9-9-12分页
第六行的PTE是二级页表项目当p=1时有效
图中在4级以及以上的位置使用了PMLXE的描述方式,后面的则跟2-9-9-12时候的命名一样我觉得可能记起来比较麻烦所以就按照页表的级别来描述几级就是几级页表里面的项就是X级页表项这种叫法
下面我们来拆分一个虚拟地址看一下
fffff803`45299fc0 00209b00`00000000 00409300`00000000
0: kd> r cr3
cr3=00000000001aa000
这是我环境中的GDT表中的一项,我的cr3是=00000000001aa000,下面让我门来拆一下
11111111 11111111 11111000 00000011 01000101 00101001 10011111 10110000
上面是拆成二进制的形式
高16位不关注:fffff
1级页表偏移:11111000 0 -- 1f0
2级页表偏移:0000011 01 -- 0d
3级页表偏移:000101 001 -- 29
4级页表偏移:01001 1001 -- 99
页内偏移:fc0
kd> !dq 00000000001aa000 + 1f0 * 8
# 1aaf80 00000000`05209063 00000000`00000000
# 1aaf90 00000000`00000000 00000000`00000000
# 1aafa0 00000000`00000000 00000000`00000000
# 1aafb0 00000000`00000000 00000000`00000000
# 1aafc0 00000000`00000000 00000000`00000000
# 1aafd0 00000000`00000000 00000000`00000000
# 1aafe0 00000000`00000000 00000000`00000000
# 1aaff0 00000000`00000000 00000000`05123063
0: kd> !dq 00000000`05209000 + d * 8
# 5209068 00000000`05215063 0a000000`33a85863
# 5209078 0a000001`0ed50863 0a000000`88607863
# 5209088 00000000`00000000 00000000`00000000
# 520

本文围绕x64内核实验3,聚焦页机制研究。介绍了CR4寄存器,提及smep和smap位此前已在段机制部分介绍。阐述64位CPU中分页机制的变化,如物理地址范围扩充使页表改变,分析了四级分页和大页情况,还给出虚拟地址拆分实验及代码。
&spm=1001.2101.3001.5002&articleId=133580078&d=1&t=3&u=bad4c6a436d44628bb07cd6cf8c158ed)
2315

被折叠的 条评论
为什么被折叠?



