AllocatePages将内存类型的EFI_INVALID_PARAMETER返回为EfiConventionalMe



嗨,我正在使用edk2为内核编写启动服务,需要应用AllocatePages服务来应用类型为EfiConventionalMemory的内存。

但是,它返回一个错误代码EFI_INVALID_PARAMETER。

我从git中查看了源代码,实际功能如下:

EFI_STATUS
EFIAPI
CoreAllocatePages (
IN  EFI_ALLOCATE_TYPE     Type,
IN  EFI_MEMORY_TYPE       MemoryType,
IN  UINTN                 NumberOfPages,
OUT EFI_PHYSICAL_ADDRESS  *Memory
)
{
EFI_STATUS  Status;
BOOLEAN     NeedGuard;
NeedGuard = IsPageTypeToGuard (MemoryType, Type) && !mOnGuarding;
Status = CoreInternalAllocatePages (Type, MemoryType, NumberOfPages, Memory,
NeedGuard);
if (!EFI_ERROR (Status)) {
CoreUpdateProfile (
(EFI_PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS (0),
MemoryProfileActionAllocatePages,
MemoryType,
EFI_PAGES_TO_SIZE (NumberOfPages),
(VOID *) (UINTN) *Memory,
NULL
);
InstallMemoryAttributesTableOnMemoryAllocation (MemoryType);
ApplyMemoryProtectionPolicy (EfiConventionalMemory, MemoryType, *Memory,
EFI_PAGES_TO_SIZE (NumberOfPages));
}
return Status;
}

它调用函数CoreInternalAllocatePages,如下所示:

EFI_STATUS
EFIAPI
CoreInternalAllocatePages (
IN EFI_ALLOCATE_TYPE      Type,
IN EFI_MEMORY_TYPE        MemoryType,
IN UINTN                  NumberOfPages,
IN OUT EFI_PHYSICAL_ADDRESS  *Memory,
IN BOOLEAN                NeedGuard
)
{
EFI_STATUS       Status;
UINT64           Start;
UINT64           NumberOfBytes;
UINT64           End;
UINT64           MaxAddress;
UINTN            Alignment;
EFI_MEMORY_TYPE  CheckType;
if ((UINT32)Type >= MaxAllocateType) {
return EFI_INVALID_PARAMETER;
}
if ((MemoryType >= EfiMaxMemoryType && MemoryType < MEMORY_TYPE_OEM_RESERVED_MIN) ||
(MemoryType == EfiConventionalMemory) || (MemoryType == EfiPersistentMemory)) {
return EFI_INVALID_PARAMETER;
}

因此,如果内存类型为EfiConventionalMemory,它实际上会返回EFI_INVALID_PARAMETER。

我还阅读了UEFI规范,该规范将EfiConventionalMemory定义为";空闲(未分配(存储器";在调用CCD_ 3之前;可用于一般用途的存储器";之后

所以我有点困惑,如果我得到EFI_INVALID_PARAMETER是正常的,如果不是,我应该怎么做才能得到正确的内存分配??

非常感谢!

内存类型参数指定分配后内存应具有的类型。显然,内存在分配后不能是空闲的,所以这就是为什么EfiConventionalMemory是一个无效的参数。

分配的内存来源始终是EfiConventionalMemory。

通常,您会使用BootServicesData作为请求的内存类型。

相关内容

  • 没有找到相关文章

最新更新