一 编写源代码
EfiMemoryMapSize = 0;
EfiMemoryMap = NULL;
Status = gBS->GetMemoryMap (
&EfiMemoryMapSize,
EfiMemoryMap,
&EfiMapKey,
&EfiDescriptorSize,
&EfiDescriptorVersion
);
ASSERT (Status == EFI_BUFFER_TOO_SMALL);
do {
EfiMemoryMap = AllocatePool (EfiMemoryMapSize);
if (EfiMemoryMap == NULL){
DEBUG ((EFI_D_ERROR, "ERROR!! Null Pointer returned by AllocatePool ()\n"));
ASSERT_EFI_ERROR (EFI_OUT_OF_RESOURCES);
return Status;
}
Status = gBS->GetMemoryMap (
&EfiMemoryMapSize,
EfiMemoryMap,
&EfiMapKey,
&EfiDescriptorSize,
&EfiDescriptorVersion
);
if (EFI_ERROR(Status)) {
FreePool (EfiMemoryMap);
}
} while (Status == EFI_BUFFER_TOO_SMALL);
DEBUG((DEBUG_ERROR | DEBUG_PAGE,"[CSDN] EfiMemoryMapSize=0x%x EfiDescriptorSize=0x%x EfiMemoryMap=0x%x \n", EfiMemoryMapSize, EfiDescriptorSize, (UINTN)EfiMemoryMap));
EfiMemoryMapEnd = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)EfiMemoryMap + EfiMemoryMapSize);
EfiEntry = EfiMemoryMap;
DEBUG((DEBUG_ERROR | DEBUG_PAGE,"===========================%S============================== Start\n", L"CSDN MemMap"));
while (EfiEntry < EfiMemoryMapEnd) {
if (EfiEntry->Type == EfiReservedMemoryType){
DEBUG((DEBUG_ERROR | DEBUG_PAGE, "[CSDN] EfiReservedMemoryType %3d %16lx pn %16lx \n", EfiEntry->Type, EfiEntry->PhysicalStart, EfiEntry->NumberOfPages));
ReservedMemoryTypePage = ReservedMemoryTypePage + EfiEntry->NumberOfPages;
}else if (EfiEntry->Type == EfiLoaderCode){
DEBUG((DEBUG_ERROR | DEBUG_PAGE, "[CSDN] EfiLoaderCode %3d %16lx pn %16lx \n", EfiEntry->Type, EfiEntry->PhysicalStart, EfiEntry->NumberOfPages));
LoaderCodePage = LoaderCodePage + EfiEntry->NumberOfPages;
}
二、 编译
生成EFI文件 & 运行
这是一个memmap dump demo,使用该demo可以得出当前BIOS的mem region分配情况,在shell下同样可以使用内置的memmap 命令来查看当前memory map。