Posted at

ページフォールト処理

More than 3 years have passed since last update.


  1. ハードウェアは、プログラムカウンタをスタック上に保存してカーネルへトラップをかける。
    大半のマシンでは、実行されていた命令の状態についての情報も特殊なレジスタに保存している。

  2. アセンブリコードルーチンを実行。OS の破壊を防止するため、汎用レジスタとその他の揮発性の情報を保存してから手続き呼び出しの形で OS を呼び出す。

  3. OS はページフォールトが発生したことを認識する。そして必要とされる仮想ページを見つける。
    1つのハードウェアレジスタがこの情報を持っていることが多い。持っていない場合は、OS はプログラムカウンタを調べてその命令を取り出す。
    ページフォールト時にその命令が何をしていたかはハードウェアで解析することになる。

  4. ページフォールトを発生させた仮想アドレスを知った後、システムはそのアドレスがそのアクセスに対して保護を含めて正しいアクセスかどうかをしらべる。
    正しいアクセスでなければ、そのプロセスにシグナルを送るか強制終了させる。
    正しいアクセスであれば、システムは空きページフレームを探す。
    空きフレームがなければ、ページ置き換えアルゴリズムを起動して追い出しページを決める。

  5. 選択されたページフレームがダーティであれば、そのフレームをディスクへの転送のためにスケジュールしてコンテキストスイッチをかける。
    つまりフォールトを起こしたプロセスをサスペンドさせ、他の1つのプロセスをディスク転送完了まで実行する。
    この時、そのフレームは他の目的に使用されないようにビジーとマーキングされる。

  6. ページフレームがクリーンになると、OS は要求されたページがディスクのドコにあるかを調べる。
    そしてそれを持ってくるようにディスク操作をスケジュールする。
    そのページをロードしている間はフォールトを起こしたプロセスはサスペンドにされ、もし必要があれば他のユーザプロセスを実行する。

  7. メモリへのページロード完了を通知する割り込みがディスクからかかると、マッピングを変更するようにページテーブルを更新する。
    そしてそのページフレームは通常の状態であるとマーキングされる。

  8. フォールトを起こした命令をフォールトが始まった時の状態に戻し、プログラムカウンタをその命令を指すように再設定する。

  9. フォールトを起こしたプロセスをスケジューリングして、OS は呼び出し元のアセンブリコードルーチンへ戻る。

  10. アセンブリルーチンはレジスタ内容とその他の状態を復元してからユーザ空間に戻り、フォールトがなかったかのようにプログラムを再開する。