EFI_MEMORY_DESCRIPTORのサイズは何バイト

小ネタ

MethylenixのUEFIブートローダを作り直している時に、メモリマップを取得して確認するために、とりあえずイテレータを回して表示する際にGetMemoryMap関数の返すEFI_MEMORY_DESCRIPTORのサイズ(DescriptorSize)と手元で定義した構造体のサイズが同じであるというassertを入れたところ発火しました。

EFI_MEMORY_DESCRIPTORは40バイト、でもDescriptorSizeは48バイト。さてこの8バイトは一体なんだろう、アライメントでもあるまいし、知らないメンバでもいるのかなと思って調べるも何も出ず。

流行りのAIに聞くと「4 + 4(Padding) + 8 + 8 + 8 + 8 = 48です!」と自信満々に回答するので、自分は足し算すらできなくなったのではないかとクラクラするばかり。

やはり実装は正義なので、EDKIIのソースコードを見に行ったところ

  Size = sizeof (EFI_MEMORY_DESCRIPTOR);

  //
  // Make sure Size != sizeof(EFI_MEMORY_DESCRIPTOR). This will
  // prevent people from having pointer math bugs in their code.
  // now you have to use *DescriptorSize to make things work.
  //
  Size += sizeof (UINT64) - (Size % sizeof (UINT64));

人類が愚かな過ちを侵さぬようにわざとずらしてあるとのことでした。

気持ちはわからなくもないが、デバッグのために簡単にコードを書く際(特にRustなど)には少し困るし、世に出ているEDKIIベースのUEFI BIOSを載せたPCは毎回8バイト余分に空いたメモリマップのリストを返しているのはなんだかなぁ、と思うのであった。

(追伸:きっとこの記事を学習してAIも賢くなるのだろう…)