5-5. Tock
TockはRust製の組込みOSです。Cortex-Mアーキテクチャに対応しており、RISC-Vへの移植も進められています。長期に渡り開発が進められており、2018年2月時点でversion 1.0がリリースされています。
主な対応ボード
対応ボードは、既存のRTOSと比較すると多くはありません。一部を紹介します。
- Hail
- TI LAUNCHXL CC26x2 / CC13x2 SimpleLink
- Nordic nRF52x
- STM32 Nucleo
- HiFive1
HiFiveはRISC-Vで、他はARM Cortex-Mが搭載されたボードです。
設計概要
https://github.com/tock/tock/blob/master/doc/tock-stack.pngより
TockのKernelはRustで実装されています。Kernelは2つの階層に分割されています。
1つは、Core kernelでHIL (Hardware Interface Layer) 、スケジューラ、プラットフォーム固有の設定が含まれます。
もう1つは、Capsuleです。Capsuleは、マイコンに依存しないkernel機能を拡張するためのコンポーネント、という位置づけで、通信スタックやコンソールなどが該当します。Capsuleは、unsafe
ブロックの使用が禁止されているなど、Rust固有の安全性を保証する設計がなされています。
Tockでは、CapsuleもユーザプロセスもUntrusted
という扱いですが、その中でも差が設けられています。Capsuleは、kernelのイベントループの中で協調的にスケジューリングされます。そのため、Capsuleがパニックしたり、イベントハンドラに戻らない場合、システムの回復には再起動が必要です。一方で、ユーザプロセスは、MPUでメモリが隔離されており、スケジューリングもプリエンプティブです。
ドキュメント
Tock Documentationに、Tockの設計や実装に関するドキュメントがまとめられています。
Tock Implementationには、Tockの実装についての解説があり、RustでOSを実装する際に参考にできる情報がまとめられています。ここでは、OS実装に必要な要素について、Tock内でどのようにRustで実装しているか、が述べられています。例えば、ライフタイムや可変参照というRust固有の要素をどう扱っているか、メモリアイソレーションやメモリップドレジスタ、システムコールをRustでどのように実装しているか、というトピックが取り上げられています。
ユーザランドアプリケーション
ユーザランドアプリケーションはCとRust、どちらでも書くことができます。C言語用のユーザランドライブラリlibtock-cには、newlib
やlibc++
、lua
ライブラリが含まれます。
libtock-rsは、2019年5月現在、WIP
の状態です。