!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,因为有些目录基不会以这种方式进行转换。