1

我正在对 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,我认为这意味着身份映射,但是虚拟地址和物理地址没有对齐,所以这显然是不正确的。有人可以向我解释一下翻译是如何工作的吗?我将如何从虚拟到物理,反之亦然?

我的应用程序打印字符串,并收集内存映射,以便在应用程序运行时收集映射。然后应用程序等待用户输入,在此期间我暂停了虚拟机,因此在应用程序运行时找到了物理地址。

4

2 回答 2

1

查看 EDK2 代码,在调用运行时服务函数之前,它似乎VirtualStart始终设置为零。SetVirtualAddressMap

于 2015-06-15T05:35:23.387 回答
1

在引导服务期间,UEFI 及其应用程序始终运行标识映射。UEFI 不运行地址转换,但允许已驻留的位在外部代理分配给它们的虚拟地址上运行。

成功调用 后ExitBootServices(),您可以调用SetVirtualAddressMap()以重新应用重定位并使代码可以在给定的虚拟地址上运行。预期的用例是在操作系统上下文中提供运行时服务。

于 2015-06-15T15:29:53.117 回答