Linuxプロセスを物理メモリにロックするためには
システムコールmlockallを呼べばよいことになっています。
しかし、L4-Linuxでこのシステムコールが発行されても
メモリロックされないことがわかりました。



小田切さん:
(1)通常の Linux でのメモリ常駐化について

・mlockall() というシステム・コールを利用します。
・mlockall() はプロセスの仮想メモリ領域の全てに対して
 物理ページの割り当てとメモリへの読み込み、ページ・
 テーブル(pte)の割り当てを行い、これらをスワップの対象
 から外します。
・従って、mlockall() から返った後は、そのプロセスは page
 fault を起こさずに実行できることになります。

(2)L4-Linux のメモリ管理について

・「Linux プロセス」の実体は L4 タスクです。
・L4 タスクのページ・ディレクトリ(pgd)は L4 カーネルの
 内部にあります。これがハードウエア(MMU)に直結した
 メモリ管理情報です。
・「Linux プロセス」が生成された時点では、このページ・
 ディレクトリのカーネル部分(L4 の、です)のみが初期化
 され、ユーザ空間部分は空っぽのままです。
・当然、プロセスが実行を開始した途端に page fault が
 起こります。
・L4 カーネルはこの page fault をトラップして Linux サー
 バへのメッセージを送ります。これは「Linux プロセス」が
 生成された時点で、その pager として Linux サーバを
 指定しているからそうなるのです。
・Linux サーバは通常の Linux が行うのと同じ手続きで
 page fault を処理します(ページ・テーブル(pte)の割り
 当て、ページの読込み等)。処理が終わると L4 カーネル
 に対してその旨をメッセージで通知します。
・このメッセージに付随する形でページ・テーブル(pte)が
 L4 カーネルに届けられます。L4 カーネルはこれをページ・
 ディレクトリ(pgd)の然るべきエントリにしまいます。
・結果として L4 内部の pgd の各エントリは、Linux サー
 バ内部の pte を指すことになり、Linux が行うメモリ管理
 操作は L4 タスク(「Linux プロセス」)に全て正しく反映さ
 れる、という仕掛けです。

(3)L4-Linux におけるメモリ常駐化の問題点

以上の話から L4-Linux の場合には mlockall() を実行
しただけでは不十分であることが分かります。確かに
mlockall() でプロセスを構成するページは全てメモリに
読込まれ、Linux サーバ内部のメモリ管理テーブルは
整います。しかし MMU が参照する L4 カーネル内部
の pgd には、全ての pte が Linux サーバから届けられ
ているという保証がないからです。未だ一度も page fault
を起こしていないページについては L4 内部の pgd の
エントリは空っぽのままです。このページにアクセスする
と Linux サーバ内部の pte を L4 内部の pgd にセット
するだけのために page fault が起こります。



安:
まずは標準Linuxでのmlockallの話
以下の話に出てくるカーネル関数はこのような場所にあります。
/usr/src/linux/mm/memory.c    do_no_page, make_pages_present
                                             handle_mm_fault
/usr/src/linux/mm/mlock.c       mlockall
/usr/src/linux/mm/slab.c          kmem_cache_alloc
kmem_cache_alloc関数で物理メモリを確保し、もし失敗したら、
make_pages_present()関数を呼び出して確保する。。。
御存じのように、生成直後の仮想空間(ページ)にアクセスをすると,
まだ実際には物理メモリが 割り当てられていないため, CPU例外が
発生します。そのときlinuxでは,do_no_page関数が呼び出されます。
その中で物理ページが確保されます。
mlockallで確かにmake_pages_present()関数を呼び出して、
handle_mm_fault関数を呼び出して最終的にはdo_no_page関数を
呼び出してますね、kmem_cache_alloc関数での確保が失敗したら。
以上は、カーネル2.4.0での話でした。

L4でLinuxサーバをpagerとしているのはわかりました。
確信はありませんが、mlockシステムコールでは上記のように
kmem_cache_allocが呼ばれますので、物理メモリは確保される
と思うのですが、間違いですか?



小田切さん:
物理メモリは確保され、実際にページはロードされます。その点
に関しては問題ありません。しかし、それでも L4-Linux の場合
には page fault が起こってしまいます。

L4-Linux では、2つのページ・ディレクトリが存在します。

一つは普通の Linux のページ・ディレクトリで、Linux のメモリ
管理ルーチンがその内容を操作するものです。但し、これは
ハードウェアとは直接には結び付けられていません。

もう一つは L4 カーネルの内部に存在するページ・ディレクトリ
です。こちらが MMU が参照する本物です。但し、L4 自体は
その中身については一切関知していません。

当然、後者の内容は前者の内容のコピーでなければなりませ
ん。このコピー操作が行われるのはプロセスが page fault を
起こしたときだけなのです。つまり「本物のページ・ディレクトリ」
をアップ・デートするためだけに page fault が必要になります。