1 of 15

RustはOS界の�銀の弾丸になりうるか

論文で見るRustで変わるOS設計

2 of 15

自己紹介

ハンドルネーム:ガラスボー

Twitter:@garasubo

  • 大学院ではC言語でArm用ハイパーバイザを自作したり、OS関係の論文を読み漁ってました
  • 趣味でRust製組み込みOSを自作していました
  • 本業はWeb開発(not Rust)

3 of 15

Rustとは

  • ガベージコレクタやランタイムを介さず直接メモリ管理できる
  • 型システムと所有権システムにより高信頼性
  • モダンな言語機能や各種ツール群

OSを書くにあたってC言語の代替として注目される

4 of 15

本日紹介する研究

Rustを使うことで新しいOSの設計を模索する論文を紹介

  • Tock [SOSP 2017]
    • Multiprogramming a 64kB Computer Safely and Efficiently
  • ReadLeaf [OSDI 2020]
    • ReadLeaf: Isolation and Communication in a Safe Operating System
  • Theseus [OSDI 2020]
    • Theseus: an Experiment in Operating System Structure and State Management

Rustの性質をうまく活かせているなと思った部分をかいつまんで紹介

5 of 15

Tock

  • 省メモリなマイクロコントローラ用のOS
    • ArmのCortex-Mなどが対象
  • アプリケーション間の独立性を保ちつつ、柔軟性も欲しい
    • あるプロセスがたくさんメモリを使っても、他のプロセスは無事にさせたい
    • 従来の単なる静的リソース確保だと最大値の制約の付け方が難しい
    • 動的確保だとプロセス間の独立性が損なわれる危険性

6 of 15

Grants

  • プロセスがシステムコールを呼び出すことで動的にメモリを確保する必要がある
    • タイマードライバを使うためのメタデータをメモリ上に置いておきたい
  • プロセス内のメモリ領域の一部をOS側に貸し出す仕組みをGrant型としてRustで実装
    • メモリを使うシステムコールを呼び出しすぎるとそのプロセスだけが困る
    • メモリ領域の安全性はGrantのインターフェースによりコンパイラが保証する

7 of 15

  • ライフタイム制約によって渡されたクロージャ外にGrant内のメモリを渡すことはできない
    • 他のプロセスに渡したりはできない
  • クロージャ内でOwned型を介してGrant内のメモリの値を変更することができ、Copyを実装した型を返すことはできる
    • エラーコードとかを返したりはできる

※図は論文中より引用

8 of 15

ReadLeaf

  • Rustを使って実装されたマイクロカーネルベースのOS
  • ハードウェアのアドレススペースではなく、Rustの言語機構を使うことでfault isolationを実現する試み
  • POSIXのサブセットを実装し、ネットワークドライバなどで比較実験をしている
  • Domainごとの独立性を担保しつつ、効率のいいDomain間通信を実現するためにRustの言語機能を使う

9 of 15

共有ヒープを使ったドメイン間通信

  • 効率の良いドメイン間通信をするには共有のヒープ領域を使いたいが、オブジェクトを抱えたままドメインがクラッシュすると困る
  • RRef<T>型を導入し、共有ヒープのオブジェクトはこの型を介してアクセス
  • RRef<T>が所持しているドメインの情報を持っているので、クラッシュしたときはそれを参照して対処する
  • ドメイン間のインターフェースはIDLを使って生成され、RRef<T>型やCopyを実装したものでないと引数にできない

10 of 15

Theseus

  • OSのコンポーネント間でのステートスピルをいかに少なくするかに焦点を当てて設計したRust製OS
  • OSの実行モデルと言語の実行モデルにできるだけ近づけることにより、コンパイル時の静的チェックを最大限利用し、ランタイムでのクラッシュを避ける
  • Cellと呼ばれる単位でOSのコンポーネントを構成して、Cellを置き換えたり結合させることで、機能を拡張していく
    • RustのCell<T>型とは関係がない

11 of 15

例:メモリ管理

  • Theseusのすべてのコンポーネントはシングルアドレススペース・同じ権限レベル上で動く
    • Rustの言語内モデルと一致するのでコンパイラの保証が保たれる
  • MappedMemory<T>型をマップされたメモリ領域のために定義
  • 同じ物理アドレスに対して複数の仮想アドレスがマップされないようにする
    • MappedMemory<T>の所有権により言語レベルで制御される
    • Rustの実行モデルにも一致する
  • TはSized制約をつけることで、マップされている領域を超えることはできない
  • 確保された領域はRustのDropハンドラで解放されるので、use-after-freeが起こらない
  • 書き込み可能や実行可能などのパーミッションも型レベルで制御

12 of 15

例:タスク管理

  • Theseusでは標準ライブラリのスレッドではなく、独自のタスク抽象化をしている
  • 型制約を活用することで、ライフタイムやスレッド安全性をコンパイラレベルで保証
  • タスクがクラッシュした場合もリソースが適切に解放されステートが外に影響しないように工夫
  • その他いろいろ工夫があるが、タスク生成の部分だけ詳しく見る

13 of 15

  • エントリは複数回呼ばれない(FnOnce)
  • 引数・返り値ともにスレッドセーフ(Send)
  • タスクが終了しても引数や返り値が解放されない(’static)

※図は論文中より引用

14 of 15

まとめ

  • Rustを使って新しいOS設計を試みる論文を紹介した
  • OSの満たすべき性質をRustの言語制約に紐づけコンパイラで検証
  • 従来言語では難しかった設計でOSが構築できる可能性が見えてきた

15 of 15

紹介した論文

  • Multiprogramming a 64kB Computer Safely and Efficiently
  • ReadLeaf: Isolation and Communication in a Safe Operating System
  • Theseus: an Experiment in Operating System Structure and State Management