2017-01-15 27 views
1

BootServices->GetMemoryMap()関数を呼び出そうとしていますが、関数の定義とドキュメントは意味がありません。UEFIのBootServices-> GetMemoryMap()のドキュメントが混乱しています

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

しかし、パラメータセクションは言う:

メモリマップ:UEFI仕様(V2.6)は、関数の定義は(:207ページ)であると述べているバッファへのポインタファームウェアは現在のメモリマップを に置きます。マップは EFI_MEMORY_DESCRIPTORの配列です。メモリマップはEFI_MEMORY_DESCRIPTORの配列であり、パラメータは、バッファへのポインタであると考えられる場合

、どのようにパラメータの型がIN OUT EFI_MEMORY_DESCRIPTOR *MemoryMapをすることができ、それはIN OUT EFI_MEMORY_DESCRIPTOR **MemoryMapすべきではありませんか?

+0

「ファームウェアが現在のメモリマップを配置するバッファへのポインタ」と書かれています。配列は間違いなくバッファへのポインタです。たぶんこのように解釈すると、 'バッファへのポインタ(バッファの最初のメモリアドレス)...' '** MemoryMap''は、バッファのビージングであるさらに別のアドレスのアドレスになります。したがって、ポインタへのポインタになります。 –

+0

著者のワードバッファーの意味に依存します。機能上はアドレスになりますが、一般的に言えば、バッファを構成するアドレスの全領域です。後では矛盾がないように見えるので、間違いがあるか、バッファの正確な機能的定義を参照していない文脈が明らかになる。 –

+0

@marshalcraft:ありがとう、私はそれを得た。彼らがこれをするのはちょっと奇妙なようです。 – nom

答えて

1

マップはEFI_MEMORY_DESCRIPTORの配列です。

マップはEFI_MEMORY_DESCRIPTORの配列の場合、配列の名前、すなわち

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

次に、配列を格納する変数を宣言するにはどうすればよいですか?今は 'EFI_MEMORY_DESCRIPTOR memoryMap;'のようにして、 'systemTableLocal.BootServices-> GetMemoryMap(&mapSize、&memoryMap、&mapKey、&descriptiorSize、&descriptiorVersion);のような関数を呼び出しています。 – nom

+0

ああ、私は今それを得る。 – nom

+0

名前ではなく名前で配列を渡す必要があります。 – 4pie0

関連する問題