プロセスの仮想アドレス (VA) を RAM 内の対応する物理アドレスに変換するためのアドレス変換テーブルがありますが、テーブルに VA のエントリがない場合、ページ フォールトが発生し、カーネルはバッキング ストアに移動します (多くの場合、ハード ドライブ) に対応するデータをフェッチし、RAM とアドレス変換テーブルを更新します。だから私の質問は、バッキングストアのVAに対応するアドレスが何であるかをOSがどのように知るようになるのですか? そのための別の変換テーブルはありますか?
4 に答える
プロセスは、仮想メモリを割り当てることによって開始されます。プログラムが実際に仮想メモリアドレスのアドレス指定を開始すると、最終的にページフォールトが発生します。OSは、メモリ アクセスが有効であることを認識しています。明示的に割り当てられたため。
したがって、害はありません。OS は単に VM アドレスを物理アドレスにマップします。
ページ フォールトが、以前に有効な VM アドレスであることが要求されていないアドレスに対するものである場合、プロセッサはそのアドレスのページ テーブル エントリがないことを検出します。代わりに、プログラムで GP 違反、AccessViolation、または segfault が発生します。カブーム、プログラム終了。
少なくともあなたが想定しているような直接的な相関関係はありません。
オペレーティング システムは、仮想および物理 RAM、スワップ スペース (バッキング ストア)、およびマップされたファイルをページ (通常は 4096 バイト) に分割します。
コードが特定のアドレスにアクセスする場合、これは常に、コア内で有効、アクセスなしで有効、コア外で有効、または無効のページ内の仮想アドレスです。OS の書籍には他のプロパティ (「書き込み済み」など) がある場合がありますが、ここでは関係ありません。
ページがコア内にある場合は物理アドレスを持ち、そうでない場合は物理アドレスを持ちません。スワップアウトして再びスワップインすると、理論的には、同じ同一のページがメモリの異なる物理領域に配置される可能性が非常に高くなります。同様に、メモリ (仮想または物理) 内の他のページの後のページは、スワップ ファイルまたはメモリ マップ ファイル内のそのページの前にある可能性があります。その保証はありません。
したがって、仮想アドレスをバッキング ストアの物理アドレスに変換するようなことはありません。仮想アドレスから、一時的に物理アドレスを持つページへの変換のみが行われます。最も簡単な場合、「変換」は 4096 で割ることを意味しますが、もちろん他のスキームも可能です。
さらに、コードがメモリ ロケーションにアクセスするたびに、仮想アドレスを物理アドレスに変換する必要があります。CPU 内には専用のロジックがあり、この変換を完全に自動的に (「ホット」ページの非常に小さなサブセット、多くの場合 64 ページ程度)、またはハードウェア支援の方法で行います。複雑な階層構造。
これも欠点ですが、目に見えない欠点です。表示される唯一の障害は、OS に有効なページがない (または何らかの理由でそれを提供できない) 場合の障害であり、したがって、物理アドレスを変換対象の仮想ページに割り当てることができません。 1。
プログラムがメモリを要求すると、OS は特定のページが有効であることを記憶しますが、アクセスしたことがないため、それらはまだ存在しません。
ページに初めてアクセスすると、フォールトが発生し、明らかにそのアドレスが変換テーブルのどこにもありません (どうして存在しないのでしょう!)。したがって、OS はブックを調べ、(ページが有効であると仮定して) ディスクからページをロードするか、そうでない場合はゼロ ページのアドレスを割り当てます。
めったにありませんが、OS がチートし、実際に書き込むまで、すべてのゼロ ページが同じ書き込み保護されたゼロ ページになります (その時点で障害が発生し、書き込み可能な別の物理メモリ領域に密かにリダイレクトされます)。にも。
それ以外の場合、つまり、メモリを予約していない場合、OS は信号 (または同等のもの、Windows では「例外」と呼ばれます) を送信し、処理されない限りプロセスを終了します。
さまざまな理由から、OS は後でワーキング セットから 1 つまたは複数のページを削除することを決定する場合があります。これは通常、それらをすぐに削除するわけではありませんが、より多くのメモリが必要な場合に備えて、スワップ (マップされていないデータの場合) または破棄 (マップされたデータの場合) の候補になります。これらのページの 1 つのアドレスに再度アクセスすると、ワーキング セットに再度追加されるか (別のページが押し出される可能性があります)、ディスクから再ロードされます。
どちらの場合でも、OS が知る必要があるのは、仮想アドレスを何らかのページ識別子 (「ページ フレーム番号」など) に変換する方法と、そのページが常駐しているかどうか (およびどのアドレスにあるか) だけです。
あなたの質問の答えは、割り込みテーブルに関する問題だと思います。ページ フォールトは一種のソフトウェア割り込みであり、オペレーティング システムにはその割り込みに対する解決策が必要です。また、解決策のコードは既に OS カーネルにあり、そのコード アドレスの一部は割り込みテーブルにあります。そのため、ページ フォールトが発生します。 os はそのコードに移動して、マップされていないページを物理メモリに取得します。
これは OS 固有ですが、多くの実装ではメモリ マップ ファイル機能とロジックを共有しています (そのため、匿名ページは実際にはページ ファイルのメモリ マップ ビューであり、コンテンツをフラッシュする代わりにマッピング解除時に破棄できるようにフラグが設定されます)。
Windows の場合、これの多くはここのCreateFileMapping
ページに記載されています。