Day1:Risc-Vの開発環境の構築を行ったメモです。
エミュレータの開発を行おうにも正しいバイナリが存在しなければ動作させることができません、そこでRisc-V財団が提供しているRisc-Vのコンパイラをビルドしてみました。Risc-Vのコンパイラのビルド方法は公式ページを見ればかんたんにできると思います。ただRisc-Vのコンパイラはビルド時にアーキテクチャが指定できるのですがそのへんがややこしかったので、そのへんについて書きます。
Risc-Vにはご存知の通りたくさんのサブセットが存在します
- I: 整数演算命令
- M:整数乗算命令
- A:アトミック(マルチコアのためのメモリ管理とかそのへん)
- F:浮動小数点
- D:倍精度
この他にも色々あるけど、二進化十進表現みたいな銀行員しか使わないそうなサブセットもサポートしています。
公式が提供しているコンパイラはビルド前のconfigureで必要なサブセットを指定できます。
./configure --prefix=/opt/riscv --with-arch=rv32gc --with-abi=ilp32d
例えば上記のように指定した場合、まず--prefixはコンパイルしてできたバイナリを保存する場所でです。--with-arcはアーキテクチャを指定するオプションでrv32iにサブセットを書き足すことによって命令セットを指定するできます。例で登場するRV32GCというIMAFDを全部含んだ基本命令セットになります--with-abiはどうも小数点の扱いを指定できるようです。lip32を指定するとソフトfloat、lip32dを指定すると32bitハードfloatを利用が可能になります。
私は整数と乗算だけで良かったので、次のように指定してコンパイルを行いました。
./configure --prefix=/opt/riscv --with-arch=rv3im --with-abi=ilp32
iが整数型の命令でmが乗算命令のサブセットです。浮動小数点はソフトウェアエミュレートで使うよう指定しビルドを行いました。今回の用途ではlinuxのapiを使わない生バイナリを生成すればよかったので、
sudo make -j8
と指定しました。sudoがあるのはmake時にファイルの配置まで行うからです。正直makeとmake install は別々にしてほしい。
するとコンパイル終盤あたりでエラーが発生してしまいました。エラーを見ると「rv3imなんて知らねぇよ」みたいなことが書いてありました。/opt/riscvを確認するとriscv32-unknown-elf-gccまでは生成できていました。そこでコンパイラに-Sオプションを指定してソースコードを食わすとそれっぽいアセンブラができていいました。
これは多分上位互換のアセンブラーにアセンブラファイルを食わせればうまく動くのではないかと考え、
./configure --prefix=/home/[ユーザー名]/riscv --with-arch=rv3gc
でコンパイルを行い、そのなかの中身のbinをopt/riscv/binにコピーしました。
そして次のMakefileのように指定してコンパイルするとちゃんとバイナリが出力されたんだよなぁ
CXX = /opt/riscv/bin/riscv32-unknown-elf-gcc AS = /opt/riscv/bin/riscv32-unknown-elf-as main: main.c $(CXX) -S main.c $(AS) main.s
まだ命令セットを把握しているわけじゃないからアセンブラ読んでもよくわからないんだけど足し算とか定数が見えるから、ちゃんと動いてんのかなコレ?