今は結構楽に論文とってこれるのね。ACMからとれなくても、著者のページから
落とせたりするし。つまみ読みしているとついつい時間が経ってしまう。今日
は"SPIN - An Extensible Microkernel for Application-specific OperatingSystem Services", Brian Bershad, Craig Chambers, Susan Eggers, Chris
Maeda, Dylan McNamee, Przemyslaw Pardyak, Stefan Savage, Emin Gun
Sirer, University of Washington, Technical Report TR-94-03-03.
これは、アプリケーションに特化したサービスをカーネルにランタイムに乗せ
ようというもの。ローダブルカーネルモジュールといえばその通りなのだけど、
その保護について。最終的なSPINでは電子署名という無難な形になったようだ。
この段階では、ロードしたモジュールが他に被害を与えないように、特別の言
語を使って、そのモジュールの妥当性を見極めれるようにし、実行時にコンパ
イルされて(ここで妥当性がチェックされる)ロードされる。そしてそのモジュー
ルも、カーネルで用意された特別の領域で実行される(例えば無限ループを組ま
れても大丈夫なように)。
SPINはマイクロカーネル(当初Mach3.0からはじめていたようだ)といっても、も うカーネルから追いだす方針から反転してカーネルに持ってくることになった。 その状況でも、マイクロカーネルの優位性としていた、保護の問題を厳密なロー ドモジュールの生成手段として確保しようとしたように見える。
ここで面白い方針が、アプリケーション毎にベストなカーネルインターフェー スを用意する方向にしたことだ。これは計算機科学の分野でとても活きると思 う。大規模計算の場合、メモリ割り合てやディスクへのスワッピングは全てプ ログラム側でやってるんだ。正直、OSのメモリ割り合てなんてそれがとれるか どうか確実じゃないし、ページングなんて効率悪すぎる。というかページング が始まったら計算が終る見込みがない。OSのページングというのは、終末期の 延命治療のようなものだ。その計算プログラムのOSのようなことをしている部 分をこういう形で組み込めたらいいはず。
結局、どんどんカーネルに入れていくことになっていく。
むしろじゃあ全部ユーザにしてしまえという方向が最近の(とはいえ源泉は 1960年代の大型機にある)仮想化かな。
アドレス空間をまたぐのが大変なら単一アドレス空間にしてしまえばいいじゃ ない。という方針なのがWindows CEだ。これはプロセスの領域は32MBとして32 個のスロットに収まる。保護の問題は、MMUのASID不一致で例外を起す。SHの MMUには単一アドレス空間用のモードがある。これはカーネルモードであれば ASIDが一致しなくてもマッチを許すモード。これがあるとカーネルからのユー ザ空間のアクセスで余計な例外が出ないのでいいはず。
こうして単一アドレス空間にすることで、ユーザの空間をそのまま(Windows CE の場合、実行プロセスは一番下の0x0からのスロットで動かすということに なっているので、実際のスロットの場所とのオフセットをポイントに足す操作 が必要)、アクセスできる。
単一アドレス空間はマイクロカーネルと相性がいいと思う。相性がいいといっ てそれがマイクロカーネルならではの何か優位性を示せるかというと...。モノ リシックで単一アドレス空間の方が効率的だ。
なんでマイクロカーネルに魅かれるんだろう。一つにはその強制がモジュール 化を強制するから。なんとなくバッファをとってきて関数コールすればいいと いうことができない。でもきちっと設計したモノリシックカーネルでもそのモ ジュール化は実現できる。
FORTRANでもオブジェクティブに書けるんだよ。なんで言語としてオブジェクト 指向のがあるかというと、「こういう枠組みで書くんですよ」というのを縛り として規定することで、書く人の意識を統一することにある。この縛りがない 場合、そのプログラムに応じて、このプログラムではこういう構造でこうする 時はこうしなくてはいけなくて、こういったことはしてはいけませんみたいな ことを宣言しなくてはいけない。そして守らなくてもいじれてしまう。
なんとなくそういった縛りが課せられるマイクロカーネルが「綺麗」になり得 るような気持ちを抱くところだろうか。
とはいえ実際のとこプログラムにおいて綺麗なんてどうでもいいことだ。そん なのは実装者の自己満足で、ちゃんと動いて速いのが正しい。そしてOSを書く 人間は一般にユーザの数に較べて極小数だ。極少数なので、強制的な枠組みを 決めずとも話し合いでなんとかうまくいく。
SPINのように、外部に自由なカーネルインターフェースを提供したとしても、 そこまで書けるユーザはそんなにいないので活用されない。カーネルモジュー ル書くのにさらに、そのカーネルモジュール用の言語で書いてというのは無理 だろう。そこまで書けるなら、カーネルをいじれる。
最後の生き残りは、リアルタイム系でリアルタイムの保証をする枠組みを用意 して、その一つのプロセスとして優先度を低くOSを動かすことで、ユーザイン ターフェースだけリッチな環境を用意する方向か。
そこまでしてインターフェースを用意する必要があるかどうかも疑問だ。リア ルタイムな部分との通信でやればいい。同じCPUでやる必要がない。
SPINはマイクロカーネル(当初Mach3.0からはじめていたようだ)といっても、も うカーネルから追いだす方針から反転してカーネルに持ってくることになった。 その状況でも、マイクロカーネルの優位性としていた、保護の問題を厳密なロー ドモジュールの生成手段として確保しようとしたように見える。
ここで面白い方針が、アプリケーション毎にベストなカーネルインターフェー スを用意する方向にしたことだ。これは計算機科学の分野でとても活きると思 う。大規模計算の場合、メモリ割り合てやディスクへのスワッピングは全てプ ログラム側でやってるんだ。正直、OSのメモリ割り合てなんてそれがとれるか どうか確実じゃないし、ページングなんて効率悪すぎる。というかページング が始まったら計算が終る見込みがない。OSのページングというのは、終末期の 延命治療のようなものだ。その計算プログラムのOSのようなことをしている部 分をこういう形で組み込めたらいいはず。
結局、どんどんカーネルに入れていくことになっていく。
むしろじゃあ全部ユーザにしてしまえという方向が最近の(とはいえ源泉は 1960年代の大型機にある)仮想化かな。
アドレス空間をまたぐのが大変なら単一アドレス空間にしてしまえばいいじゃ ない。という方針なのがWindows CEだ。これはプロセスの領域は32MBとして32 個のスロットに収まる。保護の問題は、MMUのASID不一致で例外を起す。SHの MMUには単一アドレス空間用のモードがある。これはカーネルモードであれば ASIDが一致しなくてもマッチを許すモード。これがあるとカーネルからのユー ザ空間のアクセスで余計な例外が出ないのでいいはず。
こうして単一アドレス空間にすることで、ユーザの空間をそのまま(Windows CE の場合、実行プロセスは一番下の0x0からのスロットで動かすということに なっているので、実際のスロットの場所とのオフセットをポイントに足す操作 が必要)、アクセスできる。
単一アドレス空間はマイクロカーネルと相性がいいと思う。相性がいいといっ てそれがマイクロカーネルならではの何か優位性を示せるかというと...。モノ リシックで単一アドレス空間の方が効率的だ。
なんでマイクロカーネルに魅かれるんだろう。一つにはその強制がモジュール 化を強制するから。なんとなくバッファをとってきて関数コールすればいいと いうことができない。でもきちっと設計したモノリシックカーネルでもそのモ ジュール化は実現できる。
FORTRANでもオブジェクティブに書けるんだよ。なんで言語としてオブジェクト 指向のがあるかというと、「こういう枠組みで書くんですよ」というのを縛り として規定することで、書く人の意識を統一することにある。この縛りがない 場合、そのプログラムに応じて、このプログラムではこういう構造でこうする 時はこうしなくてはいけなくて、こういったことはしてはいけませんみたいな ことを宣言しなくてはいけない。そして守らなくてもいじれてしまう。
なんとなくそういった縛りが課せられるマイクロカーネルが「綺麗」になり得 るような気持ちを抱くところだろうか。
とはいえ実際のとこプログラムにおいて綺麗なんてどうでもいいことだ。そん なのは実装者の自己満足で、ちゃんと動いて速いのが正しい。そしてOSを書く 人間は一般にユーザの数に較べて極小数だ。極少数なので、強制的な枠組みを 決めずとも話し合いでなんとかうまくいく。
SPINのように、外部に自由なカーネルインターフェースを提供したとしても、 そこまで書けるユーザはそんなにいないので活用されない。カーネルモジュー ル書くのにさらに、そのカーネルモジュール用の言語で書いてというのは無理 だろう。そこまで書けるなら、カーネルをいじれる。
最後の生き残りは、リアルタイム系でリアルタイムの保証をする枠組みを用意 して、その一つのプロセスとして優先度を低くOSを動かすことで、ユーザイン ターフェースだけリッチな環境を用意する方向か。
そこまでしてインターフェースを用意する必要があるかどうかも疑問だ。リア ルタイムな部分との通信でやればいい。同じCPUでやる必要がない。
