有问题!windbg中的vtop,用于使用来自CR3的页表地址将虚拟地址转换为物理地址



我研究了Windows内核和windbg(一路上(。我在msdn上找到了!vtop命令,它将当前上下文的虚拟地址转换为物理地址。我想欣赏这支球队的表现。

我的行动:

  1. 我将CR3寄存器作为指向当前任务的PML4表的物理指针-38f9d002
  2. 从当前的任务中,我取了一个虚拟地址来转换为物理地址-7ff61afa0000
  3. 我在WinDbg中输入命令:!vtop 38f9d002 7ff61afa0000。结果,我得到了如下描述的错误:Virtual address 7ff61afa0000 translation fails, error 0xD0000147

WinDbg:的完整列表

!vtop 38f9d002 7ff61afa0000
Amd64VtoP: Virt 00007ff61afa0000, pagedir 0000000038f9d002
Amd64VtoP: PML4E 0000000038f9d7fa
Amd64VtoP: pagefile PDPE 0:0000000008a00ec0
Amd64VtoP: PML4E not present, 0xD0000147
Virtual address 7ff61afa0000 translation fails, error 0xD0000147.

请告诉我我在哪里搞砸了,错误代码通常意味着什么-0xD0000147,也(如果可能的话(请发送一个链接到源代码,在那里我可以详细了解这些代码。

我不知道WinDBG,但假设虚拟地址当前有效,它可能不会为您屏蔽CR3底部的进程上下文ID位,所以自己将低3个十六进制数字清零

OP报告38f9d000确实作为PML4地址工作。

实际的PML4必须是4k对齐的,因此物理地址的低12位将为零;CR3的低12位是特殊的,实际上不是地址位,而是标志或其他字段。(如果在另一个控制寄存器中启用了PCID,则与PCID类似。(
https://wiki.osdev.org/CPU_Registers_x86-64#CR3显示了故障。

最新更新