QEMUの続き。前回、QEMUを使ってLinux向けにコンパイルされたバイナリを実行することができるようになったが、ベアメタルのバイナリを動かすことはまだできていない。目標としてはとりあえずriscv-tests
関係のプログラムを動かすことができるようになりたい。
色々調べた結果、これにはGDBを使用するのが手っ取り早いらしい?
https://github.com/riscv/riscv-qemu/issues/137
まずはsoftmmu構成のQEMUでGDBモードで立ち上げる。-s
オプションはremote :1234
で待ち状態に入るためのオプションらしい。
./qemu-system-riscv64 --d in_asm -nographic -machine sifive_u \ --kernel /home/ubuntu/work/riscv64/riscv64-unknown-elf/share/riscv-tests/isa/rv64ui-p-simple \ -s -S
別のターミナルを立ち上げてGDBを起動する。そしてtarget
コマンドでQEMUに接続する。
$ riscv64-unknown-elf-gdb (gdb) target remote :1234 Remote debugging using :1234 warning: No executable has been specified and target does not support determining executable automatically. Try using the "file" command. Program received signal SIGTRAP, Trace/breakpoint trap. 0x0000000000001000 in ?? ()
これでc
コマンドでシミュレーションを開始すると、QEMUのstdout
に実行された命令が表示される。これでどのような命令が実行されたかを確認することができるという訳か。
---------------- IN: Priv: 3; Virt: 0 0x0000000000001000: 00000297 auipc t0,0 # 0x1000 0x0000000000001004: 02028593 addi a1,t0,32 0x0000000000001008: f1402573 csrrs a0,mhartid,zero ---------------- IN: Priv: 3; Virt: 0 0x000000000000100c: 0182b283 ld t0,24(t0) 0x0000000000001010: 00028067 jr t0 ---------------- IN: Priv: 3; Virt: 0 0x0000000080000000: 0480006f j 72 # 0x80000048 ---------------- IN: Priv: 3; Virt: 0 0x0000000080000048: f1402573 csrrs a0,mhartid,zero ---------------- IN: Priv: 3; Virt: 0 0x000000008000004c: 00051063 bnez a0,0 # 0x8000004c ...
追記。なるほど、無理にGDBを使わなくても、上記のオプションだけで動かすことはできるのか。
./qemu-system-riscv64 --machine sifive_u --d in_asm --nographic --kernel /home/msyksphinz/riscv64/riscv64-unknown-elf/share/riscv-tests/isa/rv64ui-p-simple
大体わかった。これを自作ターゲット向けに移植すれば良いわけかな?