分1232017年には新しい命令セットアーキテクチャである「RISC-V」の話題が盛り上がりました。今回はUbuntu上でRISC-V用のツールチェインをエミュレーターを導入し,実行してみましょう。Architecture)です。ISAとは,コンピューター・アーキテクチャに対するソフトウェア側のインターフェースを定義したもので,要するに「こういう命令を送れば,このコンピューターはこう動きます」という決まり事をひとつにまとめた規格です。64や,スマートフォンで一般的なARMv7/ARMv8などが存在します(※1⁠)⁠。任意のプログラムを実行できるコンピューターは,何らかのISAを持っており,ソースコードはそのISAに基づいて実行可能なバイナリデータへと変換されます。このため同じソースコードであっても,ARMv8向けに作られた実行可能なバイナリデータを,AMD64上でそのまま実行することはできません。※1実際にCPUを作るためには,ISAに従った動作にするために「どう作るか」を定めるマイクロアーキテクチャなど,他にも様々な事柄を決める必要があります。Foundationの元にGoogleやNVIDIAといった名だたる企業が参加している新進気鋭のISAです。新しいというだけでなく,70を超える企業・団体が参画している点も注目すべき特徴と言えるでしょう。RISC-Vが注目されている理由のひとつが,オープン規格であるということです。一般的にISAやその策定作業は開発する企業(チップベンダー)の特許やらノウハウやら機密の塊です。少なくともISAの新しいバージョンを,どのタイミングでどのようにリリースするかは開発する企業が決めますし,リリースされたISAに従ったCPUを作るためには相応のライセンス料を支払う必要があります。ベンダーが膨大な開発費をかけて作ったものであるから,当然と言えば当然の話です。Foundationの成果物は原則として公開されています。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を利用します。LTS以上であれば特に問題ないでしょう。5.3で動作を確認しています。LXDを使っているなら,LXD上に環境を構築すると良いでしょう。submoduleを使って取り込んでいます。これらのリポジトリを一通りビルドするにはそれなりの時間が必要です。LXD上のクリーンな環境で構築した環境をコンテナイメージとしてアーカイブしておけば,他のマシンでも簡単に流用できます。Dockerなどの他のコンテナ技術を使うのも一つの手です(※2⁠)⁠。※2ただし権限の都合上,LXDの初期設定ではルートファイルシステムイメージの作成ができないことに注意してください。これについては次回以降に説明します。以下に,一般的なLXDのインストール手順を紹介しておきます。LXDを使わなくても問題はありません。-yクロスコンパイル環境の構築まずはRISC-Vのツールチェインをビルドするためのツールチェインを導入しましょう。submoduleを導入します。submoduleのsubmoduleなどもダウンロードするため,それなりに時間がかかります。--recursivesubmoduleのダウンロード後にディレクトリのサイズを確認したところ,2.8GiB程度使用していました。riscv-tools本体はただのビルドスクリプトで,ビルド対象はすべてsubmoduleとして外部参照しています。それぞれのツールは以下のとおりです。riscv-isa-sim:RISC-Vの簡易シミュレーターです。(HTIF)を経由してターゲットプロセッサーと通信します。ホスト上のシミュレーター上で動かすことを想定しています。riscv-opcodes:オペコードの定義リストです。riscv-tests:テストツールです。riscv-llvm:LLVMにRISC-Vサポートを追加したコードです。riscv-gnu-toolchain:GCCやglibc,qemuなどGNUツールチェインやエミュレーターです。riscv-openocd:JTAG-ICEにも対応したデバッガです。ビルドしたツールは環境変数RISCVの先にインストールされるようになっています。そこで今回はホームディレクトリに任意のディレクトリを作って,環境変数をexportしておきましょう(※3⁠)⁠。※3RISCVの値は./configureの--prefixオプションに渡しているだけなので,build.shを見ながら自分で実行しても良いでしょう。RISCV=$HOME/riscv/あとはビルドスクリプトを実行するだけです。5m59.994sIvyBridge世代でi5-3317UのCPUと4GiBのメモリーで,1時間ちょっとぐらいだったので今風のPCならもう少し早く終わるでしょう。build.shからはパラレルビルドする方法がわからなかったのですが,個別に「-j」オプションを付けてmakeコマンドを実行すればさらに早くなるものと思います。コンパイル後の$RISCVの下には400MiB弱のバイナリが用意されることになります。