在Windows x64上,从虚拟地址到物理地址的转换如何适用于内核空间虚拟地址(VA> 0xFFFF000000000000
)?
我知道用户空间虚拟地址是如何工作的:VA由多个表中的多个索引组成,第一个(PML4)位于存储在CR3
寄存器中的物理地址(和进程{ {1}}在WinDbg中也称为“DirBase”。我猜这对于内核空间VA来说是类似的,但那么它们的PML4表在哪里呢?
我的目标是解析内核崩溃转储,而不依赖于DbgEng / WinDbg API。我已经能够分辨文件中每个内存页面的位置,但转储文件中的大多数字段都以内核空间VA表示。该文件头中的DirectoryTableBase
字段与触发崩溃的用户空间进程相关,因此无效。
答案 0 :(得分:2)
回答我自己的问题:每个(用户空间)进程的PML4表确实包含内核空间VA的映射。这非常违反直觉,因为这意味着操作系统在添加或删除高级别VA范围时必须更新每个进程的PML4表。
另外,如果您打算自行实施VA到PA转换,请考虑x64上的虚拟页面大小可以是4 KB,2 MB或1 GB。我忘了它,这就是为什么我被卡住并问这个问题-_-