!pte命令

初学windows分页分段机制,!pte命令是最常用的,PDE和PTE的默认值0xC0600000和0xC0000000很容易让人迷惑。有个朋友跟我吐槽说经常搞混这两个值和虚拟地址转物理地址过程。这里简单说一下。

这两个所谓的默认值指的是进程PDE和PTE所在的虚拟地址,注意不是物理地址。0xC0600000表示页目录的起始加载地址,0xC0000000表示页表起始加载地址。

可以使用0xC0000000结合线性地址直接算出页帧号,以30004为例:


kd> !pte 30004
                    VA 00030004
PDE at C0600000            PTE at C0000180
contains 000000001A1E2067  contains 0000000007724067
pfn 1a1e2     
---DA--UWEV  pfn 7724      
---DA--UWEV

kd> dd 30004 l8
00030004  000001de eeffeeff 00001002 00000000
00030014  0000fe00 00100000 00002000 00000200

kd> !dd 7724004 l8
# 7724004 000001de eeffeeff 00001002 00000000
# 7724014 0000fe00 00100000 00002000 00000200

kd> dd C0000000+(0*1000)+(30*8) l1
c0000180  07724067


好了,看了这些应该明白了。