Debugging Tools for Windows |
!pte扩展显示指定地址的页表项(page table entry (PTE))和页目录项(page directory entry (PDE))。
Windows 2000的语法
!pte PTE
!pte LiteralAddress 1
!pte StartAddress EndAddress
Windows XP和之后的语法
!pte PTE
!pte LiteralAddress 1
Windows 2000 | Kdextx86.dll |
Windows XP和之后 | Kdexts.dll |
如果指定了一个参数,并且该参数是一个用于保存页表的内存区域中的地址,那么调试器将它当作一个PTE参数。该参数被当作要查看的PTE的实际地址,调试器会显示该PTE以及相应的PDE。
如果指定的参数不在这个范围内,调试器把它当作VirtualAddress。会显示用于映射这个地址的PTE和PDE。
如果指定了两个参数,并且第二个参数是1 (或者更小的数字),调试器将第一个参数当作LiteralAddress。这个地址会被当作PTE或者PDE的实际地址,并且显示相应的数据(可能是错误的)。
(仅x86 或x64目标机) 如果提供了两个参数,并且第二个参数比第一个大,调试器将它们当作StartAddress和EndAddress。命令会显示指定的内存范围中每个页面的PTE。
使用!sysptes扩展命令查看所有系统PTE的列表。
下面是x86目标机上的示例:
801544F4 - PDE at C0300800 PTE at C0200550
contains 0003B163 contains 00154121
pfn 3b G-DA--KWV pfn 154 G--A--KRV
输出的第一行会再次显示被查看的虚拟地址。然后是包含该地址内存映射(virtual-physical mapping)信息的PDE和PTE的虚拟地址。
第二行是PDE和PTE的实际内容。
第三行是对这些内容的分析,将它们分解成页面帧序号(PFN)和状态位(status bits)。
查看!pfn扩展命令或者将虚拟地址转换成物理地址小节来获得如何理解和使用PFN的信息。
在x86和x64目标机上,PDE和PTE的状态位在下表中列出。!pte的显示会用大写字母或者虚线来表示这些位,并且还添加其他信息。
位 | 设置时的显示 | 清除时的显示 | 意义 |
---|---|---|---|
0x200 | C | - | 写时复制(Copy on write) |
0x100 | G | - | 全局页面(Global) |
0x80 | L | - | 大页面(Large page)。只有PDE有,PTE中没有。 |
0x40 | D | - | 脏页面(Dirty) |
0x20 | A | - | 已访问(Accessed) |
0x10 | N | - | 禁止缓存(Cache disabled) |
0x8 | T | - | 通写(Write-through) |
0x4 | U | K | 所有者(用户模式或内核模式)。 |
0x2 | W | R | 可写或者只读。只有在多处理器计算机和任何运行Windows Vista和之后系统的机器上有。 |
0x1 | V | 有效位(Valid) | |
E | - | 可执行页面。对于包括很多x86系统在内的不支持硬件执行/非执行标志位的平台,总是显示E。 |
在Itanium目标机上,PDE和PTE的状态位和PPE中有少许不同。Itanium PPE位有下面这些:
设置时的显示 | 清除时的显示 | 意义 |
---|---|---|
V | 有效位(Valid) | |
U | K | 所有者(用户模式或内核模式)。 |
D | - | 脏页面(Dirty) |
A | - | 已访问(Accessed) |
W | R | 可写或者只读。只有在多处理器计算机和任何运行Windows Vista和之后系统的机器上有。 |
E | - | 执行(Execute) |
C | - | 写时复制(Copy on write) |
关于页表、页目录和这些状态位的说明,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。