2016-12-09
近期想查看下系统分配了的页的页表项的标志位,但是发现资料较少,所以还是记录下,希望可以对某些朋友有所帮助!
系统:win7 32位虚拟机
平台:KVM虚拟化平台
win7 32位默认是开启了PAE分页模式的,PAE分页模式本质上和普通的32位分页并无区别,只是页表结构和虚拟地址的划分有所不同,这点就不单独讲述,感兴趣可参考另一篇博文:PAE 分页模式详解
首先写了一件简单的内核NT驱动,分配了一个页的内存,然后写入数据0xa1b2c3d4
加载驱动:
看到申请的内存的地址是0x85d55000,我们直接看下这块内存:
确实是我们写入的数据,然后开始查看页表,首先获取的是页表基地址,我们通过当前进程查看:
可以看到页基址是7ee47400,这正是当前CR3寄存器保存的页基址,该地址指向一个页目录指针表(page-directory-pointer-table),需要注意的是该表一共有4个表项,每个表项八个字节,并且在PAE模式下,地址转换不直接使用CR3寄存器,而是第一级的页目录指针分配了四个PDPTE寄存器,每个保存一个页目录指针,但是也目录指针寄存器的值却是来源于CR3指向的页目录指针表。所以我们仍然可以直接利用CR3来寻址。
我们先分解下目标虚拟地址:
按照 结构分成四部分:10 000101110 101010101 000000000000,对应16进制:0x2 0x2e 0x155 0x0
查看7ee47400内容,由于表项是8字节,所以使用dq(大小端模式问题)
根据虚拟地址,知道该地址对应表中第三项,即图中标记的表项,取物理页框号+偏移得:4595b000+0x2e*8=4595b170
查看该地址:
对应的表项内容为05e07863,同样取物理页框号+偏移得:05e07000+0x155*8=05e07aa8
查看地址内容:
得到表项内容为7fe95963 ,这个就是这个就是最终的PTE了,即指向一个4KB 页面,物理页框号为7fe95000,而由于我们是申请的就是一个页,即页内偏移为0,所以这里同样也是我们虚拟地址对应的物理地址
查看内容:
至此,整个查表过程就完成了。