【问题标题】:Confusing documentation for UEFI's BootServices->GetMemoryMap()UEFI 的 BootServices->GetMemoryMap() 令人困惑的文档
【发布时间】:2017-05-30 12:00:31
【问题描述】:

我正在尝试调用 BootServices->GetMemoryMap() 函数,但函数定义和文档对我来说没有意义。 UEFI规范(v2.6)说函数的定义是(第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_DESCRIPTORs的数组,并且参数应该是指向缓冲区的指针,那么参数的类型怎么可能是IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,不应该是IN OUT EFI_MEMORY_DESCRIPTOR **MemoryMap吗?

【问题讨论】:

  • 它说“指向固件放置当前内存映射的缓冲区的指针。”可以说,数组是指向缓冲区的指针。也许这样解释,A pointer to the buffer (first memory address of the buffer) in which ... **MemoryMap 将是另一个地址的地址,它是缓冲区的开始。所以它是一个指向指针的指针。
  • 要看作者对buffer这个词的意思。在功能上,它是一个地址,但通常来说,它是构成缓冲区的整个地址区域。在后面似乎没有矛盾,因此要么有错误,要么上下文表明它没有引用缓冲区的确切功能定义。
  • @marshalcraft:谢谢,我明白了。他们这样做似乎有点奇怪。

标签: c intel uefi


【解决方案1】:

地图是一个 EFI_MEMORY_DESCRIPTOR 数组。

如果映射是EFI_MEMORY_DESCRIPTORs 的数组,则数组的名称衰减为指向该数组中第一个元素的指针,即指向

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, ...);

【讨论】:

  • 那我该如何声明一个变量来存储数组呢?现在我正在像EFI_MEMORY_DESCRIPTOR memoryMap; 那样做,并像systemTableLocal.BootServices->GetMemoryMap(&mapSize, &memoryMap, &mapKey, &descriptiorSize, &descriptiorVersion); 这样调用函数。
  • 您应该按名称传递数组,而不是名称的地址。
猜你喜欢
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
相关资源
最近更新 更多