2005-08-17
■[tech]マイクロカーネル
Prexのカーネルは元々は汎用OS向けのカーネルとして設計された。
OSの扱うものすべてがオブジェクト、そのオブジェクトは移動可能で、システム・コールはIPCの3つだけ、多くの機能をユーザモードに追い出す、というかなり実験的なアプローチだった。例えばスレッドを生成するには、"Thread"オブジェクトに対して"NEW"というIPCメッセージを投げる。当時、次世代マイクロカーネルやオブジェクト・オリエント、アクティブ・エージェントなどを勉強していて、L4やApertosとかの影響を受けていた。Prexで、ポートのことをオブジェクトと呼ぶのは、昔のオブジェクト・サーバの名残だが、今は当時の設計の面影はほとんどない。っていうか実装が大変で断念した・・・。:-)
L4といえば、以前はJochen Liedtkeの論文を色々と読んでいた。だから、彼が突然亡くなった時には、会ったこともない人なのになんだかすごくショックを受けたのを覚えている。あれから4年も経つが、L4-HurdやL4-Linuxも何か今ひとつだった。L4のカーネルは当時としてはめずらしくC++で書かれていたが、自分としては読むのにとても苦労した記憶がある。
そういえば、L4に限らず、BSD LitesやMkLinuxなど、マイクロカーネルに既存のOSを乗っけたものにはロクなものがなかった。カーネルは最近はやりの仮想マシン的な扱いで、サーバのコードはひどく汚く、自分のイメージとはかけ離れていた。Machに乗るHurdはかなりマシだったが、それでもかなり苦労していたというのは、サーバやライブラリのコードを読めばすぐにわかった。OSXもそのコードは読んではいないが、Litesを見ればだいたい想像がつく(Machにどれだけ手を入れているかにもよるけど・・・)。結局、自分の知っている中ではまともな設計は、上から下まで通して開発されたAmoebaか、プロプラエタリならQNXくらいのものだ。マイクロカーネル設計時に同時にサーバの設計も意識しなければ、きれいなシステム構築は出来ないという事だろう。
Linuxを上に乗せるといえば、Chorusもある。ChorusOSはSunに買われて、ChorusマイクロカーネルをベースにJavaOSを作ったが失敗。JavaOSは非常に良い設計だったのに、出るのが少し早すぎた。その後、ChorusはJalunaという組み込みのリアルタイムOSとして復活している。実はJalunaの設計思想はものすごくPrexに近いのだが、自分は別にそれを参考にしたわけではない。正確には、Chorusのコードは読んでいたが、Jalunaの存在を知ったのはPrexの設計のずいぶん後だ。最近のJaluna-2ではLinuxとVxWorksエミュレータを同時に動かすという離れ技をやっているらしく、これは最もトレンディーでナウい(?)リアルタイム・アプローチだ。自分はJaluna-1のデザインが好きだが、実際に現場で求められている売れ筋はJaluna-2という事か・・・。
そもそも、Linuxのように常に変化しているカーネルを、何かの上に乗せてはダメだ。苦労して乗っけたとしても、どうせすぐ新しいバージョンに置いてかれるのは目に見えている。そのたびにパッチの作り直し。そうでなければ、「えー!まだそんな古いバージョン?」と言われるに決まっている。ハイブリッドとかって言うのは簡単だが、ずっとメンテが付いてまわるってわかってんのかな?
だいたい、OSを他の何かの上に乗せて成功した例は一つしかない。OS/2にWindows 3.1を乗せた通称”Win-OS2”だ。何しろネイティブのWindowsよりもパフォーマンス出たんだから。古いか・・・。古いならOS/370とかあるか・・・。
話は変わるが、Prexでも、プロセス、ファイルシステム、ネットワーク、といったOS機能はカーネルでなくユーザモード・サーバで実現する。クロス・プラットフォームなポータビリティを志向していて、ドライバをカーネル・モードで動かし、ページャだけでなく仮想メモリマネージャまでカーネルに内包するという点では、オーソドックスな第一世代のマイクロカーネルと言える。おまけに、余計な(!)リアルタイム拡張まで取り込んだので、システム・コールはなんと57個にもなっている。カーネルサイズはL4の12Kバイトの2倍はある。故Liedtke先生に言わせるとダメダメな設計だろう。
視点を替えてPrexを組み込みOSとして捉えてみると、その呼び方も変わる。組み込みの世界では、ファイル・システム、ネットワークなどのコンポーネントはミドルウェアで提供するのが普通だ。IPCに関するアプローチが少し異なるが、Prexでいうカーネル部分は単にOSあるいはカーネルと呼ばれ、それをマイクロカーネルなどと呼ぶ事はない。
そういった事情もあって、自分がPrexのカーネルについて記述する時には、システム・サーバを含めたOSの一部という文脈ではマイクロカーネル、そうでないときにはカーネルと表現するようにしている。
