!vtop
!vtop 扩展可将虚拟地址转换为相应的物理地址,并显示其他页表和页目录信息。
语法
!vtop PFN VirtualAddress
!vtop 0 VirtualAddress
参数
DirBase
指定进程的目录基。 每个进程都有其自己的虚拟地址空间。 使用 !process 扩展来确定进程的目录基。
PFN
指定进程目录基的页框号 (PFN)。
0
导致 !vtop 使用当前流程上下文来进行地址转换。
VirtualAddress
指定需要其页面的虚拟地址。
DLL
Kdexts.dll
其他信息
有关实现这些结果的其他方法,请参阅将虚拟地址转换为物理地址。 另请参阅 !ptov。 有关页表和页目录的信息,请参阅 Mark Russinovich 和 David Solomon 编写的 Microsoft Windows 内部资料。
注解
要使用此命令,请先使用 !process 扩展来确定进程的目录基。 去掉后面的三个十六进制零(换言之,右移 12 位数字),即可找到该目录基的页框号 (PFN)。
以下是示例:
kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
....
PROCESS ff779190 SessionId: 0 Cid: 04fc Peb: 7ffdf000 ParentCid: 0394
DirBase: 098fd000 ObjectTable: e1646b30 TableSize: 8.
Image: MyApp.exe
由于目录基为 0x098FD000,因此其 PFN 为 0x098FD。
kd> !vtop 98fd 12f980
Pdi 0 Pti 12f
0012f980 09de9000 pfn(09de9)
注意后面的三个零为可选。 !vtop 扩展会显示页目录索引 (PDI)、页表索引 (PTI)、最初输入的虚拟地址、物理页的起始物理地址以及页表条目 (PTE) 的页框号 (PFN)。
如果要将虚拟地址 0x0012F980 转换为物理地址,只需将最后三位十六进制数字 (0x980) 添加到页面开头的物理地址 (0x09DE9000)。 这样会让物理地址变为 0x09DE9980。
如果忘记去掉三个零,并将完整的目录基传递给 !vtop 而不是 PFN,结果通常是正确的。 这是因为当 !vtop 收到一个大到无法成为 PFN 的数字时,它会右移十二位并使用以下数字:
kd> !vtop 98fd 12f980
Pdi 0 Pti 12f
0012f980 09de9000 pfn(09de9)
kd> !vtop 98fd000 12f980
Pdi 0 Pti 12f
0012f980 09de9000 pfn(09de9)
但是,最好始终使用 PFN,因为有些目录基不会以这种方式进行转换。