💻

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