引导加载程序可以使用自定义 UEFI MemoryTypes 吗?

时间:2021-05-06 21:07:09

标签: bootloader uefi

我正在为一个针对 UEFI 的业余操作系统编写引导加载程序。为了将一些信息从引导加载程序传递到内核,我使用 BootServices->AllocatePages() 进行了一些内存分配。我想在传统的 EfiLoaderCodeEfiLoaderData 和这些额外信息(关于内存布局的信息,以及一些通过 UEFI 加载的文件)之间的内存映射中进行区分。本质上,我希望在内存映射中区分这些区域。

UEFI 2.8 规范,在第 7.2 节中,在 MemoryTypeAllocatePages() 参数下,它指出

<块引用>

0x80000000..0xFFFFFFFF 范围内的内存类型值保留供操作系统供应商提供的 UEFI OS 加载程序使用。

在此函数可能返回的错误下,由于 MemoryType 而失败的唯一原因是,

<块引用>

EFI_INVALID_PARAMETER | MemoryType 在 EfiMaxMemoryType..0x6FFFFFFF 范围内。 EFI_INVALID_PARAMETER | MemoryType 是 EfiPersistentMemory。

我的解释是引导加载程序/内核实现者(在这种情况下是我),因此可以在此范围内使用自己的值,这些值将分配给分配的页面,并且这些页面将使用此自定义类型进行标记从 BootServices->GetMemoryMap() 获取的内存映射。

在这个假设下,我通过调用分配内存

err = BootServices->AllocatePages(AllocateAnyPages, 0x80000001, pages, &ret);

并且返回没有错误。但是,当我稍后尝试调用 BootServices->ExitBootServices() 时,该函数永远不会返回并且系统挂起。当我使用类型参数 EfiLoaderData 而不是 0x80000001 调用上述分配时,此调用不会挂起。

是否需要通过某种注册过程才能使用我自己的自定义 MemoryType 值,还是我对规范的理解有误?

0 个答案:

没有答案
相关问题