シレっとRISC-Vメーリングリストに投稿されたこれ、QEMUの開発者でもあるFabrice BellardがRISC-Vの128bitモードまで対応したエミュレータを開発したという話だ。
ダウンロードとビルド
ダウンロードしてみるとソースコードの量も少なく非常にシンプル、こんなのでRISC-Vをサポートしてしまうのか。
makeを一発叩くだけでビルドできるのだが、私の環境の場合ではfreadのエラーを回避するためにオプションを若干変更する必要があった。
gcc -O2 -Wall -g -Werror -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -MMD -DCONFIG_VERSION=\"2016-12-20.1\" -DMAX_XLEN=32 -c -o riscvemu32.o riscvemu.c riscvemu.c: In function ‘bf_read_async’: riscvemu.c:2659:17: error: ignoring return value of ‘fread’, declared with attribute warn_unused_result [-Werror=unused-result] fread(buf, 1, SECTOR_SIZE, bf->f); ^ riscvemu.c:2668:9: error: ignoring return value of ‘fread’, declared with attribute warn_unused_result [-Werror=unused-result] fread(buf, 1, n * SECTOR_SIZE, bf->f);
以下変更内容。
# CFLAGS=-O2 -Wall -g -Werror -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -MMD
CFLAGS=-O2 -Wall -g -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -MMD
riscvemu32
, riscvemu64
, riscvemu128
の以下の3つのファイルが作成される。デフォルトではriscvemu64
がriscvemu
にシンボリックリンクが通されていた。
riscvemuを動作させる
riscvemuの実行方法
通常はバイナリファイルのみを指定する。こちらは既に提供されているrv128test.binの実行結果。
$ ./riscvemu rv128test.bin RISCV dynamic base ISA change: RV64I: max register value=18446744073709551615 FP64: sqrt(2)=1.414213562373095 RV32I: max register value=4294967295 FP32: sqrt(2)=1.414213 Power off.
risvemuを利用したSimple Linuxの起動
次はLinuxだ。Linuxのブートローダとファイルシステムもダウンロードしてくる。
RISC-V boot loader, Linux kernel and disk image: diskimage-linux-riscv64-2016-12-19.1.tar.gz.
シンプルなディスクイメージと、Fedoraのディスクイメージがアップロードされていた。 ブートローダとファイルイメージを指定するだけで起動することが出来る。
./riscvemu diskimage-linux-riscv64-2016-12-19.1/bbl.bin diskimage-linux-riscv64-2016-12-19.1/root.bin vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvv rrrrrrrrrrrrr vvvvvvvvvvvvvvvvvvvvvv rr vvvvvvvvvvvvvvvvvvvvvv rr vvvvvvvvvvvvvvvvvvvvvvvv rr rrrr vvvvvvvvvvvvvvvvvvvvvvvvvv rrrr rrrrrr vvvvvvvvvvvvvvvvvvvvvv rrrrrr rrrrrrrr vvvvvvvvvvvvvvvvvv rrrrrrrr rrrrrrrrrr vvvvvvvvvvvvvv rrrrrrrrrr rrrrrrrrrrrr vvvvvvvvvv rrrrrrrrrrrr rrrrrrrrrrrrrr vvvvvv rrrrrrrrrrrrrr rrrrrrrrrrrrrrrr vv rrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrrrr rrrrrrrrrrrrrrrrrrrrrr INSTRUCTION SETS WANT TO BE FREE [ 0.000000] Linux version 4.6.2-00042-g8493175-dirty (bellard@localhost.localdomain) (gcc version 6.1.0 (GCC) ) #2 Mon Dec 19 23:12:51 CET 2016 [ 0.000000] Available physical memory: 252MB [ 0.000000] Zone ranges: [ 0.000000] Normal [mem 0x0000000080400000-0x000000008fffffff] ... [ 0.380000] devtmpfs: mounted [ 0.380000] Freeing unused kernel memory: 56K (ffffffff80000000 - ffffffff8000e000) [ 0.380000] This architecture does not have kernel memory protection. Welcome to RISCVEMU (64 bits) sh-4.3#
ちなみに、この起動30秒もかかっていない。こんなに高速にLinuxの起動をエミュレートすることが出来るなんて。。。
lsするとhello.cもある。これをRISC-Vバイナリとしてコンパイルすることも出来る。
sh-4.3# ls hello.c readme.txt rv128test.bin sh-4.3# cat hello.c /* This C source can be compiled with: gcc -o hello hello.c */ #include <stdlib.h> #include <stdio.h> int main(int argc, char **argv) { printf("Hello World\n"); return 0; } sh-4.3# gcc hello.c -o hello sh-4.3# ./hello Hello World
ただしこのイメージ、シャットダウンが出来ん。どうしたらいいの。。。
Fedoraのディスクイメージでの起動
ブートローダはRISC-Vのbbl、ディスクイメージは同じくHPにアップロードされているfedoraのものを利用してみる。
./riscvemu diskimage-linux-riscv64-2016-12-19.1/bbl.bin stage4-disk.img
起動した!ということは、RocketChipを使えばFedoraのイメージを起動させることが出来るんじゃないの?
2018/08/05追記。いつの間にかバージョンアップされてすごいことになっている... JSONでコンフィグレーションを記述するらしい。前のバージョンみたいにFedoraの起動するさまをジックリ見られないけど...
$ curl -L https://bellard.org/riscvemu/riscvemu-2017-08-06.tar.gz | tar xz $ make $ sudo make install
起動するのには、JSONファイルで設定を記述するか、https経由でJSONファイルの位置を記述する。
$ riscvemu https://bellard.org/jslinux/fedora25-riscv.cfg Welcome to Fedora 25 (riscv64) Note: systemd is disabled sh-4.3#
$ riscvemu https://bellard.org/jslinux/buildroot-riscv64.cfg Welcome to JS/Linux (riscv64) Use 'vflogin username' to connect to your account. You can create a new account at https://vfsync.org/signup . Use 'export_file filename' to export a file to your computer. Imported files are written to the home directory. [root@localhost ~]#
ちなみに、設定ファイル群とパッチも https://bellard.org/riscvemu/diskimage-linux-riscv-2017-08-06.2.tar.gz 経由でダウンロードすることができる。