🦔

TinyEMU(RISC-Vエミュレータ)を用いてLinuxを動かす

2022/07/30に公開

ESP32でRISC-Vのエミュレータを動かしLinuxを動かす – inajobのいろいろレビューという記事で、ESP32上でLinuxを動かすという内容が紹介されていて知ったTinyEMUというRISC-Vエミュレータを試してみます。

検証環境

  • iMac (24-inch, M1, 2021)
  • macOS Monterey 12.4

Linux VMの準備

M1 Mac上にLinux環境を作るために、今回はMultipassを用います。

$ brew install --cask multipass
$ multipass version
multipass   1.10.1+mac
multipassd  1.10.1+mac

早速VMを作成してみましょう(リソース指定はもっと少なくても良さそう)。

$ multipass launch --cpus 2 --disk 8G --mem 4G --name tinyemu
Launched: tinyemu
$ multipass list
Name                    State             IPv4             Image
tinyemu                 Running           192.168.64.2     Ubuntu 20.04 LTS

VMが立ち上がったので、VM内でコマンド(uname -a)を実行してみます。

$ multipass exec tinyemu -- uname -a
Linux tinyemu 5.4.0-122-generic #138-Ubuntu SMP Wed Jun 22 15:05:39 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux

ちゃんと動いているようですね。

TinyEMUの準備

TinyEMUをVM上のLinuxで使えるようにしましょう。まずはVMにログインします。

$ multipass shell tinyemu

以降は、multipassで作成したVM上で進めていきます。

TinyEMUのドキュメントを参考に、依存ライブラリを入れていきます。

$ sudo apt-get install build-essential libssl-dev libcurl4-openssl-dev

SDLについては、Installation - SDL Wikiを参考にソースからビルドして入れます。その際、以下の点に注意しましょう。

  • SDL1(参考:SourceCode - SDL Wiki)を使うようにする(TinyEMUがSDL1に依存しているので)
  • /usr/include/SDLに入るようconfigure実行時に--prefix /usrを指定
$ git clone https://github.com/libsdl-org/SDL-1.2.git
$ cd SDL-1.2
$ mkdir build
$ cd build
$ ../configure --prefix /usr
$ make
$ sudo make install

依存ライブラリをインストールできたら、TinyEMUをビルドしましょう。

$ wget https://bellard.org/tinyemu/tinyemu-2019-12-21.tar.gz
$ tar zxvf tinyemu-2019-12-21.tar.gz
$ cd tinyemu-2019-12-21
$ make

カレントディレクトリにtemuがビルドされていて、実行できるようになればOK。

$ ./temu --help
temu version 2019-12-21, Copyright (c) 2016-2018 Fabrice Bellard

RISC-Vエミュレータ上でLinuxを動かす

TinyEMUのドキュメントの通りにtemuを実行しましょう。作者によって、JSLinuxのBuildrootが用意されているので、それを使います。

$ ./temu 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 ~]#

起動したー!簡単に動きましたね。

uname -aを実行してみましょう。

[root@localhost ~]# uname -a
Linux localhost 4.15.0-00049-ga3b1e7a-dirty #11 Thu Nov 8 20:30:26 CET 2018 riscv64 GNU/Linux

ちゃんとriscv64アーキテクチャ上で動いていることが確認できました。

おわりに

Buildrootを用意してあげれば、RISC-Vエミュレータ上で他のものも動かせそうな雰囲気。冒頭に挙げたESP32の話と組み合わせると、夢が広がりますね。

参考文献

Discussion