B-Free メイリングリストの皆さん、こんにちは。
メモリマネージャについてのお話の続編です。
メモリマネージャについて (3)
〜ページインの処理について〜
メモリマネージャについて(2) では、どちらかというと一般的な話として書
いてきました。今回のページインの処理については、再び B-Free 独自の話と
なります。
ページインの処理は、ユーザプロセスが物理メモリにマッピングされていない
仮想メモリにアクセスしたときに、ページフォールトが発生がきっかけで実行
します。処理すべきことは、単純で前にページアウトした HD などからページ
内容を読み込み、アロケートした物理メモリに入れるだけです。
ただし、B-Free 特有の事柄がいくつかあります。
UNIX のような一枚岩の OS では、ページフォールトをおこしたプロセスのコ
ンテキストで、カーネル(OS) がページインの処理を行います。
しかし、B-Free のようなマイクロカーネル方式の OS では、カーネル(中心核)
には、ページインを行う機能はありません。ページインは別のタスクとして動
いているメモリマネージャが行います。
問題となるのは、誰がメモリマネージャに対してページインの要求を送信する
かということです。いくつか方法が考えられます。
(1) 中心核がメモリマネージャに送信する。
この場合、ページフォールトが発生したときの処理が他の例外と異なる。
中心核に仮想メモリ機能のための特別な処理を入れ込む必要がある。
(中心核は、たいていの処理では自分からメッセージは送信しないことに
なっている)
(2) LOWLIB がメモリマネージャに送信する。
この場合、中心核は特別な処理は必要ない。ページフォールトが発生した
ときの例外ハンドラを LOWLIB の中の関数にするだけである。
ただし、各プロセスごとに LOWLIB が異なるので、プロセスごとにハンド
ラを登録する機能をサポートする必要がある。
(3) メモリマネージャが直接ページフォールト例外を受信する。
80386 にあるタスクゲート機能を使って、直接ページフォールトをメモリ
マネージャが受信します。タスクゲートを使っても中心核が管理している
タスク情報は切り換わらないので、メモリマネージャはハンドラ内で明示
的にタスクスイッチを行う必要があります (しかも、このタスクスイッチ
は、直前に動いていたタスクのコンテキスト情報をどこからかもってくる
必要もある!)。
蛇足かもしれませんが、前回の第8回の打ち合わせで配布した資料にあるのは、
(2) の方法によるものです。この方法では、中心核の修正は、最小限で済みま
すが、LOWLIB がページフォールトのための処理を行う必要があります。
-- 内藤隆一 (ggc00661@niftyserve.or.jp)