自作OSを作る->ブートする必要がある->UEFIときた。
もともとはEDKIIを使うはずだったんだけど、なんとビルドが全くできない!
undefined 何とかっていわれちゃうんだよね
その中でもいろいろ苦戦したので備忘録的に。
まず環境設定
いれるパッケージは
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.
グラフィック処理でリンクが全くできず、情報もなく諦めました。
参考文献: