2つの同じ仮想アドレスがどのように異なる物理アドレスを指すことができますか?

2つの同じ仮想アドレスがどのように異なる物理アドレスを指すことができますか?

Linuxでfork()を呼び出すと、2つのプロセス(1つの別のプロセスの子プロセス)が割り当てられたヒープメモリを共有します。このように割り当てられたページはCOW(記録中にコピー)として表示され、2つのプロセスのいずれかがページを変更するまで共有されたままになります。この時点でコピーされますが、それを参照する仮想アドレスポインタは変更されていません。 MMU(Memory Management Unit)はこの2つをどのように区別しますか?以下を考慮してください。

  1. プロセスAが開始されました
  2. プロセスAは、仮想アドレス0x1234が指すメモリページを割り当てる。
  3. プロセスAはプロセスBを作成するためにフォークします。
  4. プロセスAおよびBは、同じ物理メモリ位置を指す仮想アドレス0x1234を共有する。
  5. プロセスBは0x1234メモリページを変更します。
  6. メモリページがコピーされた後に変更されます。
  7. プロセスAとBの両方に仮想アドレス0x1234がありますが、これは異なる物理メモリアドレスを指します。

これをどのように区別しますか?

ベストアンサー1

プロセス間のコンテキスト切り替え中にカーネルが実行する作業の1つは、MMUテーブルを変更して前のプロセスのアドレス空間を記述するエントリを削除し、次のプロセスのアドレス空間を記述するエントリを追加することです。プロセッサアーキテクチャ、コア、および可能な設定に応じてプロセッサレジスタを変更したり、メモリ内のページテーブルを操作してこれを実行できます。

フォーク操作後の書き込み中のコピーにより、両方のプロセスのMMUテーブルは同じ物理アドレス(仮想アドレス0x1234)を持ちます。繰り返しますが、これらはこの特定の仮想アドレスに対して同じエントリを持つ2つの別々のテーブルです。

このページの記述子には読み取り専用属性があります。プロセスが書き込み(AまたはB)を試みると、権限違反が原因でプロセッサエラーが発生します。カーネルのページエラーハンドラが実行され、状況を分析し、新しい物理ページを割り当てることを決定し、読み取り専用ページの内容をこの新しいページにコピーし、呼び出しプロセスのMMU設定を変更して、0x1234が新しい割り当てページを指すようにします。読み取りを含む物理ページのプロパティページを作成し、エラーを引き起こしたコマンドの呼び出しプロセスを再開します。今回はページへの書き込みが可能なので、ディレクティブは輻輳しません。

他のプロセスのページ記述子はこの操作の影響を受けません。実際にはそうかもしれません。カーネルもタスクを実行するからです。つまり、ページが現在単一のプロセスにのみマップされている場合は、後でコピーするのを防ぐために読み取り/書き込み状態に戻ります。

また、見ることができますページフォルト後はどうなりますか?

おすすめ記事