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"' >> ~/.bashrc

zig-currentというシンボリックリンクを一段挟むことで、バージョンアップ時にリンクの向き先を変更するだけで済みます。ホームディレクトリ配下に閉じた構成のため、sudoは不要で、システムのパッケージ管理とも競合しません。

$ zig version
0.16.0

Zigはクロスコンパイラを内蔵しており、追加のツールチェインなしに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.pdb

zig-out/bin/BOOTX64.efiが生成されれば、Zig側のUEFIターゲットビルドは正常に機能しています。QEMU+OVMFでの実際の起動検証は本編の各記事で扱います。