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。