Ubuntu Weekly Recipe

第505回 オープン規格の新しい命令セットアーキテクチャRISC-V入門 ツールチェインを用意する

この記事を読むのに必要な時間:およそ 9 分

2017年には新しい命令セットアーキテクチャである「RISC-V」の話題が盛り上がりました。今回はUbuntu上でRISC-V用のツールチェインをエミュレーターを導入し,実行してみましょう。

はじめに

RISC-V(りすく・ふぁいぶ)はRISC-V Foundationが開発を主導している新しい命令セットアーキテクチャ(ISA:Instruction Set Architecture)です。

ISAとは,コンピューター・アーキテクチャに対するソフトウェア側のインターフェースを定義したもので,要するに「こういう命令を送れば,このコンピューターはこう動きます」という決まり事をひとつにまとめた規格です。ISAにはたとえばAMD/Intel系の64bit CPUで使われているAMD64/Intel 64や,スマートフォンで一般的なARMv7/ARMv8などが存在します※1)⁠任意のプログラムを実行できるコンピューターは,何らかのISAを持っており,ソースコードはそのISAに基づいて実行可能なバイナリデータへと変換されます。このため同じソースコードであっても,ARMv8向けに作られた実行可能なバイナリデータを,AMD64上でそのまま実行することはできません。

※1
実際にCPUを作るためには,ISAに従った動作にするために「どう作るか」を定めるマイクロアーキテクチャなど,他にも様々な事柄を決める必要があります。

RISC-Vは2010年頃からカリフォルニア大学バークレー校で設計が始まり,現在ではRISC-V Foundationの元にGoogleやNVIDIAといった名だたる企業が参加している新進気鋭のISAです。単に新しいというだけでなく,70を超える企業・団体が参画している点も注目すべき特徴と言えるでしょう。

RISC-Vが注目されている理由のひとつが,オープン規格であるということです。一般的にISAやその策定作業は開発する企業(チップベンダー)の特許やらノウハウやら機密の塊です。少なくともISAの新しいバージョンを,どのタイミングでどのようにリリースするかは開発する企業が決めますし,リリースされたISAに従ったCPUを作るためには相応のライセンス料を支払う必要があります。ベンダーが膨大な開発費をかけて作ったものであるから,当然と言えば当然の話です。

それに対してRISC-V Foundationは複数の企業・団体・個人に開かれた非営利団体であり,RISC-V Foundationの成果物は原則として公開されています。たとえばISAマニュアルはCreative Commons BY 4.0で提供されていますし,RISC-Vベースの製品を展開しているSiFiveもRTL(Register Transfer Level)から開発ツールに至るまで主にApache License 2.0のもとGitHub上で公開しています。ソフトウェアで行われたFLOSSのムーブメントをハードウェアでも実現しようとしているわけです。

RISC-V用のツールチェインについて

残念ながらRISC-Vは,UbuntuはもとよりDebianでもサポートアーキテクチャになっていません。よってRISC-Vのバイナリを作成するためには,GCCやbinutilsといったツールチェインから自分で構築する必要があります。GCCなどにRISC-Vのサポートが取り込まれたのもごく最近なので,当面はこの状態が続くでしょう。

特定のアーキテクチャの実機が存在しない場合や存在したとしてもコンパイルするのにリソースが足りない場合は,より高速でリソースも十分にあるホストマシン上でターゲットアーキテクチャのバイナリを「クロスコンパイル」することが一般的です。おそらく大半の読者はRISC-Vの実機を持っていないと思われますので,今回もRISC-Vバイナリの構築は,amd64アーキテクチャのホスト上でビルドすることにしましょう。

幸いriscv-toolsと呼ばれるツールチェインを一括してビルドするスクリプトが用意されているので,十分に高速でビルド時によくわからないSEGVを起こさないようなマシンがあれば,簡単にクロスコンパイル環境を構築できます。

もちろんツールチェインをビルドするためのツールチェインが必要になりますが,これはホストマシンにパッケージ管理システムからインストールできるGCCを利用します。riscv-toolsの構築にはGCC-4.8以上が必要とのことなので,Ubuntu 14.04 LTS以上であれば特に問題ないでしょう。今回はすべてUbuntu 16.04 LTS上のGCC 5.3で動作を確認しています。

LXDを使っているなら,LXD上に環境を構築すると良いでしょう。riscv-toolsはさまざまな外部リポジトリをgit submoduleを使って取り込んでいます。これらのリポジトリを一通りビルドするにはそれなりの時間が必要です。LXD上のクリーンな環境で構築した環境をコンテナイメージとしてアーカイブしておけば,他のマシンでも簡単に流用できます。もちろんDockerなどの他のコンテナ技術を使うのも一つの手です※2)⁠

※2
ただし権限の都合上,LXDの初期設定ではルートファイルシステムイメージの作成ができないことに注意してください。これについては次回以降に説明します。

以下に,一般的なLXDのインストール手順を紹介しておきます。もちろんLXDを使わなくても問題はありません。

1. LXDのインストール
$ sudo snap install lxd

2. LXDの初期設定
$ sudo lxd init
Do you want to configure a new storage pool (yes/no) [default=yes]?
Name of the new storage pool [default=default]:
Name of the storage backend to use (dir, btrfs, ceph, lvm, zfs) [default=zfs]:
Create a new ZFS pool (yes/no) [default=yes]?
Would you like to use an existing block device (yes/no) [default=no]?
Size in GB of the new loop device (1GB minimum) [default=23GB]:
Would you like LXD to be available over the network (yes/no) [default=no]?
Would you like stale cached images to be updated automatically (yes/no) [default=yes]?
Would you like to create a new network bridge (yes/no) [default=yes]?
What should the new bridge be called [default=lxdbr0]?
What IPv4 address should be used (CIDR subnet notation, “auto” or “none”) [default=auto]?
What IPv6 address should be used (CIDR subnet notation, “auto” or “none”) [default=auto]?
LXD has been successfully configured.

3. ユーザーをLXDグループに追加
$ sudo adduser $USER lxd

4. コンテナイメージの作成
$ lxc launch ubuntu:16.04 riscv
$ lxc exec riscv bash

5. SSH公開鍵の登録
$ sudo -i -u ubuntu ssh-import-id gh:(GitHubのアカウント名)
$ apt update
$ apt full-upgrade -y

クロスコンパイル環境の構築

まずはRISC-Vのツールチェインをビルドするためのツールチェインを導入しましょう。

$ sudo apt install autoconf automake autotools-dev curl \
    device-tree-compiler libmpc-dev libmpfr-dev libgmp-dev \
    libusb-1.0-0-dev gawk build-essential bison flex texinfo \
    gperf libtool patchutils bc zlib1g-dev pkg-config libncurses5-dev

次にriscv-toolsリポジトリとそのgit submoduleを導入します。submoduleのsubmoduleなどもダウンロードするため,それなりに時間がかかります。

$ git clone https://github.com/riscv/riscv-tools.git
$ cd riscv-tools
$ git submodule update --init --recursive

submoduleのダウンロード後にディレクトリのサイズを確認したところ,2.8GiB程度使用していました。

riscv-tools本体はただのビルドスクリプトで,ビルド対象はすべてsubmoduleとして外部参照しています。それぞれのツールは以下のとおりです。

  • riscv-isa-sim:RISC-Vの簡易シミュレーターです。
  • riscv-fesvr:ホスト側で動作する「Front-end server」です。Host-Target InterFace (HTIF)を経由してターゲットプロセッサーと通信します。
  • riscv-pk:最低限のシステムコールを処理するProxy Kernelです。ホスト上のシミュレーター上で動かすことを想定しています。
  • riscv-opcodes:オペコードの定義リストです。
  • riscv-tests:テストツールです。
  • riscv-llvm:LLVMにRISC-Vサポートを追加したコードです。
  • riscv-gnu-toolchain:GCCやglibc,qemuなどGNUツールチェインやエミュレーターです。
  • riscv-openocd:JTAG-ICEにも対応したデバッガです。

ビルドしたツールは環境変数RISCVの先にインストールされるようになっています。そこで今回はホームディレクトリに任意のディレクトリを作って,環境変数をexportしておきましょう※3)⁠

※3
RISCVの値は./configure--prefixオプションに渡しているだけなので,build.shを見ながら自分で実行しても良いでしょう。
$ mkdir $HOME/riscv/
$ export RISCV=$HOME/riscv/

あとはビルドスクリプトを実行するだけです。

$ time ./build.sh
Starting RISC-V Toolchain build process
(中略)
RISC-V Toolchain installation completed!
real    77m30.212s
user    70m26.496s
sys     5m59.994s

IvyBridge世代でi5-3317UのCPUと4GiBのメモリーで,1時間ちょっとぐらいだったので今風のPCならもう少し早く終わるでしょう。また,build.shからはパラレルビルドする方法がわからなかったのですが,個別に-jオプションを付けてmakeコマンドを実行すればさらに早くなるものと思います。

コンパイル後の$RISCVの下には400MiB弱のバイナリが用意されることになります。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入