【问题标题】:Passing information from UEFI to the OS从 UEFI 向操作系统传递信息
【发布时间】:2016-08-27 15:56:33
【问题描述】:

我熟悉 BIOS int 15 - E820 功能,您可以在其中选择 fixed 物理位置,放置任何您想要的位置,操作系统不会覆盖它,您只需访问该固定位置即可内存地址(可以先映射到虚拟指针等)。

但在 UEFI 的情况下,据我所知,没有为用户保留内存区域,因此我不能依赖在特定内存地址分配缓冲区(如果这可能吗?),因此我必须使用 UEFI 内存记忆函数 - 它返回一个 not 固定的指针。

所以我的问题是 -

  1. 是否可以分配一个在操作系统启动后不会被覆盖的缓冲区?

  2. 如何将分配缓冲区的指针传递给操作系统,以便我可以从操作系统访问它(再次,因为分配,希望缓冲区本身没有被覆盖,不是固定的位置)。

谢谢!

【问题讨论】:

  • 没有为 INT 15h、AX=E820h 的用户保留内存区域。它只返回已用内存区域的列表。您可以将其替换为您自己的提供修改列表的例程,这样使用此函数的操作系统就不会使用某些内存区域。也许你可以用等效的 UEFI 函数 GetMemoryMap 做同样的事情。

标签: c windows memory-management bios uefi


【解决方案1】:
  1. 是的。分配不可回收类型的内存内存,例如EfiRuntimeServicesData
  2. UEFI 使用的机制称为配置表

注意:EfiPersistentMemory 是完全不同的东西。

在启动服务期间通过调用InstallConfigurationTable 来安装配置表,其中两个参数是一个GUID 和一个指向要传递的数据结构的物理地址的指针。然后将这对链接到 UEFI 系统表指向的数组中。

我不知道如何在 Windows 中提取这些信息。在 Linux 中,UEFI 系统表在内核空间(efi->systab)是全局可访问的,因此可以从那里提取指针。

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 2013-06-20
    • 2015-11-16
    • 2016-04-18
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多