Linuxシステムでページ違反が発生した場合、割り込みハンドラーは、ページ違反が発生した理由を解明する必要があります。しかし、どうやって?
仮想アドレスのMMUルックアップが無効な記述子またはアクセス許可の欠如を示す記述子(読み取り専用ページへの書き込み試行など)で終了したためにメモリアクセスが失敗すると、ページフォールトが発生します。ページ違反が発生すると、プロセッサはいくつかのアクションを実行します。詳細は各プロセッサアーキテクチャに固有ですが、要点は同じです。
例として、(32ビット)ARMプロセッサで:
dfsr
レジスタは、障害を説明する値に設定されます(それが読み取りによるものか、書き込みによるものか、プロセッサ命令またはDMAなどによるものか)。dfar
レジスタは、障害の原因となったアクセスのターゲットであった仮想アドレスに設定されます。lr
レジスタは、障害発生時にプログラムカウンタに設定され、spsr
レジスタはプログラムステータスレジスタ(cpsr
、障害発生時のモードビットなど)。sp
およびcpsr
レジスターはバンクされています。これらは、アボートモードで最後に設定された値から復元されます。ページフォールトハンドラーのコードは、オペレーティングシステムのカーネルの一部です。その仕事は、障害の原因を分析し、それについて何かをすることです。障害の性質に関する情報を提供する専用レジスターを調べ、必要に応じて、プログラムが実行していた命令を検査することもできます。 MMUテーブルで記述子を検索することもできます。無効な記述子は、スワップ空間内のページの場所などの情報をエンコードすることがあります。カーネルは、各コンテキストスイッチで更新するグローバル変数またはレジスタの値を調べることで、現在実行中のタスクを認識します。次に、ページフォールトでのいくつかの一般的な動作を示します。
仮想メモリの構成を理解し、メモリアクセスの前にチェックを行うことを除いて、例外が発生しようとしていることを特定することは、一般的には不可能です。通常の動作フローでは、ページフォールトが発生したときに、プロセッサによってページフォールトの理由が記録されます。