【问题标题】:uEFI Virtual to Physical Memory translationuEFI 虚拟到物理内存转换
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 那为什么我的应用打印的地址和系统的物理地址不一致呢?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2010-09-26
      • 2017-07-07
      • 1970-01-01
      相关资源
      最近更新 更多