EDK2をインストールしてUEFIアプリ『Hello Mikan World!』を実行してみた
はじめに
本記事では、EDK2を導入して最初のUEFIアプリを動かし、QEMU上で「Hello Mikan World!」を表示するところまでをまとめます。
自作OSやUEFI開発に興味はあるけれど、最初の一歩でつまずいてしまう方にとって、導入の流れが参考になれば幸いです。
この記事でできること
本記事では Windows 11 + WSL2 (Ubuntu 22.04) の環境にEDK2を導入し、
QEMU上でUEFIアプリをビルド・実行して「Hello Mikan World!」を表示するところまでを解説します。
EDK2とは
「パソコンの電源を入れた時に最初に動くプログラム(UEFI)」を作るためのソフトウェア開発キット
のことである。
そのUEFIアプリを作るための公式SDKがEDK2です。
手順
ステップ1: 依存パッケージのダウンロード
sudo apt update
sudo apt install -y build-essential uuid-dev iasl nasm git python3-venv \
python3-pip mtools ovmf qemu-system-x86
ステップ2: EDK2を取得&セットアップ
# 作業用ディレクトリへ
mkdir -p ~/work && cd ~/work
# 1) 公式EDK2取得
git clone https://github.com/tianocore/edk2.git
cd edk2
# 2) Python仮想環境(推奨)
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
# 3) EDK2のPython要件
pip install -r pip-requirements.txt
# 4) BaseToolsをビルド
make -C BaseTools
# 5) 環境セットアップ
. edksetup.sh
ステップ3: 作業ディレクトリを作る
cd ~/work/edk2
mkdir -p MyAppPkg/Application/MyApp
ステップ4: Main.c を書く
/mnt/c/Users/<ユーザー名>/Documents/Main.cに以下の内容を記述します。
Main.c の例
#include <Uefi.h>
#include <Library/UefiLib.h>
EFI_STATUS EFIAPI UefiMain(
EFI_HANDLE image_handle,
EFI_SYSTEM_TABLE *systemtable) {
Print(L"Hello Mikan World!\n");
while(1);
return EFI_SUCCESS;
}
ステップ5: INFファイルを作りUEFIアプリとして登録する
EDK2はただのCファイルを直接はビルドせず、INFで“これはUEFIアプリです”と宣言する必要がある
INFファイル…EDK2はただのCファイルをそのままビルドしてくれるわけではない。
「このソースをどんな種類のモジュールとして扱うのか」「どんなライブラリが必要か」
をビルドシステムに宣言する必要があり、そのためのファイルである。
nano ~/work/edk2/MyAppPkg/Application/MyApp/MyApp.inf
nanoエディタで開いたMyApp.infに以下の内容を記述します。
MyApp.inf の例
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = MyApp
FILE_GUID = 12345678-1234-1234-1234-1234567890ab
MODULE_TYPE = UEFI_APPLICATION
VERSION_STRING = 1.0
ENTRY_POINT = UefiMain
[Sources]
Main.c
[Packages]
MdePkg/MdePkg.dec
[LibraryClasses]
UefiLib
UefiBootServicesTableLib
UefiApplicationEntryPoint
入力が終わったら
Ctrl + O → 保存
Enter → 確定
Ctrl + X → 終了
を押す。
ステップ6: DSCファイルにビルド対象を追加する
nano ~/work/edk2/MdeModulePkg/MdeModulePkg.dsc
[Components.X64] セクションの中にMyAppPkg/Application/MyApp/MyApp.infを追加する。
DSCファイルとは、プロジェクト全体の構成表のようなもので、
どのINFファイルをまとめてビルドするかを記述するファイルです。
INFが「個別モジュールの説明書」だとすると、DSCは「全体の献立表」にあたります。
ステップ7: UEFIの変数保存用ファイルを用意
# どのVARSファイルがあるか確認
ls /usr/share/OVMF/*VARS*.fd
# 見つかったものをHOMEへコピー(例:OVMF_VARS.fd がある場合)
cp /usr/share/OVMF/OVMF_VARS.fd ~/OVMF_VARS.fd
chmod u+rw ~/OVMF_VARS.fd
ステップ8: 起動
qemu-system-x86_64 \
-machine q35,accel=tcg -cpu max -m 512M \
-drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=$HOME/OVMF_VARS.fd \
-drive file=fat:rw:~/work/esp,format=raw \
-serial stdio -display gtk

この “Hello Mikan World!” が表示されれば成功です
つまづきポイント
1,突然のプロンプトの冒頭の(.venv)
source .venv/bin/activateコマンド実行後に(.venv)がプロンプトの冒頭につくようになった。

解決策
これは、エラーではなくEDK2用に作った独立Python環境内で作業しているということのため
エラーではないので先に進めてもかまわない。
2.起動時のエラー
QEMU起動時に~/OVMF_VARS.fd No such file or directoryとエラーが出てしまった。
エラー時例

解決策
エラーは ~/OVMF_VARS.fd が無い だけです。UEFIの変数保存用ファイルを事前に用意すれば解決します。
# どのVARSファイルがあるか確認
ls /usr/share/OVMF/*VARS*.fd
# 見つかったものをHOMEへコピー(例:OVMF_VARS.fd がある場合)
cp /usr/share/OVMF/OVMF_VARS.fd ~/OVMF_VARS.fd
chmod u+rw ~/OVMF_VARS.fd
まとめと次回予告
今回はEDK2を導入し、QEMU上で「Hello Mikan World!」を表示するところまでを確認しました。
INFファイルやDSCファイルの役割など、EDK2特有の仕組みにも触れることができたので、次のステップに進む準備が整いました。
次回は UEFIのメモリマップを取得し、その内容をファイルに保存する処理 に挑戦していきます。
Discussion