UEFIアプリ作ろうとしたら苦戦しまくった話

自作OSを作る->ブートする必要がある->UEFIときた。
もともとはEDKIIを使うはずだったんだけど、なんとビルドが全くできない!
undefined 何とかっていわれちゃうんだよね

 

そんなわけで、gnu-efiを使うことになりました。

その中でもいろいろ苦戦したので備忘録的に。

 

まず環境設定

いれるパッケージは
qemu-system-x86 gnu-efi binutils-mingw-w64 gcc-mingw-w64

よくあるOVMFは今はいれません
ダウンロードしておきます(https://sourceforge.net/projects/edk2/files/OVMF/)

 

またisoやHDD用イメージを作るものも入れましたが
今回は特に記述しません。

 

ソースコードはネットの丸コピ

#include <efi.h>
#include <efilib.h>

EFI_STATUS efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
  EFI_STATUS Status;
  EFI_INPUT_KEY Key;

  ST = SystemTable;

  Status = ST->ConOut->OutputString(ST->ConOut, L"Hello     World\r\n");
  if (EFI_ERROR(Status))
  return Status;

  Status = ST->ConIn->Reset(ST->ConIn, FALSE);
  if (EFI_ERROR(Status))
  return Status;

  return Status;
}

ソースコードMarkdownの都合上丸コピできませんでした

そしたらビルドするのですが
data.cというgnu-efiのソースが必要らしいです
しかし、私の場合検索しても見当たらない!
さてどうするか...
githubから落としてきちゃいました!(https://github.com/vathpela/gnu-efi)

ビルド失敗!えぇ...
参考文献によると
LibStubUnicodeInterface構造体の中をすべてNULLにします
とのこと
その通りにするとビルド、リンクが通りました!

そのファイルをFATでフォーマットされた中の
EFI/BOOT/BOOTX64.EFIにします

 

さて最後にqemuでテスト
オプションはこんな感じ
-bios OVMF.fd -device usb-ehci,id=usb,bus=pci.0,addr=0x4 -drive id=boot_usb,file=リンクしてできたimg,format=raw,if=none -device usb-storage,drive=boot_usb

qemuのUSBストレージに関する情報がなかなかなかったので書いておきます。

無事Hello Worldが出たので完成。
長かった。

次回はグラフィック処理かな。

P.S.
グラフィック処理でリンクが全くできず、情報もなく諦めました。

参考文献:

wiki.osdev.org