雑種路線でいこう

ぼちぼち再開しようか

OSを理解する手っ取り早い方法?

日経ITProに『自分で作るLinux OS (日経BPパソコンベストムック)』という本の書評が出ていた.自社刊行物の宣伝とはいえ酷い書評である.恐らく評者がOSのことを理解せずに書いたのだろう.*1OSを勉強するなら下記の本の方がお勧めできる.
30日でできる! OS自作入門 BSDカーネルの設計と実装―FreeBSD詳解 インサイド MS WINDOWS 第4版 上 (マイクロソフト公式解説書) インサイド MS WINDOWS 第4版 下 (マイクロソフト公式解説書) オペレーティングシステム―設計と理論およびMINIXによる実装 OSの基礎と応用―設計から実装、DOSから分散OS Amoebaまで
評者が混乱している背景にOSの定義が混乱していることもあるので,ここでは狭義のOSをカーネルと書き分けることにする.いうまでもなくカーネルからビルドしてLinuxディストロの自作をしたところで,カーネル自体を理解することはできない.Linuxカーネルが起動しinitを実行した後の処理を撫でる*2程度のことだ.本書の目次をみた限り,Linuxカーネルのビルド方法や簡単なユーザーランドの構築方法については記述していても,肝心のカーネルの構造について解説している気配はない.
同じソースを使う限り脆弱性対策は必要で,パッチマネジメントに膨大なコストのかかる割に学べることの少ない自作ディストロは決してお勧めしない.手作り感を味わうだけならGentooとかMomongaを使う手もあるし,それ以上の労力をかける暇があったら既存のディストロに寄与したらいい.*3
確かにカーネルの構造を深く理解するにはOSを自作するのが一番である.しかし流行として引き合いに出すべきはLinuxディストロ自作ではなくOSASKMonaといったカーネルも含めたOS自作であろう.これらは実用OSと比べて機能が限られている上,C++オブジェクト指向を意識してモジュール化されているのでソースは一般の実用OSよりも読みやすい.
とはいえ実際にOSを自作するのは骨だし前提となる知識も膨大なので,勉強の手始めは概念を書籍で理解しながら既存OSのコードを追う方が現実的だ.コードを追う場合も,まずは本で勉強して基礎的な概念を理解し,データ構造を把握した上で,デバッガのステップ実行で実際の流れを追って,理解を深めたい部分を絞って実際のコードを追うという順番になるのだろう.昔は2台のPCをクロスケーブルで繋いだりSoftICEを使うとなると大仰だったが,最近は仮想マシン環境を簡単につくれるので非常に手軽になった.

単なるパーツの知識じゃなくてOSの仕組みをもっと知りたい。概念的には分かるが,いまいち内部に踏み込めない。この悩みを解決するのに手っ取り早い方法が,OSの自作だ。
OSは,コンピュータで動くプログラムのベースとなるソフトウエアである。コンピュータを構成するメモリーやデバイスなどのハードウエアを上位のアプリケーション・プログラムから隠し,しかも,多数のプログラムがあたかも同時に動いているように時分割でハードウエア資源を割り当てる。ハードウエアを効率よく配分するという役割もある。プログラマはOSの内部を知らなくても、ライブラリやシステム・コールを使うことでハードウエアやOSの機能を簡単に利用できる。逆に言えば,OSを自作すれば,OSの仕組みだけではなく,ハードウエアの仕組みも深く理解できるようになる。
(略)
簡単なOSなら,がんばれば他人が書いたソースを用いずにスクラッチから作ることもできるかもしれないが,それはあまりにも非現実的である。日常的に使えるOSにはなり得ない。そもそも,アプリケーション・プログラムまで自作する必要がある。
そこでお勧めなのがLinuxソース・コードを使うという方法である。ご存知の通り,LinuxはOSの核となるカーネルソース・コードが公開されている。これをベースにして,自分なりのOSを作るのである。もちろん,無償で入手できる。

*1:目次をみた限り,著者は本書でカーネルの構造を理解できるとは書いていない

*2:実際のLinuxディストロの起動処理は設定情報の読み込みやRCスクリプト再帰的な読み込みなど,自作ディストロの起動処理よりも非常に複雑なので,ディストロの起動処理を理解したことにさえならない

*3:わたしは以前そういう動機でKondara Projectに寄与していた