Dennis M. Ritchieのこと

Dennisに。

前置き

この記事はカーネル VM Advent Calendaの17番目の記事である。

dmrとは何度か接点があったのだが、なかでも2003年のUNIX/32Vの件はとても印象深く、現在に至るまでの私の興味の土台をかたちづくる出来事だったので、ここに記しておく。

当時私は何をしていたか

LionsによるUNIX Version 6の解説が正式に出版されたの1996年のことだった。 さっそく入手した私は、断続的にPDP-11とその上で動作するUNIXについて調べて、2002年頃にはだいぶ様子がつかめるようになった。 次のバージョンであるUNIX Version 7では16bitマシンであるPDP-11への依存から脱するべくコードが整理され、UNIXがさまざまなマシンへと移植される契機となった。このへんについて詳しくは各所で語られているのでそちらにゆずる。 その後のUNIXの発展のひとつの舞台となったのは32bitマシンのVAXであり、最初のVAXであるVAX-11/780へのUNIX Version 7の移植がUNIX/32Vであった。

UNIX/32V Report

UNIX/32VはSystem IIIおよびBSD 3.0の直接の先祖にあたり、現代的なUNIXの構造を理解するうえできわめて重要なヒントを提供してくれる。 ところが、配布テープから取り出したソースコードを含むファイルの断片は存在したものの、システム全体を理解する資料はほとんど手に入らなかった。 UNIX/32Vには移植作業を行ったThomas B. LondonとJohn F. Reiserによるテクニカルレポートが存在することはわかっていたが、どこにも見当たらなかったのである。

LondonとReiserはUNIXを開発したベル研の出身だったので「dmrに頼めばなんとかなるかもしれない」と思ってメールを出すことにした。 いま読み返してみると「まだ(ブラックホールの)事象の地平面の向こう側には行ってないはずなのでサルベージしてもらえないだろうか」などとずいぶん変な頼み方をしたのだが、dmrはこころよく引き受けてくれてた。 1週間ほどでtiffイメージと、OCRで生成されたhtmlファイルがダウンロードできるようになった。

やっと手に入ったレポートをじっくり味わいながら読むために、元の文章を見比べながらhtmlファイルを訂正することにした。 太字や斜体といった情報が落ちていたほか、読み取りエラーが散見されたので、こういった点を訂正するとずいぶん読みやすいものができた。 調子に乗って「こんな感じに訂正してみたよ」と送ってみたら、dmrはとても喜んでくれて、「これを使わせてもらうよ」と自分のページに掲載してくれた。 このレポートは今でもベル研のdmrのページから参照できるようになっていて、私にとって大変な名誉である。

UNIX/32V復活

最初のVAX-11/780は非常に野心的な構成のマシンだった。 その成功ののち、機能を簡略化して価格をおさえたVAXが次々と発売されることになる。 2003年当時は後期のVAXについてのみエミュレーターが存在していた。 のちの2007年になって、SIMHというエミュレーターパッケージでVAX-11/780もエミュレートできるようになった。 ということはUNIX/32Vも動くはず、ということでトライしてみることにした。

UNIX/32Vの配布テープからファイルシステムやカーネルのイメージを取り出したものはもともと存在していた。 そこで、ブートプロセスはひとまず置いて、カーネルを直接メモリ上に配置して動かすことにした。 実際のシステムでこのようにメモリに直接書きこむにはICEを使うなどの特別な工夫が必要だが、エミュレーターであれば造作もない。

ところが、実際に実行してみるといきなり例外が発生して動かない。 たどってみると、メモリ管理などの情報を配置したscb(system control block)を設定するコマンドscbでエラーが発生している。 変だなあ、と思いつつDECのマニュアルでscbの項を見てみると、scbの配置にはアラインメントの制限があり、UNIX/32Vの使っている位置にはそもそも置くことができないはずだ。

訳のわからないエラーだが、とりあえずエミュレーターを修正して動かすことにした。 他にもデバイスまわりでいくつかの修正が必要だったが、カーネルがちゃんと動くようになるまではほんの数日だった。 これをもとに配布テープを復元して実行できるようにしたのが現在starunixとして公開されているものである。

VAX-11/780の謎

いくらマニュアルでは動かないはずといっても、UNIX/32Vは実際にあのコードで動いていたとしか思えない。 では、それをどうやって実証すればいいのか。 さいわい、VAX-11/780関連の膨大なドキュメントが公開されており、そのなかには、回路図やマイクロコードのリストなども含まれていた。 マイクロコードとは、ごく簡単にいうと、VAX-11/780の命令セットを実現するための特殊なマシン(一種のエミュレーターと考えてもよい)のプログラムである。

これをたどっていくと、アラインメントのチェックには明らかにバグがあって、32bitのデータの一番下ではなく、上から2番目のバイトをチェックしてしまっている。 とはいえ、これでもやはりUNIX/32Vのプログラムは例外を発生するはずである。

マイクロコードのリストをよく読むと、このバグへの対策のコードが入っている。 その仕組みがなかなかおもしろい。 マイクロコードはROMに格納されている。 中身を消して再び書き込めるEEPROMのような便利なものは当時存在しなかったので、一度書き込んだROMは基本的に変更できない。 そこで、マイクロコードのバグを修正するには特殊な機構が必要になる。

そこで使われるのがFPL(Field Programmable Logic)で、プログラムから書き込み可能なROMである。 実行しているマイクロコードのアドレス(VAXのプログラムカウンターのアドレスとは無関係)をFPLの(バグのあるアドレスの)リストと比較して、アドレスがリストに含まれていればそれに対応するアドレスに実行を移す。 こういった仕組みはpatchと呼ばれていた。

FPLは容量が極めて小さいなどの制限があるため、バグの修正は完全をめざすよりも、実行にさしつかえない範囲で行われていた。 scbコマンドの修正ももやはり完全ではなく、UNIX/32Vの値はマニュアル上ではエラーになるが、実際にはチェックをすり抜けてしまっていた。

ここまで確認できれば、その実情に合わせてエミュレーターを修正することが可能になる。 といっても、正確にバグを再現するとなるとかなりの手間がかかる。 SIMHの作者と相談の結果、簡単なチェックで済ませることになった。 これもまたエミュレーターの限界のひとつである。

ともあれ、UNIX/V32が無事エミュレーターで動くようになり、UNIXの歴史を実際に動かして確認することができるようになった。

マイクロアーキテクチャーの世界

もともとそれほど強い興味があったわけではないのだが、はからずもVAX-11/780のマイクロコードを読み解くことになった。 こういった部分はハードウェア側に属するものとされていて、どちらかというとソフトウェア側の人間は知らないのが普通である。 「マイクロコードもプログラムなんだからソフトウェアにわからないはずがない」という思い込みを実証してやろうじゃないか、というのも大きなモチベーションとなった。

マイクロコードを動かすためのマシンの構造をマイクロアーキテクチャーと呼ぶ。 VAX-11/780のマイクロアーキテクチャーは極めて複雑であり、ブロック図を眺めているだけでくらくらしてくる。 scbの動きを追うのはさいわいそのごく一部を理解するだけで事足りたが、全体像を把握するのは一筋縄ではいかない。

のちの簡略化されたマシンでだいぶましにはなったが、こういった複雑な構造のマシンを高速化するのは簡単ではない。 これがCISCの行きづまりの原因のひとつである。

そこで、マイクロアーキテクチャーを簡略化する方向で突き詰めていくと、マイクロコードがどんどん簡単になり、最終的にはプログラムではなく、論理回路の組み合わせのみで動かすことができるようになる。 これがRISCの考え方である。

実は、VAXの前身のPDP-11も最初はマイクロコードを使わないマイクロアーキテクチャー(ハードワイヤードと表現する)だった。 当初はICのみでマシンを構成していたので、マイクロコードを実行するような複雑な構成のマシンが作りにくかった、という事情もある。 その後LSIが使えるようになり、マイクロコードでより低価格で高速のマシンを実現することができるようになった。 VAXの登場はちょうどこの時期にあたる。

そこから結局、RISCによりハードワイヤードなマイクロアーキテクチャーに回帰したわけで、このように歴史はいたるところでぐるぐる回っているのである。

おしまいに

こんな感じで私の興味はdmrに導かれるままUNIXの周辺をただよっている。 そのdmrがいなくなってしまったことはとてもさびしいが、これからもdmrの残した遺産のまわりをただよいつづけることだろう。 dmrに感謝してこの稿をおわる。

おしまい。


筆者:@xylnaoもしくはnao at tom-yam.or.jp
2238クラブ本館