マイクロカーネルをテーマに執筆した本『自作OSで学ぶマイクロカーネルの設計と実装』が5月18日に出版されます。すでに予約を開始しています。
表紙はエナガの団子をイメージして描いてもらいました。団子状態の雛たちのように、マイクロカーネルOSでもOSの機能を提供する複数のプロセスが集まっている設計 (マルチサーバOS) がよく見られます。
内容
本書では、メモリ管理、プロセス間通信、デバイスドライバやファイルシステムといったOSの各機能の説明と、マイクロカーネルOSではどう実現されるかを解説しています。ひとつのマイクロカーネルを深掘りするのではなく、有名なマイクロカーネルOS (MINIX3, seL4, GNU Hurd) たちがそれぞれ機能を抽象化・実装しているのかを見ていきます。
また、時折マイクロカーネルOSに関係なく面白い研究や一風変わったOSも紹介しています。「マイクロカーネル」が主題ではありますが、それだけではなくOS全体の要素が詰まった一冊です。
上述の実用的なマイクロカーネルに加えて、本書用に書いた教育用OS「HinaOS」を使って実装のイメージを掴めるようにしてあります。実用的なOSというものは複雑でとっつきにくいものですが、HinaOSは非常にシンプルかつ素朴な実装になっています。シンプルといっても、ファイルシステムやTCP/IPプロトコルスタックといったハックしがいのある機能をしっかり実装しています。詳しい人向けに説明すると、32ビットRISC-V CPU (QEMU virtマシン ) 用のC言語で書かれたマルチサーバOSです。
以下が本書の目次です。筆者のお気に入りは「信頼性とセキュリティ」です。アプリケーションからカーネルのメモリ領域にアクセスできるHinaOSの脆弱性を通して、考えなしにマイクロカーネルを採用してもセキュアなOSにはならないという話をしています。
- 1章: 本書について
- 2章: マイクロカーネル入門
- 3章: 教育用マイクロカーネルOS「HinaOS」入門
- 4章: RISC-V入門
- 5章: プロセスとスレッド
- 6章: メモリ管理
- 7章: 割り込み・例外
- 8章: メッセージパッシング
- 9章: システムコール
- 10章: ユーザーランド
- 11章: API
- 12章: デバイスドライバ
- 13章: ファイルシステム
- 14章: ネットワーク(TCP/IP)
- 15章: マルチプロセッサ対応
- 16章: 仮想化とエミュレーション
- 17章: 信頼性とセキュリティ
- 18章: ソフトウェアによるプロセス隔離
- 19章: ブート処理
HinaOSで遊ぼう
ソフトウェアを学ぶのに一番効果的なのが「実際に自分で作ってみる」ことです。車輪の再発明をしようとするには、必然的に車輪の細部まで理解する必要があります。OSも同じです。そこで、本書を一通り読んだあとは、実験アイデアリストから興味のあるトピックを選択してHinaOSをベースにした自分自身のOSを作ってみると、よりOSを深く理解できます。「HTTPサーバの実装」が難易度的にも面白さ的にもちょうど良いのでおすすめです。
また、実装のシンプルさだけでなく開発者体験に力を入れました。OSのソースコードに触るのが初めての人でもハックしやすいように、手軽に環境構築を構築できるようにしたり、カーネル・アプリケーション両方をシームレスにGDB (デバッガ) でアタッチできるようにしたり、本書中で説明していない部分も理解しやすいようにコメントをかなり丁寧に書いてあります。説明が足りないと感じる部分があれば、ぜひGitHub Discussionsで指摘してください。
どんな本でないか
HinaOSをベースに自作OSを作るのには十分ですが、ゼロからOSを作るにはこの本一冊だけでは不十分です。本書では「なぜこのような設計・実装になっているのか」を重視しており、CPUの初期化処理など (例えばRISC-VのM-modeの話) の説明を深掘りすることを避けています。もちろん参考になるようにコメントでたくさん説明してありますが、完全に理解したい方は他の参考文献を辿る必要があります。
ゼロからOSを作れるようになりたい方におすすめな副読本をいくつか紹介します。拙作ではシンプルさと将来性を鑑みてRISC-V CPUを採用しましたが、ゼロから作るとなると参考文献が豊富なのはx86/x86-64 CPUです。RISC-Vではありませんが、共有する概念が多く参考になります。
- ゼロからのOS自作入門 (内田公太 著): x86-64 CPU (64ビットのIntel CPU) 向けのOSをタイトル通り「ゼロから」作る本です。ウィンドウシステム (GUI) やUSBデバイスドライバなど面白いトピックもカバーしているので、MikanOSをマイクロカーネルの設計でゼロから作るのも面白いでしょう。
- 30日でできる!OS自作入門 (川合秀実 著): x86 CPU (32ビットのIntel CPU) 向けのOSをゼロから作る本です。筆者はこの本でアセンブリとC言語のポインタを概念を理解できました。
- 作りながら学ぶOSカーネル 保護モードプログラミングの基本と実践 (金凡峻 著): これまたx86 CPU向けのカーネルの作り方を解説した本です。アセンブリ主体で説明されており、x86 CPUの難しい概念・動作を実装する時に役立ちます。
- はじめて読む486―32ビットコンピュータをやさしく語る (蒲地輝尚 著): これもまたx86 CPU向けの本ですが、OSの作り方というよりはx86 CPUの仕組みを解説した本です。とても分かりやすい。
執筆のはなし
最後に、裏話的なものを少し。本書は、2020年に技術書典で出した同人誌を書き直した商業出版です。昨年の8月ごろにお声をかけていただき、今年の3月までの約半年間の間、仕事の合間を縫って執筆しました。執筆以外にもHinaOSの実装やMINIX3、seL4、GNU Hurdの調査も必要であったこともあり、休みらしい休みのない半年間でした。プログラミングを学び始め、またOSの世界の虜になったのは『30日でできる!OS自作入門 (川合秀実 著)』がきっかけでした。同じように、本書を読んでOSの世界に興味を持ってくれる人が増えると嬉しいなと思っています。
執筆は編集さんと二人三脚で頑張りましたが、レビューの方は多くの方々にご協力していただきました。お名前は本書の方に掲載しています。短い期間かつ読むのに体力のいる本ではありましたが、多くの鋭い指摘をいただきました。感謝の気持ちでいっぱいです。
マイクロカーネルを学ぶというのは好奇心を満たすだけの行為のようにも思えます。面白いことにそうでもありません。筆者は主にWebフレームワークを作っている会社で働いていますが、マイクロカーネルから得た知見・設計センスが案外役に立っています。領域は違えど、アイデアは流用できますし、結局はOSの上で動くのでOSの知識をフル活用できるのです。様々なものに触れていくことで自分だけのユニークな技能・センスを育てるというのは、ソフトウェアエンジニア人生を少し豊かにしてくれるのではないかと思います。
最後に、半年間は趣味のコードをろくにかけていなったので、少し休暇を取った後に実用的なマイクロカーネルOSの開発に挑戦することにしました。GitHubリポジトリはこちらです。HinaOSは教育目的ということでC言語の素朴な実装に留めていましたが、こっちはRustで難しい概念を躊躇なく導入しながら性能重視で実装していく予定です。夏頃にはある程度形になっているといいなと思っています。