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

RISC-V

1.はじめに

 今回は、Linuxの最新バージョン6.1で導入され、C/C++に代わる可能性のある言語として最近注目度が非常に高まっているRustを取り上げて、その概要をお伝えします。さらに、そのRustを用いて作られたというOSが存在し、中でも組込み用途での活用が期待できるOSを取り上げ、その概要と特徴、またRISC-Vのサポート状況についてお伝えしたいと思います。

2.Rustとは

 まず、Rustとは何かについて簡単にご説明します。RustはFirefoxで有名なMozilla社が2006年から開発をスタート、2015年にリリースされたプログラミング言語で、元はFirefoxのレンダリングエンジン「Servo」を開発するために作られたものでした。開発はオープンソースとして進められており、MicrosoftやGoogleなどもOSの開発に採用する等、普及が進んでいます。比較的新しい情報としては、Linuxのバージョン6.1で導入され、エンジニアが習得したい言語としても上位にランキングされており、世界中で注目度が高まっています。

2.1.Rustの特徴

 Rustの主な特徴としては、以下の3点が挙げられます。

  • 高速性
    C/C++に代わる言語を目指して開発されたことから、C/C++の高速性を失わないよう設計されています。JavaやC#のように仮想マシンを持たず、C/C++に匹敵する高速処理を実現しています。
  • 安全性
    全てのプログラムは、実行中にメモリの使用方法を管理する必要があります。C/C++を利用する場合、プログラマは自らメモリ管理を意識する必要がありますが、メモリの解放忘れや多重解放、メモリリーク、バッファオーバーフローといった問題に悩まされることが少なくありません。また、JavaやC#、Goにはガベージコレクションという仕組みが用意されており、メモリ管理を常に意識する必要はなくなったものの、いつメモリの回収が行われるのか、メモリ回収にどれほどの時間がかかるのか不明であるといったデメリットがありました。Rustでは「所有権」という仕組みが導入されたことで、プログラマが自らメモリ管理を意識する必要性がなく、またガベージコレクションも不要になりました。
  • 並行性
    Rustでは、”fearless concurrency“(怖いもの知らずの並行性)(※1)といった表現が使われているように、並行プログラミングを安全かつ効率的に処理することができます。これは、”安全性“でも取り上げた「所有権」の存在と、コンパイル時点でエラーとして検出することができるため、プログラム実行時に予期せぬタイミングで発生するデータ競合(※2)やデッドロック(※3)を防ぐことができるためです。

 ※1 参考:https://doc.rust-lang.org/book/ch16-00-concurrency.html
 ※2 単一のデータに対する同時読み書きが非一貫性を引き起こす現象、あるいはその状態
 ※3 複数の実行中のプログラムなどが互いに他のプログラムの結果待ちとなり、待機状態に入ったまま動かなくなる現象

 これらRustの特徴から、組込み用途での活用が期待できそうです。実は、このRustで記述されたTockという組込み用のOSが存在し、RISC-Vのサポートも進められています。次章ではこのTockについて説明します。

2.2.所有権

 「所有権」とは変数が値を所有できる権利のことです。値は所有者と呼ばれる変数と対応しています。所有者である変数は、スコープの範囲内のみ所有権を得ることができます。また、「所有権」を持つ所有者は常に1つの変数であるというルールが決められており、そのルールに反するコードはコンパイル時点でエラーとして検出されます。

 「所有権」について、以下に簡単な一例を示します。

{
    let s1 = String::from("hello");
    println!("{}", s1); // OK

    let s2 = s1;  // s1の値をコピーしs2に束縛する
    println!("{}", s1); // Error
    println!("{}", s2); // OK
} 

  これは、所有権の移動を示す例です。5行目で、s1の値の所有権がs2へ移動します。これにより、s1は解放されることになり、6行目は解放済みのs1を利用しようとしていることから、コンパイルエラーとなります。

 「所有権」について、より詳しい情報はこちらを参考にすることができます。

3.Tockとは

 Tockとは、現在プリンストン大学で助教を務めるAmit Levy氏によって開発された組込み向けのリアルタイムOS(RTOS)で、Rust同様にオープンソースとして開発が進められています。ハードウェアにメモリ保護ユニット (MPU) が搭載されていることを前提とした、組込み向けの省電力マイコン用に作られています。Tock カーネルとその拡張 (カプセルと呼ばれる) は Rust で書かれています。

3.1.Tockの特徴

 Tockの主な特徴としては、以下の3点が挙げられます。

  • 安全性
    Tockは、近頃のマイコンで利用可能なメモリ保護ユニット (MPU)とRust言語の型安全機能を利用して、安全性を確保します。カーネルコンポーネントは、コンパイル時にRustの型とモジュールシステムを使用して分離されます。その結果、センサードライバ、仮想化レイヤー、ネットワークスタック、およびその他のコンポーネントは、同じバス上で動作している場合や他のコンポーネントと状態を共有している場合でも、許可されているリソースにのみしかアクセスできません。たとえば、同じI2Cバス上にある2つの周辺機器用ドライバは、それぞれの周辺機器としか通信できません。
  • 信頼性
    Tockカーネルは、ヒープ割り当てを使用しないイベントドリブン実行モデルを使用するため、カーネルがメモリ不足になることはありません。アプリケーションは必要に応じてメモリを管理できますが、アプリケーションがクラッシュまたは再起動した場合でもシステムが続行できるように、プリエンプティブにスケジュールされ、カーネルから切り離されます。
  • 省電力
    Tockカーネルとドライバは、アプリケーションの要件に基づいて、ハードウェアをシームレスに可能な限り低いスリープ状態にします。アプリケーションからの明示的な電源管理は必要ありません。

 参考:https://www.tockos.org/features

3.2.Tockのアーキテクチャ

 下図は、Tock のアーキテクチャを示しています。コードは、Core Kernel(コア カーネル)、Capsules(カプセル)、Process(プロセス)の3つのカテゴリのいずれかに分類されます。

Tockのアーキテクチャ

 コア カーネルとカプセルは両方ともRustで記述されています。Rustは型安全なシステム言語です。重要な点として、Rustで記述されたコードが意図したのとは異なる方法でメモリを使用することができない点が挙げられます。これにより、バッファのオーバーフロー、ポインタの偽装、NULLポインタ参照、デッドスタックフレームへのポインタ参照などを防ぐことができます。これらの制限は、カーネルが行わなければならない多くのこと(データシートで指定されたメモリアドレスに存在する周辺機器にアクセスするなど)を妨げることになってしまうため、非常に小さなコア カーネルのみ、“安全ではない“Rustコードの使用が許可されています。一方、カプセルでは“安全ではない“Rustコードを使うことができません。そのため、カーネルに追加された新しいカプセルは安全なコードであると言えることから、信頼する必要がない(Untrusted)ものとなっています。したがって、コア カーネルのコードは慎重に記述されている必要があります。

 プロセスは任意の言語で記述することができます。カーネルは、メモリ保護ユニット (MPU) を使用することで、自分自身と他のプロセスを不正なプロセスのコードから保護します。許可されていないメモリにプロセスがアクセスしようとすると、例外がトリガーされます。カーネルはこの例外を処理し、プロセスを強制終了します。

3.3.RISC-Vのサポート状況

 TockはRISC-Vをサポートしています。以下にTockがサポートするSiFive RISC-V CPUと対応ボードを示します。

SiFive RISC-V CPU対応ボード
Freedom E310-G002HiFive1 Rev B
Freedom E310-G003HiFive Inventor
SiFive E21 CoreArty A7-100T
TockがサポートするSiFive RISC-V CPUと対応ボード

 その他の対応ボードについてはこちら、CPUについてはこちらを参考にすることができます。

4.まとめ

 いかがでしたでしょうか。今回は現在非常に注目度が高まっている言語であるRustと、そのRustで記述された組込み向けOSであるTockについて、概要や特徴などをご紹介しました。次回は、SiFive RISC-Vが搭載されたボード上でTockを動作させることを目指して、具体的な環境構築方法についてお伝えします。どうぞご期待ください。

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

著作権および商標
本ブログに記載する製品名は、一般に各開発メーカーの商標または登録商標です。
なお、本文中には™ および ® マークは表記していません。

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

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