嗨,我正在使用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作为请求的内存类型。