FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Gem5のチュートリアル "Learning Gem5"をやってみる(番外編: RISC-Vのバイナリをビルドしてシミュレーションする手法)

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

hub.docker.com

$ 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