Implement UEFI BIOS by Rust.
Reference by https://rust-osdev.github.io/uefi-rs/tutorial/
このリポジトリでは以下のホスト環境で動作することを確認しています。
- PC: MacBook Air, M2, 2022
- OS: macOS 15 Beta (Sequoia)
- Docker (version 27.1.2, build d01f264bcc)
- なるべくホスト環境を汚したくなかったので、Docker を使っています。
- Linux 仮想環境を手に入れるのに各自 Docker Desktop や colima (lima) などをインストールする。
- XQuartz (version 2.8.5)
- QEMU 上でブートローダを起動するためには X Server がホストOS上で必要となる。
- XQuartz を使うことで macOS 上で X Server を実行できる。
- Homebrew がインストールされていれば、
$ brew install xquartz
でインストールできる。
VSCode を前提として DevContainer を使っています。DevContainer を使うことで、docker のコンテナ環境に入りながらエディタ上で開発をすることができるため大変便利です。DevContainer の使い方については各自調べる。
ここからは DevContainer 上でプロジェクトディレクトリがカレントディレクトリになっている前提から始まります。以下のコマンドをプロジェクトのルートディレクトリで実行してください。
$ cargo build --target x86_64-unknown-uefi
QEMU上で実行したいターゲットを指定することができる。ただし、rust-toolchain.toml
ファイルに定義されているターゲットの一覧から選択する。
ビルドが成功すると target/x86_64-unknown-ueif/debug/my-uefi-app.efi
が生成される。
QEMU 上でブートローダーを実行するためには、ホストOS上で GUI Window を提供する X Window System
の X Server
が起動している必要があります。なので、まず macOS 上で X Server を起動します。
XQuartz
アプリケーションを起動- アプリケーションフォルダの
XQuartz
をクリックして起動
- アプリケーションフォルダの
XQuartz
> 設定 > セキュリティを選択し、ネットワーククライアントからの接続を許可にチェックを入れる- 設定後、
XQuartz
の再起動 XQuartz
の terminal を起動XQuartz
のアプリケーション(XQuartz
を開いた状態で画面上側のバーに表示される)> terminal をクリック
- アクセス許可の設定
- terminal から xhost + と打つ
QEMU 上で VVFAT
を使って esp
ディレクトリにアクセスできる。以下のコマンドを実行すると QEMU が起動して、QEMU の画面上に Hello World! の文字が表示される。
$ qemu-system-x86_64
-drive if=pflash,format=raw,readonly=on,file=OVMF_CODE_4M.fd \
-drive if=pflash,format=raw,readonly=on,file=OVMF_VARS_4M.fd \
-drive format=raw,file=fat:rw:esp
NOTE
QEMU
を実行するときに-enable-kvm
というオプションを指定することで、KVM
の機能をフルで使うことを有効化し、パフォーマンスを大幅に向上することができるらしいが、ホストOS上でKVM
を有効化しておく必要があり、macOS
上ではKVM
は使えないため指定しなかった。