Windows環境にUEFIアプリ動作用の仮想環境qemuをインストールする
Windows環境にUEFIアプリ動作用の仮想環境qemuをインストールする
UEFIアプリ自体はWindowsPCでも動くのに意外に仮想環境であるqemuをwindowsにインストールして動かす話があまりなかったのでメモ.
環境
- Windows10
ファームウェア周りの用語メモ
UEFI: Unified Extensible Firmware Interface 旧BIOSを改善した新しいBIOS規格.UEFI BIOSともいう.
TianoCore: UEFIのオープンソース実装をサポートするコミュニティ https://www.tianocore.org/
EDK II: EFI Developer Kit II : UEFIおよびUEFIプラットフォーム初期化(PlatformInitialization)仕様向けの、機能が豊富なモダンなクロスプラットフォームファームウェア開発環境 https://github.com/tianocore/tianocore.github.io/wiki/EDK-II
ビルドを試してる記事 https://cluster.hatenablog.com/entry/2019/03/11/234149
ベアメタルプログラミング: OS無しでハードウェアを直接制御するプログラムを書くプログラミング http://yuma.ohgami.jp/UEFI-Bare-Metal-Programming/intro.html
実機でファームウェアアプリを動かす場合
そもそもUEFIBIOSのPCがあればそのままファームウェアアプリを動かせるのでエミュレータはいらない.
手順として,
- Cで書いたファームウェアアプリをUEFI用にビルドしてイメージファイルを作る
- イメージファイルを
BOOTX64.EFI
にリネームして,いらないUSBメモリあたりに"EFI/BOOT/BOOTX64.EFI"に書き込む - PCのUEFIを起動して起動ディスクの優先順を変更などして,このUSBの起動ディスクを起動.
これで自作のファームウェアが動く.
エミュレータを利用する
上のように実機でも動くが,
- 毎回USBに書き出して起動するのは面倒
- バグったコードでマザーボードが壊れる可能性
を考慮して今回はエミュレータを使用する.
qemuとは
QEMU is a generic and open source machine emulator and virtualizer.
公式サイト:
他の仮想マシンソフトとの違い - VirtualBox: ホストOSのCPUを使って同一CPU(のOS実行環境)をエミュレートするタイプ - qemu: CPUを丸ごとエミュレートするタイプ
参考: www.webzoit.net
qemuを使うと自作したファームウェアアプリをフォルダに配置するだけでそれをマウントした状態で起動できる.
qemuのインストール
今回はwindows上にインストールする.
インストーラのDL:
- Download QEMU - QEMU からOSに合わせて"64bit"or"32bit"を選択する.
- 最新の`qemu-w64-setup-20201124.exe`をDLする.
インストーラからインストール:
-
言語を選択する.今回は"English".
言語選択 -
セットアップ画面が立ち上がる.
セットアップ画面 -
内容確認して”agree”を選択.
同意確認 -
インストールするコンポーネントを選ぶ.今回は全部選択する.
コンポーネント選択 -
インストール先を選択する.
今回はDドライブ直下に選択.
インストール先選択 -
インストールが始まる.
インストール中 -
無事インストールできれば終わり.
インストール完了 -
powershellあたりから`qemu-system-x86_64.exe`を呼べるようにPATHを通す.
set QEMU "D:\qemu" set PATH "%PATH%;%QEMU%""
wsl上でも動く?
こちらの記事でWSL上のDevianでqemuをインストールして試してるのがある.
http://www.neko.ne.jp/~freewing/software/uefi_bios_hack/
ただし,-nographic
オプションが必要な模様.おそらくWSLではGUIが動かないため?
理想の仮想環境としてはwslかdockerかつGUIとして動かせるだろうか
OVMFとは
qemuにはUEFIは実装されていない. 別途用意する必要があり,それがOVMF(Open Virtual Machine Firmware)になる.
OVMFとは何か?
OVMF is an EDK II based project to enable UEFI support for Virtual Machines. OVMF contains sample UEFI firmware for QEMU and KVM.
OVMF.fd
がイメージファイルになる.
これをqemuを起動するときの-bios
オプションで指定するとUEFIを起動できる.
OVMFのDL
以下からzipファイルをDLして解凍するとOVMF.fd
ファイルが入っている.
解凍して適当な場所に置く.
実装されているUEFIのバージョンは書かれていない?
ビルド方法
最新版が欲しい場合は, EDKⅡのプロジェクトをDLしてビルドすればいい.
サポート環境:
以下の記事で実際にビルドを試している..
qemuの動作確認
そのまま起動
PATHが通ってるので以下のコマンドで起動できる.
> qemu-system-x86_64.exe
以下のように立ち上がればok
空フォルダをマウントしてOVMFを起動
qemuではフォルダをディスクとしてマウントして起動できる.
-bios
オプションでOVMFファイルを指定する.-hda
オプションでマウントしたいフォルダを指定する.
option一覧は Invocation — QEMU 5.0.92 (v5.1.0-rc2) documentationに載っている.
> qemu-system-x86_64.exe -bios D:\OSImage\OVMF-X64-r15214\OVMF.fd -hda fat:rw:Desktop/qemu
今回は空フォルダなのでロードに失敗して以下のように立ち上がる.
イメージフォーマットを指定してないので以下の警告が出るが問題なく動作する.
WARNING: Image format was not specified for 'json:{"fat-type": 0, "backing": {"driver": "vvfat_write_target"}, "dir": "Desktop/qemu", "driver": "vvfat", "floppy": false, "rw": true, "write-target": {"driver": "qcow", "file": {"driver": "file", "filename": "C:\\Users\\...' 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.
回避するには-drive
オプションを使って,
-drive format=raw
で回避できる.
OSイメージの起動
今回使わないので省略. 仮想ディスクのサイズを指定しておくなど前処理が必要ぽい.
こちらの記事で使い方がまとまっている.