我正在为一个业余爱好操作系统编写一个引导加载程序,它的目标是 UEFI。为了将一些信息从引导加载程序传递到内核,我使用
BootServices->AllocatePages()
进行了一些内存分配。我想在内存映射中区分传统的 EfiLoaderCode
、EfiLoaderData
和这些额外信息(有关内存布局的信息,以及通过 UEFI 加载的一些文件)。本质上,我希望区分内存映射中的这些区域。
UEFI 2.8 规范,在第 7.2 节中,在
MemoryType
的 AllocatePages()
参数下,指出
0x80000000..0xFFFFFFFF 范围内的 MemoryType 值保留供操作系统供应商提供的 UEFI OS 加载程序使用。
在该函数可能返回的错误下,由于 MemoryType 而失败的唯一原因是,
EFI_INVALID_PARAMETER | MemoryType 的范围为 EfiMaxMemoryType..0x6FFFFFFF。 EFI_INVALID_PARAMETER | EFI_INVALID_PARAMETER |内存类型是 EfiPersistentMemory。
我的解释是引导加载程序/内核实现者(在这种情况下是我),因此可以在这个范围内使用自己的值,这些值将分配给分配的页面,并且这些页面将在内存中用此自定义类型标记从
BootServices->GetMemoryMap()
获取的地图。
在这个假设下,我通过调用分配内存
err = BootServices->AllocatePages(AllocateAnyPages, 0x80000001, pages, &ret);
并且返回没有错误。但是,当我稍后尝试调用
BootServices->ExitBootServices()
时,该函数永远不会返回并且系统挂起。当我使用类型参数 EfiLoaderData
而不是 0x80000001
调用上述分配时,此调用不会挂起。
我需要经历某种注册过程才能使用我自己的自定义
MemoryType
值,还是我对规范的理解错误?
虽然这可能不是您正在寻找的答案:
我也面临着同样的问题。对我来说,在 QEMU 中以及在另一台机器上测试时一切正常。这可能是特定于平台的问题。不幸的是我不知道如何解决它。