ゼロからのOS自作入門 読みメモ 2章 その4

メインメモリ

  • UEFIのメモリマップにおける1ページの大きさは4KiB
  • 現実でのメモリマップはメモリ領域が隣接とならず歯抜けがあり得る
  • メモリマップの取得の写経
EFI_STATUS GetMemoryMap(struct MemoryMap* map) {
  if (map->buffer == NULL)
    return EFI_BUFFER_TOO_SMALL;
  }
  
  map->map_size = map->buffer_size;
  return gBS->GetMemoryMap(
      &map->map_size,
      (EFI_MEMORY_DESCRIPTOR*)map->buffer,
      &map->map_key,
      &map->descriptor_size,
      &map->descriptor_version);
}
  • UEFI はOSを起動するために必要な機能を提供するために必要な機能を提供するブートサービスとOS起動前起動後どちらでも使えるランタイムサービスがある
  • gBSはブートサービスを表すグローバル変数
  • gBS->GetMemoryMapの仕様
EFI_STATUS GetMemoryMap(
    IN OUT UINTN *MemoryMapSize,
    IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,
    OUT UINTN *MapKey,
    OUT UINTN *DescriptorSize
    OUT UINT32 *DescriptorVersion);
  • IN や OUT は EDK II のマクロ
    • 引数がどう使われるかプログラマに伝えるためのもの
    • IN: 関数への入力, OUT: 関数からの出力
    • 入力用には関数を呼び出す前に有効な値を入れておく
    • 出力用は関数がその内容を書き換える
    • IN OUT は入力用として使用された後に出力にも使われる
  • gBS->GetMemoryMapは関数呼び出し時点のメモリマップを取得し、引数 MemoryMap で指定されたメモリ領域に書き込む
  • MemoryMapSize にはメモリマップ書き込み用のメモリ領域の大きさを設定し、出力として実際のメモリマップの大きさが設定される
  • MemoryMap にはメモリマップ書き込み用のメモリ領域の先頭ポインタを設定する
    • 先頭ポイントの設定としてIN, メモリマップが書き込まれるためOUTが指定されている
  • MapKey にはメモリマップを識別する値を書き込む変数を指定
  • DescriptorSize はメモリディスクリプタのバイト数
  • DescriptorVersion はメモリディスクリプタの構造体のバージョン番号