【问题标题】:Translating virtual address to physical address in Windows kernel address space在 Windows 内核地址空间中将虚拟地址转换为物理地址
【发布时间】:2018-08-12 16:24:40
【问题描述】:

对于 Windows x64 上的内核空间虚拟地址 (VA > 0xFFFF000000000000),从虚拟地址到物理地址的转换如何工作?

我知道它如何用于用户空间虚拟地址:VA 由多个表中的多个索引组成,第一个 (PML4) 位于存储在CR3 寄存器中的物理地址(以及进程DirectoryTableBase在 WinDbg 中又称为“DirBase”)。我猜这对于内核空间 VA 来说是类似的,但是它们的 PML4 表在哪里呢?

我的目标是在不依赖 DbgEng/WinDbg API 的情况下解析内核故障转储。我已经能够分辨出每个内存页面在文件中的位置,但是转储文件中的大多数字段都以内核空间 VA 表示。该文件头中的DirectoryTableBase字段与触发崩溃的用户空间进程有关,因此没有帮助。

【问题讨论】:

  • “没有 DbgEng API” - 为什么?
  • @ThomasWeller 对于性能、好奇心和便携性。特别是,使用 SearchVirtual() 比在转储文件中搜索并将文件偏移量转换为物理/虚拟地址要慢。

标签: windows kernel 64-bit windbg virtual-address-space


【解决方案1】:

回答我自己的问题:每个(用户空间)进程的 PML4 表确实包含内核空间 VA 的映射。这非常违反直觉,因为这意味着操作系统在添加或删除高级 VA 范围时必须更新每个进程的 PML4 表。

附带说明,如果您打算自行实现 VA 到 PA 的转换,请考虑 x64 上的虚拟页面大小可以是 4 KB、2 MB 或 1 GB。我忘记了,这就是为什么我被卡住并问了这个问题-_-

【讨论】:

    猜你喜欢
    • 2020-04-16
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 2018-12-04
    • 1970-01-01
    • 2017-07-07
    相关资源
    最近更新 更多