RISC-V にっき

夏らしく日記っぽく。したのほうがあたらしいです。

2019/8/5

RISC-V 向けのビルドツールのインストール

$ sudo apt-get install git autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev
$ git clone https://github.com/riscv/riscv-gnu-toolchain
$ git submodule update --init --recursive
  --> 9.2GBくらいになる
$ cd riscv-gnu-toolchain
$ sudo mkdir /opt/riscv
$ ./configure --prefix=/opt/riscv
$ sudo make

2019/8/6

インストールできたバイナリたち

$ find /opt/riscv/bin -type f
/opt/riscv/bin/riscv64-unknown-elf-addr2line
/opt/riscv/bin/riscv64-unknown-elf-readelf
/opt/riscv/bin/riscv64-unknown-elf-gcc
/opt/riscv/bin/riscv64-unknown-elf-objcopy
/opt/riscv/bin/riscv64-unknown-elf-run
/opt/riscv/bin/riscv64-unknown-elf-size
/opt/riscv/bin/riscv64-unknown-elf-gcc-ar
/opt/riscv/bin/riscv64-unknown-elf-c++
/opt/riscv/bin/riscv64-unknown-elf-gcov-dump
/opt/riscv/bin/riscv64-unknown-elf-strip
/opt/riscv/bin/riscv64-unknown-elf-gcc-ranlib
/opt/riscv/bin/riscv64-unknown-elf-objdump
/opt/riscv/bin/riscv64-unknown-elf-elfedit
/opt/riscv/bin/riscv64-unknown-elf-cpp
/opt/riscv/bin/riscv64-unknown-elf-gdb-add-index
/opt/riscv/bin/riscv64-unknown-elf-strings
/opt/riscv/bin/riscv64-unknown-elf-gcov
/opt/riscv/bin/riscv64-unknown-elf-ld
/opt/riscv/bin/riscv64-unknown-elf-g++
/opt/riscv/bin/riscv64-unknown-elf-gcov-tool
/opt/riscv/bin/riscv64-unknown-elf-gcc-nm
/opt/riscv/bin/riscv64-unknown-elf-nm
/opt/riscv/bin/riscv64-unknown-elf-gcc-8.3.0
/opt/riscv/bin/riscv64-unknown-elf-gprof
/opt/riscv/bin/riscv64-unknown-elf-gdb
/opt/riscv/bin/riscv64-unknown-elf-ld.bfd
/opt/riscv/bin/riscv64-unknown-elf-as
/opt/riscv/bin/riscv64-unknown-elf-ar
/opt/riscv/bin/riscv64-unknown-elf-ranlib
/opt/riscv/bin/riscv64-unknown-elf-c++filt

不要な git レポジトリは削除しておくのがいい。 今回はgcp上につくったので、ストレージの費用は大切。

Spike(エミュレータ)のインストール

ビルド後でも300MBちょっと。おさいふにやさしい。

$ sudo apt install device-tree-compiler
$ git clone https://github.com/riscv/riscv-isa-sim.git
$ cd riscv-isa-sim
$ mkdir build
$ cd build
$ ../configure --prefix=/opt/riscv
$ make
$ sudo make install

Hello World プログラムをつくって spike pk hello とでためしてみるとエラー。 どうやら riscv-pk (proxy kernel) をわすれているようだ。

https://forums.sifive.com/t/an-error-when-running-spike/1247

riscv-pk のインストール

$ git clone https://github.com/riscv/riscv-pk.git
$ cd riscv-pk
$ mkdir build
$ cd build
$ ../configure --prefix=/opt/riscv --host=riscv64-unknown-elf
$ make
$ sudo make install

これでひとあんしん。hello, world ができた。

2019/8/7

bbl loader とはなにか

ハローワールドでもそうだが、なにもしないプログラムでも bbl loader という文字列が標準出力される。

$ cat main.c
int main () { return 0; }
$ riscv64-unknown-elf-gcc main.c
$ spike pk ./a.out 
bbl loader

pk とはなにかという話になるとおもうんだけど、 pk は Proxy Kernel とのことで、どうやらホストのカーネルで実行させている雰囲気。 ltrace でなにが呼ばれているかみようとしたが、6MB程度のファイルになった。

$ ltrace -o ltrace.log spike pk ./a.out
$ ls -lh ltrace.log
-rw-r--r-- 1 user user 5.7M Aug  6 23:06 ltrace.log

みてみると、bbl loader は write システムコールで出力されているようだ。 ちなみに _Znwm_ZdlPv は C++ の newdelete に対応するらしい。 https://stackoverflow.com/questions/47337760/what-does-znwm-and-zdlpv-mean-in-assembly

write(1, "b", 1)                                                                                                     = 1
_ZdlPv(0x559ed3ed5f10, 0x7ffc89064960, 3, 0x7f7e2fb021b0)                                                            = 0
_ZdlPv(0x559ed3ed5ef0, 0x7ffc89064a00, 3, 0)                                                                         = 0x559ed3ed5f00
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064b30, 3, 0x559ed3ed5f00)                                                            = 0x559ed3ed5ee0
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064ab0, 3, 0x559ed3ed5ee0)                                                            = 0x559ed3ed5ec0
swapcontext(0x559ed3ec5470, 0x559ed3e7a7c0, 0x559ed3ea0ec0, 0x8000a)                                                 = 0
swapcontext(0x559ed3e7a7c0, 0x559ed3ec5470, 0x7ffc89065028, 0x7f7e2fee5010)                                          = 0
memset(0x7ffc89064940, '\0', 8)                                                                                      = 0x7ffc89064940
_Znwm(16, 0x7ffc89064a60, 2, 0)                                                                                      = 0x559ed3ed5eb0
_Znwm(16, 0x7ffc89064a80, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5ed0
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064a80, 3, 0x7f7e2f04bb00)                                                            = 0x559ed3ed5ee0
_Znwm(16, 0x7ffc89064ab0, 2, 0x559ed3ed5ee0)                                                                         = 0x559ed3ed5eb0
_Znwm(16, 0x7ffc89064b30, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5ef0
_Znwm(16, 0x7ffc89064a00, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5f10
write(1, "b", 1)                                                                                                     = 1
_ZdlPv(0x559ed3ed5f10, 0x7ffc89064960, 3, 0x7f7e2fb021b0)                                                            = 0
_ZdlPv(0x559ed3ed5ef0, 0x7ffc89064a00, 3, 0)                                                                         = 0x559ed3ed5f00
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064b30, 3, 0x559ed3ed5f00)                                                            = 0x559ed3ed5ee0
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064ab0, 3, 0x559ed3ed5ee0)                                                            = 0x559ed3ed5ea0
swapcontext(0x559ed3ec5470, 0x559ed3e7a7c0, 0x559ed3ea0ec0, 0x8000a)                                                 = 0
swapcontext(0x559ed3e7a7c0, 0x559ed3ec5470, 0x7ffc89065028, 0x7f7e2fee5010)                                          = 0
memset(0x7ffc89064940, '\0', 8)                                                                                      = 0x7ffc89064940
_Znwm(16, 0x7ffc89064a60, 2, 0)                                                                                      = 0x559ed3ed5ed0
_Znwm(16, 0x7ffc89064a80, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5eb0
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064a80, 3, 0x7f7e2f04bb00)                                                            = 0x559ed3ed5ee0
_Znwm(16, 0x7ffc89064ab0, 2, 0x559ed3ed5ee0)                                                                         = 0x559ed3ed5ed0
_Znwm(16, 0x7ffc89064b30, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5ef0
_Znwm(16, 0x7ffc89064a00, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5f10
write(1, "l", 1)                                                                                                     = 1
_ZdlPv(0x559ed3ed5f10, 0x7ffc89064960, 3, 0x7f7e2fb021b0)                                                            = 0
_ZdlPv(0x559ed3ed5ef0, 0x7ffc89064a00, 3, 0)                                                                         = 0x559ed3ed5f00
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064b30, 3, 0x559ed3ed5f00)                                                            = 0x559ed3ed5ee0
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064ab0, 3, 0x559ed3ed5ee0)                                                            = 0x559ed3ed5ec0
swapcontext(0x559ed3ec5470, 0x559ed3e7a7c0, 0x559ed3ea0ec0, 0x8000a)                                                 = 0
swapcontext(0x559ed3e7a7c0, 0x559ed3ec5470, 0x7ffc89065028, 0x7f7e2fee5010)                                          = 0
memset(0x7ffc89064940, '\0', 8)                                                                                      = 0x7ffc89064940
_Znwm(16, 0x7ffc89064a60, 2, 0)                                                                                      = 0x559ed3ed5eb0
_Znwm(16, 0x7ffc89064a80, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5ed0
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064a80, 3, 0x7f7e2f04bb00)                                                            = 0x559ed3ed5ee0
_Znwm(16, 0x7ffc89064ab0, 2, 0x559ed3ed5ee0)                                                                         = 0x559ed3ed5eb0
_Znwm(16, 0x7ffc89064b30, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5ef0
_Znwm(16, 0x7ffc89064a00, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5f10
write(1, " ", 1)                                                                                                     = 1
_ZdlPv(0x559ed3ed5f10, 0x7ffc89064960, 3, 0x7f7e2fb021b0)                                                            = 0
_ZdlPv(0x559ed3ed5ef0, 0x7ffc89064a00, 3, 0)                                                                         = 0x559ed3ed5f00
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064b30, 3, 0x559ed3ed5f00)                                                            = 0x559ed3ed5ee0
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064ab0, 3, 0x559ed3ed5ee0)                                                            = 0x559ed3ed5ea0
swapcontext(0x559ed3ec5470, 0x559ed3e7a7c0, 0x559ed3ea0ec0, 0x8000a)                                                 = 0
swapcontext(0x559ed3e7a7c0, 0x559ed3ec5470, 0x7ffc89065028, 0x7f7e2fee5010)                                          = 0
memset(0x7ffc89064940, '\0', 8)                                                                                      = 0x7ffc89064940
_Znwm(16, 0x7ffc89064a60, 2, 0)                                                                                      = 0x559ed3ed5ed0
_Znwm(16, 0x7ffc89064a80, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5eb0
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064a80, 3, 0x7f7e2f04bb00)                                                            = 0x559ed3ed5ee0
_Znwm(16, 0x7ffc89064ab0, 2, 0x559ed3ed5ee0)                                                                         = 0x559ed3ed5ed0
_Znwm(16, 0x7ffc89064b30, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5ef0
_Znwm(16, 0x7ffc89064a00, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5f10
write(1, "l", 1)                                                                                                     = 1
_ZdlPv(0x559ed3ed5f10, 0x7ffc89064960, 3, 0x7f7e2fb021b0)                                                            = 0
_ZdlPv(0x559ed3ed5ef0, 0x7ffc89064a00, 3, 0)                                                                         = 0x559ed3ed5f00
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064b30, 3, 0x559ed3ed5f00)                                                            = 0x559ed3ed5ee0
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064ab0, 3, 0x559ed3ed5ee0)                                                            = 0x559ed3ed5ec0
swapcontext(0x559ed3ec5470, 0x559ed3e7a7c0, 0x559ed3ea0ec0, 0x8000a)                                                 = 0
swapcontext(0x559ed3e7a7c0, 0x559ed3ec5470, 0x7ffc89065028, 0x7f7e2fee5010)                                          = 0
memset(0x7ffc89064940, '\0', 8)                                                                                      = 0x7ffc89064940
_Znwm(16, 0x7ffc89064a60, 2, 0)                                                                                      = 0x559ed3ed5eb0
_Znwm(16, 0x7ffc89064a80, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5ed0
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064a80, 3, 0x7f7e2f04bb00)                                                            = 0x559ed3ed5ee0
_Znwm(16, 0x7ffc89064ab0, 2, 0x559ed3ed5ee0)                                                                         = 0x559ed3ed5eb0
_Znwm(16, 0x7ffc89064b30, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5ef0
_Znwm(16, 0x7ffc89064a00, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5f10
write(1, "o", 1)                                                                                                     = 1
_ZdlPv(0x559ed3ed5f10, 0x7ffc89064960, 3, 0x7f7e2fb021b0)                                                            = 0
_ZdlPv(0x559ed3ed5ef0, 0x7ffc89064a00, 3, 0)                                                                         = 0x559ed3ed5f00
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064b30, 3, 0x559ed3ed5f00)                                                            = 0x559ed3ed5ee0
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064ab0, 3, 0x559ed3ed5ee0)                                                            = 0x559ed3ed5ea0
swapcontext(0x559ed3ec5470, 0x559ed3e7a7c0, 0x559ed3ea0ec0, 0x8000a)                                                 = 0
swapcontext(0x559ed3e7a7c0, 0x559ed3ec5470, 0x7ffc89065028, 0x7f7e2fee5010)                                          = 0
memset(0x7ffc89064940, '\0', 8)                                                                                      = 0x7ffc89064940
_Znwm(16, 0x7ffc89064a60, 2, 0)                                                                                      = 0x559ed3ed5ed0
_Znwm(16, 0x7ffc89064a80, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5eb0
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064a80, 3, 0x7f7e2f04bb00)                                                            = 0x559ed3ed5ee0
_Znwm(16, 0x7ffc89064ab0, 2, 0x559ed3ed5ee0)                                                                         = 0x559ed3ed5ed0
_Znwm(16, 0x7ffc89064b30, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5ef0
_Znwm(16, 0x7ffc89064a00, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5f10
write(1, "a", 1)                                                                                                     = 1
_ZdlPv(0x559ed3ed5f10, 0x7ffc89064960, 3, 0x7f7e2fb021b0)                                                            = 0
_ZdlPv(0x559ed3ed5ef0, 0x7ffc89064a00, 3, 0)                                                                         = 0x559ed3ed5f00
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064b30, 3, 0x559ed3ed5f00)                                                            = 0x559ed3ed5ee0
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064ab0, 3, 0x559ed3ed5ee0)                                                            = 0x559ed3ed5ec0
swapcontext(0x559ed3ec5470, 0x559ed3e7a7c0, 0x559ed3ea0ec0, 0x8000a)                                                 = 0
swapcontext(0x559ed3e7a7c0, 0x559ed3ec5470, 0x7ffc89065028, 0x7f7e2fee5010)                                          = 0
memset(0x7ffc89064940, '\0', 8)                                                                                      = 0x7ffc89064940
_Znwm(16, 0x7ffc89064a60, 2, 0)                                                                                      = 0x559ed3ed5eb0
_Znwm(16, 0x7ffc89064a80, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5ed0
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064a80, 3, 0x7f7e2f04bb00)                                                            = 0x559ed3ed5ee0
_Znwm(16, 0x7ffc89064ab0, 2, 0x559ed3ed5ee0)                                                                         = 0x559ed3ed5eb0
_Znwm(16, 0x7ffc89064b30, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5ef0
_Znwm(16, 0x7ffc89064a00, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5f10
write(1, "d", 1)                                                                                                     = 1
_ZdlPv(0x559ed3ed5f10, 0x7ffc89064960, 3, 0x7f7e2fb021b0)                                                            = 0
_ZdlPv(0x559ed3ed5ef0, 0x7ffc89064a00, 3, 0)                                                                         = 0x559ed3ed5f00
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064b30, 3, 0x559ed3ed5f00)                                                            = 0x559ed3ed5ee0
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064ab0, 3, 0x559ed3ed5ee0)                                                            = 0x559ed3ed5ea0
swapcontext(0x559ed3ec5470, 0x559ed3e7a7c0, 0x559ed3ea0ec0, 0x8000a)                                                 = 0
swapcontext(0x559ed3e7a7c0, 0x559ed3ec5470, 0x7ffc89065028, 0x7f7e2fee5010)                                          = 0
memset(0x7ffc89064940, '\0', 8)                                                                                      = 0x7ffc89064940
_Znwm(16, 0x7ffc89064a60, 2, 0)                                                                                      = 0x559ed3ed5ed0
_Znwm(16, 0x7ffc89064a80, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5eb0
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064a80, 3, 0x7f7e2f04bb00)                                                            = 0x559ed3ed5ee0
_Znwm(16, 0x7ffc89064ab0, 2, 0x559ed3ed5ee0)                                                                         = 0x559ed3ed5ed0
_Znwm(16, 0x7ffc89064b30, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5ef0
_Znwm(16, 0x7ffc89064a00, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5f10
write(1, "e", 1)                                                                                                     = 1
_ZdlPv(0x559ed3ed5f10, 0x7ffc89064960, 3, 0x7f7e2fb021b0)                                                            = 0
_ZdlPv(0x559ed3ed5ef0, 0x7ffc89064a00, 3, 0)                                                                         = 0x559ed3ed5f00
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064b30, 3, 0x559ed3ed5f00)                                                            = 0x559ed3ed5ee0
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064ab0, 3, 0x559ed3ed5ee0)                                                            = 0x559ed3ed5ec0
swapcontext(0x559ed3ec5470, 0x559ed3e7a7c0, 0x559ed3ea0ec0, 0x8000a)                                                 = 0
swapcontext(0x559ed3e7a7c0, 0x559ed3ec5470, 0x7ffc89065028, 0x7f7e2fee5010)                                          = 0
memset(0x7ffc89064940, '\0', 8)                                                                                      = 0x7ffc89064940
_Znwm(16, 0x7ffc89064a60, 2, 0)                                                                                      = 0x559ed3ed5eb0
_Znwm(16, 0x7ffc89064a80, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5ed0
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064a80, 3, 0x7f7e2f04bb00)                                                            = 0x559ed3ed5ee0
_Znwm(16, 0x7ffc89064ab0, 2, 0x559ed3ed5ee0)                                                                         = 0x559ed3ed5eb0
_Znwm(16, 0x7ffc89064b30, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5ef0
_Znwm(16, 0x7ffc89064a00, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5f10
write(1, "r", 1)                                                                                                     = 1
_ZdlPv(0x559ed3ed5f10, 0x7ffc89064960, 3, 0x7f7e2fb021b0)                                                            = 0
_ZdlPv(0x559ed3ed5ef0, 0x7ffc89064a00, 3, 0)                                                                         = 0x559ed3ed5f00
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064b30, 3, 0x559ed3ed5f00)                                                            = 0x559ed3ed5ee0
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064ab0, 3, 0x559ed3ed5ee0)                                                            = 0x559ed3ed5ea0
swapcontext(0x559ed3ec5470, 0x559ed3e7a7c0, 0x559ed3ea0ec0, 0x8000a)                                                 = 0
swapcontext(0x559ed3e7a7c0, 0x559ed3ec5470, 0x7ffc89065028, 0x7f7e2fee5010)                                          = 0
memset(0x7ffc89064940, '\0', 8)                                                                                      = 0x7ffc89064940
_Znwm(16, 0x7ffc89064a60, 2, 0)                                                                                      = 0x559ed3ed5ed0
_Znwm(16, 0x7ffc89064a80, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5eb0
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064a80, 3, 0x7f7e2f04bb00)                                                            = 0x559ed3ed5ee0
_Znwm(16, 0x7ffc89064ab0, 2, 0x559ed3ed5ee0)                                                                         = 0x559ed3ed5ed0
_Znwm(16, 0x7ffc89064b30, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5ef0
_Znwm(16, 0x7ffc89064a00, 2, 0x7f7e2f04bb00)                                                                         = 0x559ed3ed5f10
write(1, "\r", 1)                                                                                                    = 1
_ZdlPv(0x559ed3ed5f10, 0x7ffc89064960, 3, 0x7f7e2fb021b0)                                                            = 0
_ZdlPv(0x559ed3ed5ef0, 0x7ffc89064a00, 3, 0)                                                                         = 0x559ed3ed5f00
_ZdlPv(0x559ed3ed5ed0, 0x7ffc89064b30, 3, 0x559ed3ed5f00)                                                            = 0x559ed3ed5ee0
_ZdlPv(0x559ed3ed5eb0, 0x7ffc89064ab0, 3, 0x559ed3ed5ee0)                                                            = 0x559ed3ed5ec0
swapcontext(0x559ed3ec5470, 0x559ed3e7a7c0, 0x559ed3ea0ec0, 0x8000a)                                                 = 0