我正在对 UEFI 进行一些试验,但我无法理解虚拟寻址。
我编写了包含字符串“CatsAreAwesome”的 uefi 应用程序。我让应用程序打印该字符串的虚拟地址。每次执行都会有所不同,因此我将在此坚持一个具体示例。代码显示该字符串位于虚拟地址 0x120ac3c0。如果我暂停 VM 并扫描 vmem 文件,我会在地址 0x1209e410 和 0x12ab000 处找到两个字符串实例
通过在 UEFI 中调用 getmemorymap 我发现这两个属于的内存部分是
TYPE PhysStart PhysEnd VirtStart VirtEnd
EfiConventionalMemory 1209C000 120A4000 0 8000
EfiLoaderCode 120A4000 120B1000 0 D000
我不明白翻译是如何工作的。这两个部分的虚拟开始是 0,我认为这意味着身份映射,但是虚拟地址和物理地址没有对齐,所以这显然是不正确的。有人可以向我解释一下翻译是如何工作的吗?我将如何从虚拟到物理,反之亦然?
我的应用程序打印字符串,并收集内存映射,以便在应用程序运行时收集映射。然后应用程序等待用户输入,在此期间我暂停了虚拟机,因此在应用程序运行时找到了物理地址。