我正在为一个针对 UEFI 的业余操作系统编写引导加载程序。为了将一些信息从引导加载程序传递到内核,我使用 BootServices->AllocatePages()
进行了一些内存分配。我想在传统的 EfiLoaderCode
、EfiLoaderData
和这些额外信息(关于内存布局的信息,以及一些通过 UEFI 加载的文件)之间的内存映射中进行区分。本质上,我希望在内存映射中区分这些区域。
UEFI 2.8 规范,在第 7.2 节中,在 MemoryType
的 AllocatePages()
参数下,它指出
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
值,还是我对规范的理解有误?