Gem5で、RISC-Vのプログラムをシミュレーションするための方法を調査している。まず、簡単なHello Worldプログラムを探して、これをコンパイルする方法を調査する。
まずは、hello_world向けのビルド環境があるので動かしてみることにする。
# gem5/tests/test-progs/hello/src Makefile.arm Makefile.mips Makefile.power Makefile.x86 hello.c
Makefile
を確認すると、どうやらDockerファイルを使ってビルド環境をダウンロードしているようだった。
# gem5/tests/test-progs/hello/src/Makefile.arm all: hello64-static hello32-static hello64-static: hello.c dockcross-arm64 ./dockcross-arm64 bash -c '$$CC hello.c -o hello64-static -static' hello32-static: hello.c dockcross-armv7 ./dockcross-armv7 bash -c '$$CC hello.c -o hello32-static -static' dockcross-arm64: docker run --rm dockcross/linux-arm64 > ./dockcross-arm64 chmod +x ./dockcross-arm64 dockcross-armv7: docker run --rm dockcross/linux-armv7 > ./dockcross-armv7 chmod +x ./dockcross-armv7 clean: rm -f dockcross* hello64-static hello32-static
dockcross/linux-arm64
などのDockerイメージを使用してビルドしている。同じことをRISC-Vでもできないだろうか?
調べてみると、RISC-V向けのDocker環境も用意されているようだ。これは試してみる価値がある。
そこで、以下のようなMakefileを用意してDocker環境を作ってみる。
# gem5/tests/test-progs/hello/src/Makefile.riscv64 all: hello hello: hello.c dockcross-riscv64 ./dockcross-riscv64 bash -c '$$CC hello.c -o hello -static' dockcross-riscv64: docker run --rm dockcross/linux-riscv64 > ./dockcross-riscv64 chmod +x ./dockcross-riscv64 clean: rm -f dockcross* hello
$ make -f Makefile.riscv64
./dockcross-riscv64 bash -c '$CC hello.c -o hello -static'
hello
が生成された。これを使ってシミュレーションしてみよう。
../../../../build/RISCV/gem5.opt ../../../../configs/example/se.py --cmd=hello
**** REAL SIMULATION **** build/RISCV/sim/simulate.cc:192: info: Entering event queue @ 0. Starting simulation... build/RISCV/sim/syscall_emul.cc:85: warn: ignoring syscall set_robust_list(...) (further warnings will be suppressed) FATAL: kernel too old build/RISCV/sim/syscall_emul.cc:85: warn: ignoring syscall rt_sigprocmask(...) (further warnings will be suppressed) build/RISCV/sim/syscall_emul.cc:85: warn: ignoring syscall rt_sigaction(...) (further warnings will be suppressed) build/RISCV/sim/debug.cc:89: warn: need to stop all queues zsh: trace trap (core dumped) ../../../../build/RISCV/gem5.opt ../../../../configs/example/se.py --cmd=hello
あれれ、パニックになってしまった。FATAL: kernel too old
の原因を探るのは後として、とりあえず実行できるバイナリを作るためにはどうしたらいいのかな?
もう普通にビルドしてみる。
$ riscv64-unknown-elf-gcc hello.c -o hello.bare.riscv $ ../../../../build/RISCV/gem5.opt ../../../../configs/example/se.py --cmd=hello.bare.riscv
これは上手くいったようだ。どうもDockerコンテナを使わない方がいいっぽいなあ。
**** REAL SIMULATION **** build/RISCV/sim/simulate.cc:192: info: Entering event queue @ 0. Starting simulation... Hello world! Exiting @ tick 1371000 because exiting with last active thread context