UEFI的BootServices-> GetMemoryMap()令人困惑的文档

时间:2017-01-15 15:45:37

标签: c intel uefi

我试图调用BootServices->GetMemoryMap()函数,但函数定义和文档对我来说没有意义。 UEFI规范(v2.6)说该函数的定义是(page:207):

typedef EFI_STATUS(EFIAPI *EFI_GET_MEMORY_MAP)(IN OUT UINTN *MemoryMapSize, IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, OUT UINTN *MapKey, OUT UINTN *DescriptorSize, OUT UINT32 *DescriptorVersion);

但参数部分说:

  

MemoryMap :指向固件放置当前缓冲区的指针   记忆图。地图是一个数组   EFI_MEMORY_DESCRIPTORs。

如果内存映射是一个EFI_MEMORY_DESCRIPTOR的数组,并且该参数应该是指向缓冲区的指针,那么参数的类型如何是IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,不应该是IN OUT EFI_MEMORY_DESCRIPTOR **MemoryMap。是public class Test extends Object { public Test() {} public void someMethod() {} }

1 个答案:

答案 0 :(得分:1)

  

地图是EFI_MEMORY_DESCRIPTORs的数组。

如果地图是EFI_MEMORY_DESCRIPTOR s的数组,那么数组的名称会衰减到指向该数组中第一个元素的指针,即

EFI_MEMORY_DESCRIPTOR *MemoryMap

所以给定了函数

EFI_STATUS efi_get_memorymap(IN OUT UINTN *MemoryMapSize,
                             IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, ...);

和描述符地图

EFI_MEMORY_DESCRIPTOR memory_map[2];

你可以这样传递数组:

status = efi_get_memorymap(size, memory_map, ...);