(21)页目录表,页表基址(XP系统 10-10-12分页模式)

一、页目录表PDT基址0xc0300000

随便打开一个程序,如notepad.exe,在windbg中查看CR3=0ddb5000
!dd 0ddb5000 就能查看到PDT表的基址。

(21)页目录表,页表基址(XP系统 10-10-12分页模式)

接下来,拆分0xc0300000
‭11000000001100000000000000000000‬
‭1100000000 0x300
1100000000 0x300
000000000000‬ 0x0
找0xc0300000的物理页

查PDE
!dd 0ddb5000+300*4
PDE = 0ddb5063

查PTE
!dd 0ddb5000+300*4
PTE = 0ddb5063

查物理地址
!dd 0ddb5000+0

结果如下,结论正确:

(21)页目录表,页表基址(XP系统 10-10-12分页模式)

二、PDT PTT 的关系

(21)页目录表,页表基址(XP系统 10-10-12分页模式)

通过刚才的实验,我们还可以得出一个结论,PDT和PTT其实是同一个地址。还记得之前我们学习的二级映射结构图吗?

(21)页目录表,页表基址(XP系统 10-10-12分页模式)

这张图是为了方便初学者理解而画的,实际上应该是这样的:

(21)页目录表,页表基址(XP系统 10-10-12分页模式)

所以,实际上PDT就是PTT,只不过它比较特殊,别的PTT指向物理页,而它指向其他PTT。

总结:
1、通过0xC0300000找到的物理页就是页目录表
2、这个物理页即是页目录表本身也是页表
3、页目录表是一张特殊的页表,每一项PTE指向的不是普通的物理页,而是指向其他的页表.
4、如果我们要访问第N个PDE,那么有如下公式:
0xC0300000 + N*4

三、页表PTT基址0xc0000000

线性地址 0xc0000000 指向了第一张页表,如下图:
(21)页目录表,页表基址(XP系统 10-10-12分页模式)

接下来,拆分0xc0000000和0xc0001000,验证这两个线性地址是不是前两张PTT表。
首先,用CR3找到PDT表,前两个PDE就是前两张PTT表的物理地址。
CR3=0ddb5000
(21)页目录表,页表基址(XP系统 10-10-12分页模式)

拆分 0xc0000000
‭1100000000 300
0000000000 0
000000000000‬ 0

查PDE
!dd 0ddb5000+300*4
PDE=0ddb5063

查PTE
!dd 0ddb5000+0

验证正确,线性地址 0xC0000000 指向第一张PTT表。
(21)页目录表,页表基址(XP系统 10-10-12分页模式)

拆分 0xc0001000
‭1100000000 300
0000000001 1
000000000000‬ 0

查PDE
!dd 0ddb5000+300*4
PDE=0ddb5063

查PTE
!dd 0ddb5000+1*4

验证成功。
(21)页目录表,页表基址(XP系统 10-10-12分页模式)

总结:
1、页表被映射到了从0xC0000000到0xC03FFFFF的4M地址空间
2、在这1024个表中有一张特殊的表:页目录表
3、页目录被映射到了0xC0300000开始处的4K地址空间

四、总结

(21)页目录表,页表基址(XP系统 10-10-12分页模式)

线性地址 0xC0300000 是PDT表基址;
线性地址 0xC0000000 是第一张PTT表的基址。

引入概念 PDI:PDT表的下标,PTI:PTT表的下标,这两个值就是10-10-12拆分得两个10位。

访问页目录表的公式:
0xC0300000 + PDI*4

访问页表的公式:
0xC0000000 + PDI4096 + PTI4

通过页目录表基址和页表基址,可以修改一个进程里所有物理内存的权限。