UEFI エミュレータで遊ぶ

2 min read読了の目安(約1900字

概要

UEFI(最近のBIOS)ファームウェアを仮想化環境無しで遊ぶ方法について。

UEFIファームウェアやアプリの開発環境は OSS (EDK2)として公開されています。

https://github.com/tianocore/edk2

このツリーにはEmulatorPkgという、ホスト環境上で実行可能なUEFIファームウェアとUEFI Shellのエミュレータが含まれています。このエミュレータ上ではUEFIアプリの実行も可能なようです。

以下では、これのビルドからお試し方法をまとめてみます。

エミュレータでできること

軽く触ってみたところ、下記のことが行えました。
VMがなくても、またVM上でも気軽に UEFI Shell をお試しでき、UEFIアプリも実行可能なため簡単な動作確認に使えるかもしれません。

  • UEFI Shellの操作
  • エミュレータから ホスト上のディレクトリのマウント
  • エミュレータから ホスト上の UEFIアプリケーションの実行

エミュレータのビルド

Ubuntu 18.04 64bit上でビルドします。[1]
Ubuntuの公式サイトにビルド環境構築方法が書かれているので参考になります。

1. 必要なパッケージのインストール

※ 参考資料には未記載ですが、最近のEDK2のビルドにはpython3-distutilsが必要なようです。後半のlibx二つはエミュレータのビルド用に必要です。

sudo apt-get update
sudo apt-get install build-essential git uuid-dev iasl nasm python3-distutils libx11-dev libxext-dev

2. EDK2のチェックアウトとベースツールのビルド

下記は edk2-stable202011 というタグからビルドする例です。

git clone --depth 1 --branch edk2-stable202011 https://github.com/tianocore/edk2.git
cd edk2
. edksetup.sh
git submodule update --init
make -C BaseTools

3. エミュレータのビルド

Ubutnu18.04 + GCC5そのままではビルドに成功するものの実行時にSegmentaton Fault する issueが報告されています。暫定的に最適化オプションを切ることでビルドできるようです。

https://bugzilla.tianocore.org/show_bug.cgi?id=2639
perl -pi.bak -e 's/-D DISABLE_NEW_DEPRECATED_INTERFACES/-D DISABLE_NEW_DEPRECATED_INTERFACES -O0/g' EmulatorPkg/EmulatorPkg.dsc
build -p EmulatorPkg/EmulatorPkg.dsc -t GCC5 -a X64

エミュレータの実行

※ 実行後に端末の標準出力がおかしくなるようなので注意。

ビルドされたディレクトリ上で実行するとUEFI Shellが立ち上がります。

cd Build/EmulatorX64/DEBUG_GCC5/X64/
./Host

ホストのディレクトリをマウント

このUEFI Shell上では fs0 として、上記実行ディレクトリ(edk2のルートディレクトリ以下の)Build/EmulatorX64/DEBUG_GCC5/X64/が見えるようになっています。
UEFI Shell上で下記コマンドを使用することでホストのディレクトリをマウントできます。

fs0:
ls

上記実行ディレクトリ以下に任意のUEFIアプリを置いておけば、エミュレータのUEFI Shell上から実行することができます。

参考資料

Ubuntu公式のEDK2ビルド方法ドキュメント

https://wiki.ubuntu.com/UEFI/EDK2
脚注
  1. Windowsでもビルドできるようですが、試してみたことがないので割愛します。 https://github.com/tianocore/edk2/tree/master/EmulatorPkg#how-to-build--run ↩︎