在Windows内核地址空间中将虚拟地址转换为物理地址

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Windows内核地址空间中将虚拟地址转换为物理地址相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

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

以上是关于在Windows内核地址空间中将虚拟地址转换为物理地址的主要内容,如果未能解决你的问题,请参考以下文章

虚拟地址转换为物理地址

内核虚拟地址转换

Windows地址空间

虚拟地址的高端内存

访问内存时如何通知操作系统内核?

Linux虚拟地址空间分布