PDE、PTE在Windows2000下的情况

CR3为PDE表的指针(物理地址),对于不同的进程CR3数值是不同的,但对应的虚拟地址恒为C0300000(在XP下是C0600000)。

实验:查看0x80000000虚拟地址所对应的物理地址。
查看
kd> dd /p cr3+800 (通过物理内存查看)
或者
kd> dd c0300000+800(通过对应的虚拟内存查看)
c0300800  000001e3 004001e3 008001e3 00c001e3
c0300810  010001e3 014001e3 018001e3 01c001e3
c0300820  020001e3 024001e3 028001e3 02c001e3
c0300830  030001e3 034001e3 038001e3 03c001e3
c0300840  040001e3 044001e3 048001e3 04c001e3
c0300850  050001e3 054001e3 058001e3 05c001e3
c0300860  060001e3 064001e3 068001e3 06c001e3
c0300870  070001e3 074001e3 078001e3 07c001e3
发现都是以1e3结尾,例如000001e3,其中第7bit为1,代表分页按照4MB。
也就是说虚拟地址从0x80000000~0xA0000000-1,都是按照4MB分页,且映射到虚拟地址为0~0x20000000-1。
物理内存的前512MB被映射到0x80000000~0x9FFFFFFF

另外,还可以使用!pte查看虚拟内存。
kd> !pte 80000000
80000000  - PDE at C0300800        PTE at C0200000
          contains 000001E3      contains 00000000
        pfn 0 GLDA--KWV       LARGE PAGE

总结以上,得出以下结论:
1. Windows会创建一个4MB大小的PTE表,查看虚拟内存时,只需查看这个表即可,这个表位于0xC0000000(在XP下还是如此)。例如0x12345678这个虚拟内存地址,就可以查看虚拟地址0x12345*4+0xC0000000,这里的基地址为一个物理地址,然后加上12345678中的偏移678即可。
2.PDE表对应的虚拟地址为C0300000
3.物理内存的前512MB被映射到0x80000000~0x9FFFFFFF(在WindowsXP后不再满足这个)。

上面的情况都是针对不开启PAE,最后说一点开启PAE情况下的情况
想知道虚拟地址804fe000对应的物理地址。
(1)最简单的用!pte命令:
kd> !pte 804fe000
               VA 804fe000
PDE at 00000000C0602010    PTE at 00000000C04027F0
contains 000000000034C163  contains 00000000004FE121
pfn 34c -G-DA--KWEV    pfn 4fe -G--A—KREV

804fe000的高10位0x201,每个PDE占用16个字节。0x201*16=0x2010。
804fe000的高20位0x804fe,每个PTE占用8个字节。0x804fe*8=0x4027F0。

posted @ 2010-03-25 11:43  Fan Zhang  阅读(748)  评论(0编辑  收藏  举报