読者です 読者をやめる 読者になる 読者になる

FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

128bitまで対応したRISC-VエミュレータでLinuxが動く (しかも超高速)

シレっとRISC-Vメーリングリストに投稿されたこれ、QEMUの開発者でもあるFabrice BellardがRISC-Vの128bitモードまで対応したエミュレータを開発したという話だ。

RISCVEMU

groups.google.com

ダウンロードとビルド

ダウンロードしてみるとソースコードの量も少なく非常にシンプル、こんなので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つのファイルが作成される。デフォルトではriscvemu64riscvemuシンボリックリンクが通されていた。

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

f:id:msyksphinz:20161224142802p:plain

起動した!ということは、RocketChipを使えばFedoraのイメージを起動させることが出来るんじゃないの?