CとRustで一から作るマイクロカーネルOSCとRustで一から作るマイクロカーネルOS@nutaマイクロカーネルは浪漫に溢れる非常に作りがいのあるソフトウェアです。Resea(りーせあ)の設計と実装について軽くまとめた物です。Resea(りーせあ)ソースコードはGitHubにあります。カーネルはCで,ユーザランドはすべてRustで書きました。参考に動かしてみてください。マイクロカーネルとはLinuxのようなモノリシックカーネルでは色んな機能がカーネル空間で動きますが,マイクロカーネルではユーザプロセスたちが互いに通信しながらOSを作り上げます。プロセス・スレッド・仮想メモリ管理,プロセス間通信,タイマーといった必要最低限の機能だけをカーネルが担います。デバイスドライバやファイルシステムといった残りの機能は,独立したユーザプロセスとして動きます。デバイスドライバが暴走しても他のコンポーネントを壊すことはないのです。マイクロカーネルは信頼性が高く,疎結合で美しいシステムを可能するのです。いうようなマイクロカーネルファンの話を聞くと「Linuxは時代遅れだ!マイクロカーネルこそが未来だ!」と心がときめくのですが,現実は真逆です。モノリシックカーネルは開発しやすく性能の良い素晴らしい設計です。信頼性という観点ではマイクロカーネルは確かに秀でているかもしれませんが,銀の弾丸ではありません。複雑で美しい設計より,単純で醜い設計の方が大体上手くいくものです。TanenbaumとTorvaldsの議論)とはいえ,モノリシックカーネルにはない魅力がマイクロカーネルにはあります。もつ」という,とても美しい設計思想です。マイクロカーネルの仕組みプロセスやスレッドはモノリシックカーネルと同じ概念です。プロセス間通信(IPC)もそうですが,マイクロカーネルでは特に重要な要素です。サーバ(マイクロカーネルではデーモンにあたるプログラムを「サーバ」と呼びます)同士通信しあってOSの機能を提供するので,通信部分がシステムの性能に大きく影響します。LinuxのIPCにはパイプや,共有メモリ,ソケットなど色々ありますが,マイクロカーネル界ではメッセージパッシングが人気です。message);宛先(destination)には,チャネルまたはポートと呼ばれるソケットのようなものを使うカーネル(間接型IPC)と,スレッドを指定するカーネル(直接型IPC)の2つの流儀があります。後者は使い勝手悪そうですが,ちょっぴりIPC性能が良いそうです。IPCには非同期IPCと同期的IPCの二種類があります。非同期IPCでは,カーネル内のキューにメッセージを溜め込んでいきます。同期的IPCでは,送信・受信スレッド両方が揃うまでブロックします。同期的IPCではカーネルがキューを持たずに済み,同期的に動くおかげでデバッグが楽なのでおすすめです。Linuxではシステムコールを発行してカーネルに処理をしてもらいますが,マイクロカーネルでは「サーバへのメッセージの送信」と「サーバからのメッセージの受信」という風に実装します。大体何でもメッセージパッシングでやります。デバイスからの割り込みやページフォルトなど本来カーネル内で処理される物も,メッセージとして対応するサーバに送られ,処理されます。スレッド管理などカーネルが提供する機能については,専用のシステムコールを用意する(Zircon)か,カーネルサーバへのIPCとして実装する(MINIX)かの2種類あります。Reseaは後者です。色んなマイクロカーネルたちL4L4は「性能を考えた設計をすれば,マイクロカーネルは遅くない」ということを証明したカーネルです。色んな派生があり,研究だけはなく実世界でもしっかり使われています。MINIX当初は教育目的で作られたマイクロカーネルベースのOSです。いう,オペレーティングシステムの解説とソースコードが一体になった電話帳みたいな本のために書かれたそうです。近年にはNetBSDのユーザランドが一式移植され実用性が増したりと,教育目的を超えた物になっています。面白い試みが色々と行われています。Fuchsia(Zircon)Googleが開発している最近何かと話題のマイクロカーネルベースのOSです。カーネルはZirconという名前です。L4のように極限までシンプルにするのではなく,ある程度コンパクトにするという設計思想のようです。システムコールも中々綺麗にまとまっています。システムコールに「ファイル」の概念が現れないのはマイクロカーネルらしさがあって面白いですね。個人的にはコードが読みやすく,システムコール体系も結構好みです。今後の発展が楽しみですね。Reseaのざっくりした仕組みせっかく一から作るので,Unix互換は目指さず綺麗でシンプルな「マイクロカーネルらしさ」を感じられるOSを作ることにします。具体的には,Unixの「全てはファイル」に倣って「全てはメッセージパッシング」を設計の根幹としました。ファイルの読み書きからページフォルトの処理まで全てメッセージパッシングで実現します。メッセージパッシングReseaのメッセージパッシングは同期的かつ間接型です。