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