- Writing an OS in Rust
- https://os.phil-opp.com
Writing an OS in Rust の写経を始めて1年4ヶ月、ようやく全章読み終えました。
読み終えた、といっても Writing an OS in Rust は途中の章 Async/Await までしか書かれていないので、まだ完成とは言えませんけどもね。

感想
自分は大学院時代に xv6 という、MIT 謹製の C 言語で書かれたミニ OS のソースコードを一通り読んでいるのですが、xv6 に比べるとシンプルな実装になっているなー、というのが一つの感想です。xv6 だけアセンブリで CPU を初期化して、ブートストラップから起動して、…と main 関数にたどり着くまでの処理はアセンブリを読むことが必須ですが、この Writing an OS in Rust で実装する blog OS に関しては x86_64 クレートを利用しており(なんと Writing an OS in Rust の著者様がメンテナらしい)、一番低レイヤな部分は抽象化されている印象です。お陰様で Rust でのカーネル実装に集中できます。
Rust の面白いところは、普段書いてるような普通のユーザアプリケーションであれ、今回実装したような nostd なカーネルであれ、crates.io から手軽に必要なライブラリを手に入れることができるところですね。x86_64 はもちろん、ブートローダーを実装した bootloader、割り込みハンドラ用のクレート pic8259、キー入力に対応した pc-keyboard などなど。この辺の実装も xv6 では全部自分で書いているので、自作 OS の敷居が下がった良い時代になったなと思います。もちろんそのあたりを学びたい人には自前でアセンブリでの実装も良い経験になるかと思いますが、OS 全体の動きの大枠を捉えるにはある程度の完成品を組み合わせながら学んでいくのも良い教材なのではないでしょうか。
一方、Rust で書くにあたって、やはり borrow check だったり型チェックだったりの制約があるのでコンパイラエラーを避けるためにこれをしなければならない、などなど Rust ならではの注意点もいくつか見られました。C 言語なら気にしなくて良い点であっても Rust だと気にしなければならない分、実装効率が若干下がるケースもあるのかなという印象もありますが、まあ Rust はメモリ安全側に全振りがコンセプトなので受け入れるしかないでしょう。むしろ、Rust によってカーネル内でのメモリ脆弱性の発生頻度が格段に下がることを歓迎すべきです。
実装内容
これまで実装した内容
- 文字列出力(VGA)
- カーネルテスト
- CPU 割り込み
- 例外ハンドラ
- キーボード入力
- ページング
- ヒープ割り当て
- 協調的同期処理(Async/Await)
まだ実装できていない内容(xv6 と対比して)
先述の通り、Writing an OS in Rust はまだ書きかけのブログです。Async/Await 以降の章の更新も今後予定されています。(5年くらい更新されてないけど)
xv6 にあって blog OS にない内容は、思いつく限りだと
- マルチタスク
- ユーザモード
- プロセス
- スケジューリング
- システムコール
- ユーザアプリケーション(シェルなど)
- ファイルシステム
- ページフォルトハンドラ
といったところですかね。まだカーネルモードでの起動しかできませんし、Async/Await の章でタスクは実装されてますけど並行処理であって並列処理には対応していなかったり、プロセスの概念がなかったり、スケジューリングによる非協調的マルチタスクへの対応ができていません。
今後の予定
せっかくここまで実装したので、せめて xv6 と同じレベルまで実装を続けたいと思っています。できれば Unix ライクな OS にしたいですね。
実は Writing an OS in Rust の続きというコンセプトで記事を書いてくださっている方もいまして、これを参考に実装を続けるという手もあります。
しかし、どうせなら自分で実装したいです。xv6 の実装を参考にしつつ、さらに先に進めていければなと思っています。