Zig / QEMU+OVMF 開発環境の構築
このプロジェクトのビルド・実機検証にはUbuntu 22.04を使用します。QEMU+OVMFやイメージ作成ツールなど、osdev向けのツールチェインがaptで揃うことと、x86_64機であればQEMUがKVMアクセラレーションを利用できる点によります。本記事では、以降の記事で共通して使用するZigツールチェインとQEMU+OVMFの導入手順をまとめます。
Zigツールチェインの導入
Zigは Ubuntu 22.04 の標準aptリポジトリには存在しないため、ziglang.orgが配布するtarballから、バージョンを固定して導入します。snap版も配布されていますが、stableチャンネルが空でbeta/edgeしか存在しない状態のため、このプロジェクトでは使用しません。
curl -sL -o zig.tar.xz https://ziglang.org/download/0.16.0/zig-x86_64-linux-0.16.0.tar.xz
mkdir -p ~/opt && tar -xf zig.tar.xz -C ~/opt
ln -sfn ~/opt/zig-x86_64-linux-0.16.0 ~/opt/zig-current
echo 'export PATH="$HOME/opt/zig-current:$PATH"' >> ~/.bashrczig-currentというシンボリックリンクを一段挟むことで、バージョンアップ時にリンクの向き先を変更するだけで済みます。ホームディレクトリ配下に閉じた構成のため、sudoは不要で、システムのパッケージ管理とも競合しません。
$ zig version
0.16.0Zigはクロスコンパイラを内蔵しており、追加のツールチェインなしにUEFI向けバイナリを生成できます。対応OSの一覧はzig targetsで確認でき、uefiが含まれています。
$ zig targets | grep -A2 -B2 uefi
...
"windows"
"uefi"
"3ds"
...QEMU + OVMFの導入
QEMUと、UEFIファームウェアのエミュレーション実装であるOVMFは、いずれもUbuntu標準のaptパッケージで導入できます。
sudo apt install -y qemu-system-x86 ovmf導入後、OVMFのファームウェアイメージは/usr/share/OVMF/以下に配置されます。起動確認で使用するのは主に次の2ファイルです。
| ファイル | 役割 |
|---|---|
OVMF_CODE.fd |
ファームウェア本体(読み取り専用として扱う) |
OVMF_VARS.fd |
UEFI変数の永続化領域(書き込み可能として扱う) |
/dev/kvmが存在する環境であれば、QEMU起動時に-enable-kvmを付けることでKVMアクセラレーションが有効になり、実行速度が大きく向上します。
動作確認
導入したツールチェインだけで、最小限のUEFIアプリケーションがビルド・起動できることを確認しておきます。
// src/main.zig
const std = @import("std");
const uefi = std.os.uefi;
pub fn main() uefi.Status {
return .success;
}// build.zig
const std = @import("std");
pub fn build(b: *std.Build) void {
const target = b.resolveTargetQuery(.{
.cpu_arch = .x86_64,
.os_tag = .uefi,
});
const optimize = b.standardOptimizeOption(.{});
const exe = b.addExecutable(.{
.name = "BOOTX64",
.root_module = b.createModule(.{
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
}),
});
b.installArtifact(exe);
}$ zig build
$ find zig-out -type f
zig-out/bin/BOOTX64.efi
zig-out/bin/BOOTX64.pdbzig-out/bin/BOOTX64.efiが生成されれば、Zig側のUEFIターゲットビルドは正常に機能しています。QEMU+OVMFでの実際の起動検証は本編の各記事で扱います。