2009年10月25日日曜日

Lions' Commentary

積まれてたタネンバウム先生のModern Operating Systems(しかも初版)を最近になって読みました。
後半の分散OSのところはどこまで生き残ってる話かわからなかったので、RPCやNFS以外は流し読みでしたけど。

で、いっそのことOS関連をざっと勉強し直そうかな・・・と思って資料をあさっていたところで見つけたのがLions' CommentaryのPDF版。おぉ、まずはこれを読もう!ということで、ちびちびと読み始めてます。Kernel部分は1万行程度だったりするので、仕事でレビューさせられてる大量のコードに比べるとかわいいもんです。がぜんやる気が出てきました。

現在のところ、initを起動するところまでの流れを見渡して、プロセス管理を深く見直すあたりまでいってますが、とりあえず感想とか少しずつ書いてみようかと。

まず最初に面食らうのはCの文法。K&R前の代物で、型チェックがまったくないとか、構造体が無名でグローバルに参照可能とか。構造体の要素にp_とかプレフィックス付けてるのは、名前空間が存在しないがゆえか。。。型に関係なくいきなりfoo->intvalみたいな形でポインタの読み替えをしてくるので油断できません。

最初に見るのがメモリ管理。といってもページ管理みたいな大層なものではなく、ほんとにナイーブなmalloc/freeの実装。というか、アドレス順に並んでるのにリストですらない!!途中の要素を取り出すと、後ろの要素を全部1つずつ前に詰めるという・・・。ちょっと驚きました。

初期化部分はPDP-11のアセンブラで、ここも変な文法に悩まされるわけですが、2238 Clubに助けられました(笑。

ようやくCの世界に入るmain呼び出しの直前にMMUの設定がありますが、ここでまだジェネレーションギャップというか。MMUとは言っても最大8KBページが8エントリまでしかないんですね。つまり論理アドレス空間は64KB。おぉぉぉ・・・そっか純粋な16bit CPUじゃそうだよな。。。Z80以降の感覚だと8bit CPUでもメモリ空間だけは16bitだったり、16bit CPU(例えばMC68000)でもメモリ空間だけは24bitだったりしてたので、これはちょっと焦りました。そっか・・・初期のUNIXは64KBで動けたんだ・・・。

で、この8エントリのうち6エントリまでがKernelが使ってまして7エントリ目にユーザプロセス空間、8ページ目にI/O空間がマップされます。確かにこういうところからスタートしてると、スワップとかページ単位じゃなくてプロセス単位にもなりますね。。。という事で、歴史を堪能しております。