UEFIアプリを作るためのツールキットとしてはEDK2とgnu-efiの2つが有名ですが、後者のgnu-efiについて書いているところが少なかった気がしたので、サンプルビルドの方法とQEMU上で実行する手順について書いておくことにしました。
対象はx86_64ではなく、AARCH64(ARM64)です。クロスコンパイラを用意してから読んでください。
gnu-efiのビルド
ダウンロードする
gnu-efi - Browse Files at SourceForge.net
バージョンは3.0.5が最新だったので、そちらをダウンロードしました。
解凍
tar xf gnu-efi-3.0.5.tar.bz2
ビルドする
cd gnu-efi-3.0.5
と移動して、CROSS_COMPILE変数を使ってクロスコンパイラの名前を教えてあげるとビルドができます。
make CROSS_COMPILE=aarch64-linux-gnu-
このとき、gccのバージョンが新しい(ver 7.x)の場合は、gnu-efiのコードのswitchにfallthrough(わざとbreakを挟まずに次の条件の処理を実行すること)しているところがあるので、次のようなエラーが出ます。
aarch64-linux-gnu-gcc -I/home/tnishinaga/gnu-efi-3.0.5/lib -I/home/tnishinaga/gnu-efi-3.0.5/lib/../inc -I/home/tnishinaga/gnu-efi-3.0.5/lib/../inc/aarch64 -I/home/tnishinaga/gnu-efi-3.0.5/lib/../inc/protocol -fpic -g -O2 -Wall -Wextra -Werror -fshort-wchar -fno-strict-aliasing -fno-merge-constants -ffreestanding -fno-stack-protector -fno-stack-check -DCONFIG_aarch64 -c /home/tnishinaga/gnu-efi-3.0.5/lib/print.c -o print.o /home/tnishinaga/gnu-efi-3.0.5/lib/print.c: In function '_Print': /home/tnishinaga/gnu-efi-3.0.5/lib/print.c:1133:26: error: this statement may fall through [-Werror=implicit-fallthrough=] Item.Pad = '0'; ~~~~~~~~~^~~~~ /home/tnishinaga/gnu-efi-3.0.5/lib/print.c:1134:13: note: here case 'x': ^~~~ cc1: all warnings being treated as errors
問題の詳細は以下を参照してください。
-Wimplicit-fallthrough in GCC 7 – RHD Blog
このエラーが起こった人は、makeの際に CFLAGS=-Werror=implicit-fallthrough=0を付けると、エラーを回避できます。
make CROSS_COMPILE=aarch64-linux-gnu- CFLAGS=-Werror=implicit-fallthrough=0
サンプルをビルドする
サンプルは以下のコマンドでビルドできます。
make CROSS_COMPILE=aarch64-linux-gnu- CFLAGS=-Werror=implicit-fallthrough=0 apps
ビルドさせたファイルは、gnu-efiのディレクトリの下にある aarch64/apps に置かれています。
サンプルを動かしてみる
QEMUを使ってサンプルのUEFIアプリを起動してみましょう。
準備
OVMFの取得などの準備は、以下の記事を参照して行ってください。
QEMUを起動する
以下のコマンドを実行すると、aarch64/apps以下が仮想マシンのドライブとしてマウントされた状態でUEFIシェルが起動します。
qemu-system-aarch64 -m 128 -cpu cortex-a57 -M virt -bios ../QEMU_EFI.fd -serial stdio -hda fat:rw:aarch64/apps
なお、ここで以下のエラーが出た人は、-hda fat
と aarch64/apps
の間に :rw:
が正しく挟めているかを確認してください。
$ qemu-system-aarch64 -m 128 -cpu cortex-a57 -M virt -bios ../QEMU_EFI.fd -serial stdio -hda fat:aarch64/apps vvfat aarch64/apps chs 1024,16,63 WARNING: Image format was not specified for 'json:{"fat-type": 0, "dir": "aarch64/apps", "driver": "vvfat", "floppy": false, "rw": false}' and probing guessed raw. Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted. Specify the 'raw' format explicitly to remove the restrictions. qemu-system-aarch64: -hda fat:aarch64/apps: Block node is read-only
サンプルを実行する
UEFIシェル上で以下のコマンド(fs0:の部分)を実行すると、サンプルアプリのあるデバイスに移動できます。
Shell> fs0:
ここで、以下の用にするとHelloWorldサンプルが実行され、画面にHelloWorldが表示されます。
FS0:\> t.efi HHello World!
とりあえず以上です。