页表基址
前言:页表基址的学习笔记
页表(PTT)基址
上面学习了页目录表基址,也就是说通过0xC0300000这个线性地址可以访问一张表,这张表就是页目录表,有了这个地址,我们可以任意修改页目录表。
但如果我们要设置某个线性地址PDE和PTE那么还要能够访问PTT,如何访问呢?这里继续来学习页表(PTT)的基址
通过页目录基址0xC0300000来找到的物理页,这个地方其实就是PDT表,其实也就是CR3,到这里都应该是可以接受的
kd> !dd 30476000+0
#30476000 328a6867 33a65867 00000000 00000000
#30476010 00000000 00000000 00000000 00000000
#30476020 00000000 00000000 00000000 00000000
#30476030 00000000 00000000 00000000 00000000
#30476040 00000000 00000000 00000000 00000000
#30476050 00000000 00000000 00000000 00000000
#30476060 00000000 00000000 00000000 00000000
#30476070 00000000 00000000 00000000 00000000

那么这里来打印下索引为0和1的PDE的结构,那么也就是上面其中的0x328a6867,0x33a65867,如下图所示
!dd 328a6000和!dd 33a65000,如下图所示
kd> !dd 328a6000
#328a6000 00000000 00000000 00000000 00000000
#328a6010 00000000 00000000 00000000 00000000
#328a6020 00000000 00000000 00000000 00000000
#328a6030 00000000 00000000 00000000 00000000
#328a6040 319a7867 341a8867 00000000 00000000
#328a6050 00000000 00000000 00000000 00000000
#328a6060 00000000 00000000 00000000 00000000
#328a6070 00000000 00000000 00000000 00000000
kd> !dd 33a65000
#33a65000 1f062025 24dc0025 1bd5c025 17c5d025
#33a65010 1c85e025 1d2df025 1d420025 1da61025
#33a65020 1db62025 00000000 00000000 1c323025
#33a65030 1e764025 33381025 00000000 00000000
#33a65040 00000000 00000000 00000000 00000000
#33a65050 00000000 00000000 00000000 00000000
#33a65060 00000000 00000000 00000000 00000000

接下来练习拆分C0000000
练习拆分C0000000 / C0001000
首先拆分C0000000
C0000000
->
1100 0000 00 *4 -> C00
00 0000 0000 -> 0
000 -> 0
结果如下
kd> !dd 30476000+C00
#30476c00 30476863 320f7863 00000000 06dfe963
#30476c10 06dff963 06f00963 06e41963 06e42963
#30476c20 06e43963 06e44963 06e45963 06e46963
#30476c30 06e47963 06e48963 06e49963 06e4a963
#30476c40 06e4b963 06e4c963 06e4d963 06e4e963
#30476c50 06e4f963 06e50963 06e51963 06e52963
#30476c60 06e53963 06e54963 06e55963 06e56963
#30476c70 06e57963 06e58963 06e59963 06e5a963
kd> !dd 30476000+0
#30476000 328a6867 33a65867 00000000 00000000
#30476010 00000000 00000000 00000000 00000000
#30476020 00000000 00000000 00000000 00000000
#30476030 00000000 00000000 00000000 00000000
#30476040 00000000 00000000 00000000 00000000
#30476050 00000000 00000000 00000000 00000000
#30476060 00000000 00000000 00000000 00000000
#30476070 00000000 00000000 00000000 00000000
kd> !dd 328a6000
#328a6000 00000000 00000000 00000000 00000000
#328a6010 00000000 00000000 00000000 00000000
#328a6020 00000000 00000000 00000000 00000000
#328a6030 00000000 00000000 00000000 00000000
#328a6040 319a7867 341a8867 00000000 00000000
#328a6050 00000000 00000000 00000000 00000000
#328a6060 00000000 00000000 00000000 00000000
#328a6070 00000000 00000000 00000000 00000000

接着拆分C0001000
C0001000
->
1100 0000 00 *4 ->C00
00 0000 0001 *4 ->4
000
kd> !dd 30476000+C00
#30476c00 30476863 320f7863 00000000 06dfe963
#30476c10 06dff963 06f00963 06e41963 06e42963
#30476c20 06e43963 06e44963 06e45963 06e46963
#30476c30 06e47963 06e48963 06e49963 06e4a963
#30476c40 06e4b963 06e4c963 06e4d963 06e4e963
#30476c50 06e4f963 06e50963 06e51963 06e52963
#30476c60 06e53963 06e54963 06e55963 06e56963
#30476c70 06e57963 06e58963 06e59963 06e5a963
kd> !dd 30476000+4
#30476004 33a65867 00000000 00000000 00000000
#30476014 00000000 00000000 00000000 00000000
#30476024 00000000 00000000 00000000 00000000
#30476034 00000000 00000000 00000000 00000000
#30476044 00000000 00000000 00000000 00000000
#30476054 00000000 00000000 00000000 00000000
#30476064 00000000 00000000 00000000 00000000
#30476074 00000000 00000000 00000000 00000000
kd> !dd 33a65000+0
#33a65000 1f062025 24dc0025 1bd5c025 17c5d025
#33a65010 1c85e025 1d2df025 1d420025 1da61025
#33a65020 1db62025 00000000 00000000 1c323025
#33a65030 1e764025 33381025 00000000 00000000
#33a65040 00000000 00000000 00000000 00000000
#33a65050 00000000 00000000 00000000 00000000
#33a65060 00000000 00000000 00000000 00000000
#33a65070 00000000 00000000 00000000 00000000

然后你通过上面的!dd 328a6000和!dd 33a65000 来进行比较下,你会发现这个 C0000000的物理地址和!dd 328a6000是一样的,然后C0100000的物理地址和!dd 33a65000是一样的
所以到这里我们就知道了不需要依赖物理地址CR3,直接通过线性地址去找到相关的PDT的PDE和PTT的PTE的地址
这里还有一个问题,为什么之间C0000000和C0001000之间相差0x1000呢?原因就是PDT表中有1024个PDE,PTT表中有1024个PTE,而一个物理页大小是4096,那么相差一个PTE,一个PTE所指向的物理页的大小就是4096,那么也就是0x1000
掌握了这两个地址0xC0300000和0xC0000000,就掌握了一个进程所有的物理内存读写权限。
公式总结:
1、访问页目录表中第PDI个PDE的公式:0xC0300000 + PDI*4
2、访问页表中第PDI个PDE中的第PTI个PTE公式:0xC0000000 + PDI*4096 + PTI*4
知识点:
PDI:就是在10-10-12分页模式中的PDE的索引
PTI:就是在10-10-12分页模式中的PTI的索引

浙公网安备 33010602011771号