昨日作ったバイナリはQEMUで実行できるらしい。
qemu-system-armは仮想ボードをサポートしている。raspi2
とかxilinx-zynq-a9
とか。多くがCortex-Aで、Cortex-Mはほとんどない。
https://wiki.qemu.org/Documentation/Platforms/ARM#Supported_in_qemu-system-arm
細かいことが気になるが、まずは動かしてみよう。
参考にしたウェブサイトはconnex
ボード(ARM7TDMIファミリ?)を使っているのでこれに倣う。
4096Bのファイルを生成し、その先頭にhello.bin
を書き込んだ。
$ dd if=/dev/zero of=flash.bin bs=4096 count=4096
$ dd if=hello.bin of=flash.bin bs=4096 conv=notrunc
ddコマンドの解説はまた今度。このコマンドも奥が深いのだ。
$ .\qemu-system-arm.exe -M connex -pflash flash.bin -nographic -monitor stdio
- -M
- 開発ボード
- -pflash
- FlashROMのファイル指定
- -nographic
- 画像出力しない
- -monitor
- QEMUモニタの出力先。今回はqemuを起動したコンソールに繋ぐ
プログラムをロードして実行した。上手く動いていれば、プログラムはstopで無限ループしているはずである。
(qemu) info registers
R00=00000005 R01=00000004 R02=00000009 R03=00000000
R04=00000000 R05=00000000 R06=00000000 R07=00000000
R08=00000000 R09=00000000 R10=00000000 R11=00000000
R12=00000000 R13=00000000 R14=00000000 R15=0000000c
PSR=400001d3 -Z-- A svc32
FPSCR: 00000000
R15(PC)が現在の実行アドレスで、0x0000_000Cだ。また、R2=R1+R0になっていて、アセンブラによる計算ができたことがわかる。
(qemu) xp /4iw 0x0
0x00000000: e3a00005 mov r0, #5
0x00000004: e3a01004 mov r1, #4
0x00000008: e0812000 add r2, r1, r0
0x0000000c: eafffffe b #0xc
逆アセンブルもできる。
qemuをきちんと動かすことに非常に苦労した(現在進行形)。qemu-system-arm
とWindows向けらしいqemu-system-armw
があり、後者はWindows環境らしいのだが正常に動かなかった。
QEMUの公式サイトには
QEMU for Windows is experimental software and might contain even serious bugs, so use the binaries at your own risk.
と書いてあるので、そういうことなのかもしれない。やはり開発マシンはLinuxがいいな。
QEMUをPowershellから呼び出すとQEMU Monitorからの出力が文字化けしたため(入力はされているっぽい)これまた謎。VSCodeのコンソールから使うと使えた。
QEMUのバージョンを上げてみる。3.1.5 -> 4.1.0に。頻繁にバージョンアップするようだったのでchoco install
qemu
した。特に効果なし。安定して動かしたかったらVMのLinux上でQEMUを動かした方がいい気がする。ただしファイル編集はローカルでしたいので、WSLまたはネットワークドライブをマウントしたLinuxVMを用意すること。組込開発用途だが、そもそもエミュレーションが目的なので実機は不要だ。