「いちばんやさしい! OS自作超入門」を読んだ

以下の本の読書感想文です。

どういう本か

ざくっというとOSを自作するための本です。ここ十数年でOS自作本は増えてきていて今は10冊くらいあるはずですが、どれも必要な前提知識が多いので読むのが大変です。本書はそれらの中で異彩を放っています。世の中で広く使われているx86を始めとするCPUでOSを作るのは大変なので、OS実装に必要な最低限の命令だけを備えた筆者作の仮想的なアーキテクチャのCPU上でミニマムなOSを作ろうという本です。どれくらいミニマムかというとOSの中のカーネルの中のさらに最小限の部分です(後述)。すべてにおいて割り切り方が凄く、アプローチがとても面白い本だと感じました。

OSの概念は知っているという人が、世の中にあるOS自作本を読む前に読む価値があると思いました。ソースを書き写したりしなければかなりサクッと読めるので(わたしはそうした)、「かつてOSについて学んだけど今は忘れた」という人はおさらいにもいいかもしれません。

仮想的なアーキテクチャのCPU上で動かすという都合上、「最初から実際のCPUで自分の動かしたい!」という強い思いがある人には回り道に感じるので向かないかもしれません。ただ、もしそうだとしてもさらっと見るだけでも価値はあると思います。後述する本格派のOS自作本の副読本としてもよいと思います。

本書を読んで作れるOSカーネルは非常に割り切っていて、プリエンプティブなマルチタスク用のスケジューラと仮想記憶だけといっていいでしょう。デバイスドライバも無いです。システムコールはあるにはありますが、BIOSコールといったほうがいいものです。OSカーネルの中でもこれらについて知りたいという人には刺さると思います。その一方でこれら機能については知っているが他の機能の実装を知りたい、ドライバを書いてみたいという人には適さないと思います。そういう人は他の本をあたれればいいと思います。

OSカーネルの中のスケジューラや仮想記憶のコードはC言語のような高級言語だけでは書けないので、通常はアセンブリ言語高級言語を組み合わせて書きます。本書はそれをすべてアセンブリ言語だけで書くという割り切りをしています。両方を使い分けるのはそれはそれで難しいので、なるほどなあと思いました。ただアセンブリ言語が前述の機能を実現するために特化していることもあって、最終的には500行くらいという小ささで実現できています。

本書で使う仮想的なCPUアーキテクチャアセンブリ言語が平易なので、アセンブリ言語を学ぶにも役立ちそうです。また、コントロールレジスタの操作など、「アセンブリ言語で書かざるを得ない処理」が何かがわかるのもいいところです。C言語でポインタがわからないという人も、本書を読みこなせればある程度理解できるようになるでしょう。まったくアセンブリ言語を知らないという人が読むにはすこし大変かもしれませんが、チャレンジする価値はあると思います。

難点

本書には難点もいくつかあります。まずOSの各機能が「なぜ」そうなっているかの説明が少ないです。このためOSについての知識が無いか非常に浅い場合、「なぜこんな機能が必要なのか」と困惑するかもしれません。とくに仮想記憶の章はしくみの説明が先にあり、嬉しさは実装の後で一部しか触れられるのみなので、嬉しさを知りたければ別の書籍なりを当たると良いと思います。

また、本書を読んだ後の次のステップとして参考サイトや参考文献、および、本書に書かれている概念が実際のCPUだとどういうものに対応するかという情報が全くないのは気になりました。ただ、それは意図的に省いた、本がいっぱいあるので好きなのを選んでくださいということかもしれません。せっかくなので次の節で参考になりそうな書籍を挙げておきます。

参考書籍

OSの概念がわかってない人には手前味噌ですが拙著「Linuxのしくみ」を推したいです。本書を理解するという目的に対しては情報量が多すぎるので、流し読みでいいです。

あるいはwikipediaオペレーティングシステムラウンドロビン・スケジューリング仮想記憶のページを読むだけでもいいかもしれないです。

本書を読んだ後にステップアップする本を、わたしが読んだものの中から2冊紹介します。どちらも「よくわからないけどOSを作りたい!」となったときに初手で読むにはなかなか大変な本ですが、本書を読んだ後、読みながらであれば理解しやすいでしょう。

C++でOSを書くなら「ゼロからのOS自作入門」がいいでしょう。

Rustで書きたいなら「[作って学ぶ]OSのしくみⅠ」(Ⅱはそのうち出るらしい)がいいでしょう。

もっと低いレイヤも知りたいというのであれば「コンピュータシステムの理論と実装」がハマるかもしれません。ただし私はこの本は未読で、信頼できる人達が肯定的な評価をしていたという程度の知識しかないことを白状しておきます。

古参プログラマ向けの脱線

本節は本書の対象読者向けではなく16bit,32bit CPUのころからコンピュータに慣れ親しんでいる人にとっては「はじめて読む8086」や「はじめて読む486」あたりに近いといえばわかりやすいかもしれません。「新しい本だけど、なんだか懐かしいなあ」と思いながら読んでいました。

終わりに

本書はためになるし、さらっと読むぶんにはそんなに時間はかからないのでOSカーネルの一番奥底の部分の実装レベルの話を知りたい、おさらいしたいという人にはいい本だと思います。おわり。