[RISC-V技術ブログ連載第24回]Rustで作られたRTOSを試す②

RISC-V

1.はじめに

 前回は、現在非常に注目度が高まっている言語であるRustと、そのRustで記述された組込み向けOSであるTockについて、概要や特徴などをご紹介しました。今回は引き続き、Tockを動作させるための環境構築方法をお伝えします。VirtualBoxのインストールから、Tockが動作するまでの一連の手順をまとめてみました。また最後に、RISC-V用に構築したQEMUにてTockの動作を確認するところまでをお伝えできればと思います。

2.環境構築

 Tockの環境構築は、基本的にTock Getting Started Guideに書かれている情報を参考にします。ここには、NixOS、MacOS、Ubuntuの例が載っており、いずれかのOSを利用すると比較的簡単に構築できるようです。今回、Ubuntuを採用することにしますが、より手軽に確認できることを目的として、Windows 10で仮想環境VirtualBox(※1)を利用し、その上にUbuntuをインストールした上でTockの動作環境を構築していくことにします。

 ※1 RISC-V技術ブログ連載第17回でご紹介したWSL2上のUbuntuを利用したかったのですが、標準のWSL2環境ではUSBを認識できず、目標としているRISC-Vボードとの接続が難しいことから、今回はVirtualBoxを使うことにしました。

2.1.用意するもの

 Tockを動作させるための環境構築を行う上で用意したものを以下に挙げます(※2)。

  • ハードウェア
    ノートPC(CPU:Core i7-1185G7, RAM:16GB, SSD:512GB(空き領域:150GB))
  • ソフトウェア
    Windows 10 Pro(バージョン:22H2, OSビルド:19045.2364)
    VirtualBox 6.1.40 r154048
    Ubuntu 22.04.1 LTS

 ※2 インターネット接続ができることを前提としており、そのための設備、環境についての説明は省きます。

2.2.Ubuntuのインストール

 まず、VirtualBox上でUbuntu用の仮想マシンを作成します。仮想ハードディスクのストレージサイズが不足していると、環境構築途中でエラーが発生してしまうため、今回は50GB確保することにしました(※3)。
 次に、Ubuntu 22.04.1 LTSのISOイメージをこちらからダウンロードし、先ほど作成したVirtualBox仮想マシンの仮想ハードディスクとして指定します。
 仮想マシンを起動すると、Ubuntuのインストールが始まります。日本語環境としてインストールウィザードにてインストール作業を進めます。ここで、画面サイズが小さいために下図のように「続ける」ボタンが押せない現象が発生しました。

「続ける」ボタンが押せない

 そこで、[Alt]+[F7]キーを押下し、カーソルキーまたはマウス操作で画面を移動することで、「続ける」ボタンが押せるようになりました。

「続ける」ボタンが現れて押せるようになった

 Ubuntuのインストールが無事終わったら、VirtualBox用に用意されているGuest Additionsをインストールします。これにより、Windows (ホストOS)とUbuntu(ゲストOS)間でのクリップボードの共有や、任意の画面サイズでUbuntuを利用できるようになるため、必ず行っておきます。

 ※3 もし容量不足のエラーが発生してしまったら、後から仮想ハードディスクのサイズを拡張をすることもできます。”VirtualBox 仮想ハードディスク拡張”といったキーワードで調べると、具体的な情報を得ることができます。

2.3.RISC-V用ツールチェーンのインストール

 ここまででUbuntuが利用できるようになりました。ここからは具体的に開発用のソフトをインストールしていきます。まず、以下のように入力してRISC-V用ツールチェーンのインストールを行います。

export RISCV=$HOME/riscv/tools
export PATH=$RISCV/bin:$PATH
sudo apt -y update
sudo apt -y install git autoconf automake autotools-dev curl python3-pip python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev git

git clone --recursive https://github.com/riscv-collab/riscv-gnu-toolchain.git
cd riscv-gnu-toolchain && \
    mkdir build && cd build && \
    ../configure --prefix=$RISCV
    make -j$(nproc)

2.4.Rustのインストール

 以下のように入力しRust用インストーラであるrustupをインストールします。

sudo apt -y install curl
curl https://sh.rustup.rs -sSf | sh

 以下のようなプロンプトが表示されたら、デフォルトの’1’を入力します。

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>1

 rustupコマンドによってインストールする対象はTock Getting Started Guideに習って”nightly-2022-10-09”とします。

source "$HOME/.cargo/env"
rustup install nightly-2022-10-09

2.5.Tockのインストール

 最初に、Tockを開発ボードにプログラミングするためのツールであるTockloaderをインストールします。TockloaderはPythonアプリケーションであり、Pythonパッケージ マネージャー(pip) を使用してインストールします。

pip3 install --upgrade tockloader --user
grep -q dialout <(groups $(whoami)) || sudo usermod -a -G dialout $(whoami) # Note, will need to reboot if prompted for password
source $HOME/.cargo/env
export PATH=$HOME/.local/bin:$PATH  #tockloader path

 次に、Tock一式をGitHubから取得します。

git clone https://github.com/tock/tock.git

 無事Tockが取得ができたら、HiFive1 RevBボード用のビルドを行います。

cd tock/boards/hifive1
make

2.6.Tock用ユーザーランドのインストール

 TockはC言語またはRustのいずれかでユーザーランドアプリケーションを作成することができます。それぞれのために、以下に示すユーザーランドライブラリが用意されています。

  • libtock-c
    C言語用ユーザーランドライブラリ
  • libtock-rs
    Rust用ユーザーランドライブラリ

 それぞれのユーザランドライブラリを以下のようにしてインストールします。

cd $HOME
git clone https://github.com/tock/libtock-c.git
git clone --recursive https://github.com/tock/libtock-rs

3.QEMUによる動作確認

 こちらの説明によると、HiFive1 RevBボード用のアプリケーションをQEMUを使って動作させることができそうです。QEMU上でlibtock-rsに含まれるサンプルプログラムを動作させることで、Tockの動作確認を行っていきます。

3.1.QEMUのインストール

 まず、QEMUをインストールします。今回は、こちらの説明にあるようにTock内に用意されている仕組みを利用してQEMUを構築することにします。以下のようにQEMUのビルドに必要となるパッケージをインストールします。

sudo apt-get update -y
sudo apt install -y meson libpixman-1-dev pkg-config libglib2.0-dev qemu-system-misc

 次に、libtock-rsディレクトリで”make setup”を行うことで、libtock-rsのビルド環境構築とQEMUのビルドが合わせて行われます。QEMUのビルドは少々時間がかかるためしばらく待ちます。

cd libtock-rs
make setup

 最後に、今回ビルドしたQEMUを利用できるようにします。

cd tock/tools/qemu
sudo make install
export PATH=/usr/local/bin:$PATH

3.2.サンプルプログラムのビルド

 libtock-rsに含まれる、Rustで書かれたサンプルプログラム”console”(※4)をビルドします。

cd $HOME/libtock-rs
make hifive1 EXAMPLE=console
tar xf target/riscv32imac-unknown-none-elf/release/examples/console.tab

 ※4 こちらの手順ではサンプルプログラムとして”hello_world”が示されていましたが、現在同等のサンプルプログラムは”console”に置き換わっているようです。

3.3.サンプルプログラムの実行

 QEMUを使ってサンプルプログラムを実行します。

cd $TOCK_ROOT/boards/hifive1
make APP=~/libtock-rs/riscv32imac.tbf qemu-app

 以下に実行結果を示します。

Tockサンプルプログラム実行結果

 このように、”Hello World”という文字列が出力されることを確認できました(※5)。

 ※5 QEMUを終了するには、[Ctrl]+[A]を押下後、[X]キーを押下します。

4.まとめ

 いかがでしたでしょうか。今回はRustで記述された組込み向けOSであるTockの構築方法、構築手順についてご紹介しました。そして、QEMUを使ってRISC-V用に構築したTockを動かし、さらにその上でRustで書かれたサンプルプログラムが動作する様子までお伝えしました。次回はいよいよ、SiFive RISC-Vが搭載されたボード上でTockを実際に動作させる様子をお伝えします。お楽しみに!

 本ブログについてのより詳しい内容のご質問は、こちらまでお問合せください。
   info-lsi@dts-insight.co.jp

著作権および商標
Linux は、Linus Torvalds の米国およびその他の国における登録商標です。
Ubuntuは、Canonical Ltd.の商標または登録商標です。
VirtualBox は、Oracle VM VirtualBox の略です。
Oracle VM VirtualBox は、Oracle Corporation の登録商標です。
QEMUはFabrice Bellard氏の登録商標です
その他、本ブログに記載する製品名は、一般に各開発メーカーの商標または登録商標です。
なお、本文中には™ および ® マークは表記していません。

■■DTSインサイトの「システムLSI設計ソリューションサービス」■■
 DTSインサイトでは、システムLSI/FPGA設計の受託も行っています。
 当社のノウハウを活かした、ソフトウェアの移行(マイグレーション)
 サービスも提供しておりますので、お気軽にご相談ください。

システムLSI設計ソリューションサービス紹介は こちら