我正在尝试使用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,因此在应用程序运行时找到了物理地址。
答案 0 :(得分:1)
查看EDK2代码,似乎VirtualStart
始终设置为零,直到调用SetVirtualAddressMap
运行时服务函数。
答案 1 :(得分:1)
在引导服务期间,UEFI及其应用程序始终运行身份映射。 UEFI不运行地址转换,但允许已驻留的位在外部代理分配给它们的虚拟地址处运行。
成功调用ExitBootServices()
后,您可以调用SetVirtualAddressMap()
重新应用重定位并使代码可以在给定的虚拟地址运行。此预期用例是在操作系统上下文中提供运行时服务。