页目录表基址
前言:页目录表基址的学习笔记
在上一节课课后题中我们提到过,如果系统要保证某个线性地址是有效的,那么必须为其填充正确的PDE与PTE,如果我们想填充PDE与PTE那么必须能够访问PDT与PTT,那么存在2个问题:
1、一定已经有“人”为我们访问PDT与PTT挂好了PDE与PTE,我们只有找到这个线性地址就可以了。
2、这个为我们挂好PDE与PTE的"人"是谁?
怎么理解,其实就是如果一个线性地址想要能够访问,也就是有效的,那么就需要有效的PDE和PTE,因为在保护模式下从线性地址找到物理地址都是通过PDE和PTE最终找到一个对应的物理地址的,但是这里面有个问题就是,谁帮你去生成有效的PDE和PTE呢?答案就是操作系统帮你去生成的,但是又有个问题了,操作系统又是怎么知道PDT和PTT是在哪里的呢?所以这里就引出了一个页目录表基址的知识点。
注意:CR3中存储的是物理地址,不能在程序中直接读取的。如果想读取,也要把Cr3的值挂到PDT和PTT中才能访问,那么怎么通过线性地址访问PDT和PTT呢?
通过C0300000这个线性地址,其中我们可以找到对应的PDT和PTT
练习拆分C0300000
拆分C0300000,如下所示
C0300000
->
1100 0000 00 *4 -> C00
11 0000 0000 *4 -> C00
000
接着通过windbg来进行寻找,如下内容所示,你会发现CR3所指向的地址和最终C0300000的物理地址指向的地方是一样的
PROCESS 86bb6020 SessionId: 0 Cid: 0680 Peb: 7ffde000 ParentCid: 07f8
DirBase: 3ed71000 ObjectTable: e21b54b0 HandleCount: 13.
Image: PDE_PTE.exe
kd> !dd 3ed71000
#3ed71000 3ee5b867 3eeda867 00000000 00000000
#3ed71010 00000000 00000000 00000000 00000000
#3ed71020 00000000 00000000 00000000 00000000
#3ed71030 00000000 00000000 00000000 00000000
#3ed71040 00000000 00000000 00000000 00000000
#3ed71050 00000000 00000000 00000000 00000000
#3ed71060 00000000 00000000 00000000 00000000
#3ed71070 00000000 00000000 00000000 00000000
kd> !dd 3ed71000+C00
#3ed71c00 3ed71863 3eb72863 00000000 06dfe963
#3ed71c10 06dff963 06f00963 06e41963 06e42963
#3ed71c20 06e43963 06e44963 06e45963 06e46963
#3ed71c30 06e47963 06e48963 06e49963 06e4a963
#3ed71c40 06e4b963 06e4c963 06e4d963 06e4e963
#3ed71c50 06e4f963 06e50963 06e51963 06e52963
#3ed71c60 06e53963 06e54963 06e55963 06e56963
#3ed71c70 06e57963 06e58963 06e59963 06e5a963
kd> !dd 3ed71000+C00
#3ed71c00 3ed71863 3eb72863 00000000 06dfe963
#3ed71c10 06dff963 06f00963 06e41963 06e42963
#3ed71c20 06e43963 06e44963 06e45963 06e46963
#3ed71c30 06e47963 06e48963 06e49963 06e4a963
#3ed71c40 06e4b963 06e4c963 06e4d963 06e4e963
#3ed71c50 06e4f963 06e50963 06e51963 06e52963
#3ed71c60 06e53963 06e54963 06e55963 06e56963
#3ed71c70 06e57963 06e58963 06e59963 06e5a963
kd> !dd 3ed71000+0
#3ed71000 3ee5b867 3eeda867 00000000 00000000
#3ed71010 00000000 00000000 00000000 00000000
#3ed71020 00000000 00000000 00000000 00000000
#3ed71030 00000000 00000000 00000000 00000000
#3ed71040 00000000 00000000 00000000 00000000
#3ed71050 00000000 00000000 00000000 00000000
#3ed71060 00000000 00000000 00000000 00000000
#3ed71070 00000000 00000000 00000000 00000000
通过上面的拆分练习,这里可以知道如下几点:
1、你会发现0xC0300000线性地址所指向物理地址就是CR3中所指向的物理地址
2、0xC0300000线性地址所指向的PDT表和PTT表的地址是相同的
接着引出下面这个页目录表基址的概念
页目录表(PDT)基址(XP系统 10-10-12分页模式)
1、通过0xC0300000找到的物理页就是页目录表(PDT)
2、这个0xC0300000线性地址的物理页即是页目录表本身也是页表,也是CR3所指向的位置
3、页目录表PDT是一张特殊的页表PTT(其实PDT也是PTT,因为它其实也是处于页表的映射范围内,只是比较特殊而已),PDT中每一项PTE指向的不是普通的物理页,而是指向其他的页表
4、如果我们要访问第N个PDE,那么有如下公式:0xC0300000 + N*4


浙公网安备 33010602011771号