uEFI虚拟到物理内存翻译

时间:2015-06-12 19:52:24

标签: memory-mapping uefi

我正在尝试使用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,我认为这意味着身份映射,但虚拟和物理地址不排队,所以显然不正确。有人可以向我解释翻译是如何运作的吗?我如何从虚拟变为物理或反之亦然?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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