将虚拟地址转换为 Windows 内核地址 space 中的物理地址
Translating virtual address to physical address in Windows kernel address space
Windows x64 上的内核 space 虚拟地址 (VA > 0xFFFF000000000000
) 如何将虚拟地址转换为物理地址?
我知道用户 space 虚拟地址的工作原理:VA 由多个 table 中的多个索引组成,第一个 (PML4) 位于存储在中的物理地址CR3
注册(在 WinDbg 中进程 DirectoryTableBase
又名 "DirBase")。我想这对于内核 space VA 来说是相似的,但是他们的 PML4 table 在哪里?
我的目标是在不依赖 DbgEng/WinDbg API 的情况下解析内核故障转储。我已经能够分辨出每个内存页在文件中的位置,但转储文件中的大多数字段都以内核 space VA 表示。该文件头中的 DirectoryTableBase
字段与触发崩溃的用户 space 进程有关,因此它没有帮助。
回答我自己的问题:每个(用户 space)进程的 PML4 table 确实包含内核 space VA 的映射。这很好 counter-intuitive,因为它意味着 OS 在添加或删除高级 VA 范围时必须更新每个进程的 PML4 table。
附带说明一下,如果您打算自己实现 VA 到 PA 的转换,请考虑 x64 上虚拟页面的大小可以是 4 KB、2 MB 或 1 GB。我忘记了,这就是为什么我被卡住了并问了这个问题 -_-
Windows x64 上的内核 space 虚拟地址 (VA > 0xFFFF000000000000
) 如何将虚拟地址转换为物理地址?
我知道用户 space 虚拟地址的工作原理:VA 由多个 table 中的多个索引组成,第一个 (PML4) 位于存储在中的物理地址CR3
注册(在 WinDbg 中进程 DirectoryTableBase
又名 "DirBase")。我想这对于内核 space VA 来说是相似的,但是他们的 PML4 table 在哪里?
我的目标是在不依赖 DbgEng/WinDbg API 的情况下解析内核故障转储。我已经能够分辨出每个内存页在文件中的位置,但转储文件中的大多数字段都以内核 space VA 表示。该文件头中的 DirectoryTableBase
字段与触发崩溃的用户 space 进程有关,因此它没有帮助。
回答我自己的问题:每个(用户 space)进程的 PML4 table 确实包含内核 space VA 的映射。这很好 counter-intuitive,因为它意味着 OS 在添加或删除高级 VA 范围时必须更新每个进程的 PML4 table。
附带说明一下,如果您打算自己实现 VA 到 PA 的转换,请考虑 x64 上虚拟页面的大小可以是 4 KB、2 MB 或 1 GB。我忘记了,这就是为什么我被卡住了并问了这个问题 -_-