特定のアドレスから一部のデータを読み書きする場合は、ディレクトリの最初のページがどこに保存されているか、変換するアドレスを知っておく必要があります。
最初のページディレクトリ(私が知っている限り、Linuxは4レベルのページングを使用するため、最初のディレクトリはPGD
)であり、Intelの場合、CR3
レジスタにはPGDのアドレスが含まれますが、仮想アドレスはどこに保存されますか? MMUはこのアドレスまたはそのアドレスを正確に翻訳する必要があることをどのように理解していますか?
UPD:私は私の質問を明確にし、私の意見についていくつかの詳細を提供する必要があると思いました。
私が理解しているように、いくつかの仮想アドレスを変換するには、次の手順を実行する必要があります。
- TLBを確認してください。
- TLBに達すると物理アドレス(PA)があります。
- そうでなければ、私たちが扱うべきこと翻訳エラー
- 翻訳エラーが発生している間、私たちはそれを経なければなりません。ソフトウェアページテーブルPAを見つけてください。
- ここではカーネルモードに切り替える必要があります。(しかし、一般にカーネルページテーブルとユーザーページテーブルは同じであり、違いは権限にのみあることを知っていますが、カーネルモードに切り替えない方法はありますか?)
- だから私たちは設定する必要がありますCR3PGDアドレス(または他のトップページディレクトリ)に登録してください。
- さて、このテーブルを繰り返すのは私たちの使命ですか?ソフトウェアが自分でこれを行う必要がある場合は、一部のvarの仮想アドレス(VA)を知ってページテーブルからPAを検索できますか? ? ?あるいは、MMU(または同様のもの)で動作し、これらのテーブルを繰り返します。 CR3の場合、PGDがどこにあるかを知っていますが、変換されるアドレスをどのように理解できますか?それはどのレジスタにありますか、それともどこかにメモリにロードされていますか?
時間をいただきありがとうございます!
答え1
あなたがリストしたステップは正確ではありません。この問題を解決すると、何が起こっているのかを知ることができることを願っています。
CPUがメモリにアクセスしようとします(例えばフェッチ命令または現在の命令がメモリにアクセスするため) - 仮想アドレスが出てくる場所。
TLBを確認してください。
TLB に仮想アドレスのエントリがある場合は、その物理アドレスを取得します。
それ以外の場合、MMUはTLBの欠落を処理する必要があります(これはx86の欠陥ではなく、計算されますが、カーネルには知られていません)。
MMUは、.NETに保存されている値から始めてページテーブルに移動します
CR3
。ステップ0から始めて、解決する必要がある仮想アドレスを知っています。カーネルモードへの移行はありません。これはすべてMMU(x86)によって処理されます。
CR3
そして、メモリアクセスの前にページテーブルを設定する必要があり、ここでは何も変わりません。 (望むよりページワーキングの一貫性の詳細な分析.)
一部のアーキテクチャ(MIPSだと思います)するTLBミスを処理するときにカーネルが関連しています。この場合、処理する必要がある仮想アドレスがエラーメッセージに表示されます。