CPUは、どの物理アドレスがどの仮想アドレスにマップされているかをどのように知ることができますか?

CPUは、どの物理アドレスがどの仮想アドレスにマップされているかをどのように知ることができますか?

私が理解したように、各プロセスは物理アドレスではなく仮想アドレスを介してメモリにアクセスし、CPUはこれらの仮想アドレスをMMUユニットを介して物理アドレスに変換する役割を果たし、複数のプロセスが同じ仮想アドレスを持つことができます。

それから私たちはこう言います。プロセスA仮想アドレスにアクセスしようとしており12345プロセスB仮想アドレスにアクセスしようとしています12345

MMUはどのように各プロセスの仮想アドレスを物理アドレスに変換しますか?仮想アドレスを物理アドレスにマッピングするマッピングテーブルを各プロセスに提供します(CPUは「プロセス」が何であるかさえ知らないので、MMUは責任がどの命令がどのプロセスに属するのか気にせずに盲目的に命令を実行します。 「プロセス」はオペレーティングシステムの概念にすぎません)?

ベストアンサー1

これメモリ管理ユニット仮想アドレスを物理アドレスに変換する方法を示す表にアクセスしてください。 (物理アドレスを仮想アドレスに変換する必要はありません。同じ物理アドレスは複数の仮想アドレスを介してアクセス可能またはマッピング解除可能であるため、通常は不可能です。)この表のレイアウトはCPUアーキテクチャによって異なりますが、一般的な原則は次のようになります。常に同じです。テーブルの物理アドレスを含むCPUレジスタがあり、これには他のテーブルの物理アドレスなどが含まれます(既存のアーキテクチャの合計2〜4つのレベル)。テーブルにはデータを含む物理アドレスが含まれています。各レベルで使用されるテーブルの要素は、仮想アドレスの特定のビットによって決定されます。

MMUは、オペレーティングシステムプロセス自体についての知識を持っていません。 CPUが別のプロセス実行に切り替えたとき、つまりコンテキストスイッチこれが発生した場合は、必要に応じてMMUテーブルを更新することがオペレーティングシステムのコンテキスト切り替えコード操作です。実際、すべてのUnixシステムは、各プロセスのメモリにテーブルのコピーを保持し、現在のプロセスの最上位テーブルを指すようにMMUレジスタを更新するだけです。

実際、MMUにはオペレーティングシステムプロセスを管理する部分があります。TLB。 MMU テーブル内のエントリの検索には複数のメモリアクセスが含まれるため、コストがかかります。 TLB はこれらのルックアップのキャッシュです。コンテキスト切り替え時に、オペレーティングシステムは新しいプロセスへのマッピングが異なるため、TLBを無効にする(つまり、すべてのキャッシュエントリを削除する)必要があります。多くのアーキテクチャでは、オペレーティングシステムは各MMUテーブルエントリに「このエントリはプロセスNに属します」というマークを付けることができます。 TLBエントリに現在のプロセス番号ではなくプロセス番号が含まれている場合は、そのエントリをスキップします。 CPU レジスタには、コンテキスト切り替えコードによって更新される現在のプロセス番号が含まれています。このメカニズムは、TLBに複数のプロセスに関する情報を同時に含めることができ、これらのプロセスを切り替えるとパフォーマンスを向上させることができます。通常、すべてのオペレーティングシステムのプロセスIDを格納するのに必要なビット数よりもNを格納するために使用できるビットが少ないため、NはプロセスIDではなく、この目的のためにオペレーティングシステムによって生成された数であり、使用される場合は時間の経過とともに変更されます。

おすすめ記事