QEMUの起動オプションを調べてみる
Yuto Nakamura / 2023/06/02 (191 Words, 2 Minutes)
前回の記事では、HinaOSをQEMUで実際に動かしてみました。
今回は、HinaOSのMakefileがQEMUをどのように実行しているのかを調べて、実際にプログラムを実行する際の目安とします。
HinaOSは、『自作OSで学ぶマイクロカーネルの設計と実装』(秀和システム、ISBN: 978-4-7980-6871-8)で紹介されている教育向けマイクロカーネルOSです。実際の本は以下の画像のリンク先から購入できます。とても良い本なので是非。
実行時のコマンドを確認する
-n
オプションをつけて、make
すると、実行せずに実行時のコマンドを確認できます。
make -n run
すると大量のコマンドが表示されます。例えば最初はbuildディレクトリを作り、その後、main.c
, prntk.c
, …とたくさんのファイルをコンパイルし、最後に、リンクしてelf
を生成していることがわかります。生成したのちに、最後の最後に実行されるQEMUコマンドは以下です。(実際にはない改行を付け足しています)
qemu-system-riscv32 -smp 1 -nographic -serial mon:stdio \
--no-reboot -m 128 -machine virt,aclint=on \
-bios none -global virtio-mmio.force-legacy=true \
-drive file=build/hinafs.img,if=none,format=raw,id=drive0 \
-device virtio-blk-device,drive=drive0,bus=virtio-mmio-bus.0 \
-device virtio-net-device,netdev=net0,bus=virtio-mmio-bus.1 \
-object filter-dump,id=fiter0,netdev=net0,file=virtio-net.pcap \
-netdev user,id=net0 -kernel build/hinaos.elf
各オプションについて見ていきます
-smp 1
: CPUの数を指定します。今回は1つです。-nographic
: グラフィックを表示しません。-serial mon:stdio
: シリアルポートを標準入出力に接続します。monはmonitorの略です。--no-reboot
: シャットダウン時に再起動しないようにします。-m 128
: メモリサイズを128MBにします。machine virt,aclint=on
: マシンタイプをvirt
にします。aclint=on
はACLINTを有効にするオプションです。ACLINTについてはよくわかっていませんが、おそらく、複数のスレッドがあるときの割り込みの扱いをどうするかを指定しているのだと思います。詳しくはここを見てください。virt
は、仮想のプラットフォームです。特定のハードウェアを再現する必要性がない場合に使用されます。RISC-VのQEMUでは、現在のところ、opentitan, sifive_e, sifive_u, spike, virtのマシンタイプが存在するようです。
-bios none
: BIOSは今回指定しません-global virtio-mmio.force-legacy=true
: 仮想デバイスの設定です。virtio-mmio
は仮想デバイスの一種です。force-legacy=true
は、仮想デバイスのレガシーモードを強制的に有効にするオプションです。正直あんまりよくわかっていない…-drive file=build/hinafs.img,if=none,format=raw, id=drive0
: ディスクイメージを指定します。if=none
は、ディスクイメージを仮想デバイスに接続しないことを意味します。format=raw
は、ディスクイメージのフォーマットをrawに指定します。rawは、これで、直接イメージが書き込まれます。また、このドライブの名前をdrive0
とします。-device virtio-blk-device,drive=drive0,bus=virtio-mmio-bus.0
:virtio-blk-device
は、仮想デバイスの一種で、ストレージデバイスを仮想化しています。drive=drive0
は、先ほど指定したディスクイメージを接続します。bus=virtio-mmio-bus.0
は、仮想デバイスを接続するバスを指定します。-device virtio-net-device, netdev=net0, bus=virtio-mmio-bus.1
:virtio-net-device
は、仮想デバイスの一種で、Ethernetカードを仮想化しています。netdev=net0
は、netdevのIDを指定しています。bus=virtio-mmio-bus.1
は、仮想デバイスを接続するバスを指定します。object filter-dump, id=filter0, netdev=net0, file=virtio-net.pcap
:filter-dump
は、パケットをキャプチャするためのフィルタを設定します。id=filter0
は、フィルタのIDを指定します。netdev=net0
は、フィルタを適用するネットワークバックエンドを指定します。file=virtio-net.pcap
は、キャプチャしたパケットを保存するファイルを指定します。-netdev user,id=net0
: ネットワークバックエンドを指定します。user
は、ホストマシンのネットワークを使用します。id=net0
で、ネットワークバックエンドのIDを指定します。-kernel build/hinaos.elf
: カーネルイメージを指定します。
これら、オプションはQEMUのdocsの他、help
コマンドでこんな感じで見ることが出来ます。
$ qemu-system-riscv32 --help | grep netdev
-netdev user,id=str[,ipv4=on|off][,net=addr[/mask]][,host=addr]
また、各プロパティも見れます。
$ qemu-system-riscv32 -netdev help
Available netdev backend types:
socket
stream
dgram
hubport
tap
user
l2tpv3
bridge
vhost-user
vhost-vdpa
それぞれのプロパティを詳しく見るには、こうやります
$ qemu-system-riscv32 -object filter-dump,help
filter-dump options:
file=<string>
insert=<string>
maxlen=<uint32>
netdev=<string>
position=<string>
queue=<NetFilterDirection>
status=<string>
まとめ
自分のプログラムをQEMU上で動かす際の方法を知るための準備として、HinaOSがQEMUでどのように起動されているかをオプションから調べてみました。仮想ストレージや、イーサネットはしばらく使うことはないかもしれませんが、かなり勉強になりました。
© 2023 Yuto Nakamura
•
Theme Moonwalk