引导加载程序可以使用自定义 UEFI 内存类型吗?

问题描述 投票:0回答:1

我正在为一个业余爱好操作系统编写一个引导加载程序,它的目标是 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
值,还是我对规范的理解错误?

bootloader uefi
1个回答
0
投票

虽然这可能不是您正在寻找的答案:

我也面临着同样的问题。对我来说,在 QEMU 中以及在另一台机器上测试时一切正常。这可能是特定于平台的问题。不幸的是我不知道如何解决它。

© www.soinside.com 2019 - 2024. All rights reserved.