ウィキペディアは記事MTRRで次のように述べています。
新しい(主に64ビット)x86 CPUは、ページ属性テーブルと呼ばれるより高度な手法をサポートしており、低粒度のレジスタの数を制限する代わりに、これらのモードのテーブルごとの設定を可能にします。
したがって、新しいx86 / x86_64 CPUの場合、MTRRはPAT(ページ属性テーブル)の追加手法として実装される可能性があると言えます。PATがメモリに格納される場所はページテーブル(ページテーブルエントリ(PTE)の一部のビット)であり、CPUではTLBテーブル(MMUの一部)に格納(キャッシュ)されます。TLB(およびMMU)は、すべてのメモリアクセスがアクセスする場所です。MTRR(?)でも、メモリの種類を制御するのに良い場所かもしれないと思います。
しかし、推測をやめてRTFMブックを開くとどうなりますか?x86の世界に関する非常に優れた本が1冊あります。UnabridgedPentium4:IA32 Processor Genealogy(ISBN-13:978-0321246561)です。パート7、第24章「PentiumProソフトウェアの拡張」、パート「MTRRの追加」。
582〜584ページにすべてのmtrrメモリタイプの長いルールがありますが、5つのタイプすべてのルール(Uncacheable = UC、Write-Combining = WC、Write-Through = WT、Write-Protect = WP、Write-Back = WB) 「キャッシュルックアップが実行されます」で始まります。
そして、パート9「PentiumIII」の第32章「PentiumIII Xeon」では、本は明確に次のように述べています。
メモリアクセスを実行する必要がある場合、プロセッサはMTRRと選択されたPTEまたはPDEの両方を参照して、メモリタイプを決定します(したがって、従うべき行動規則)。
しかし反対側から...MTRRregsへのWRMSRはTLBを無効にします(Intelの取扱説明書「instruct32.chm」による):
WRMSR命令を使用してMTRRに書き込むと、グローバルエントリを含むTLBが無効になります(IA-32 Intel(R)アーキテクチャソフトウェア開発者マニュアル第3巻の第3章の「トランスレーションルックアサイドバッファ(TLB)」を参照)。 )。
また、「インテル64およびIA-32アーキテクチャーソフトウェア開発者マニュアル、第3a巻」、「10.11.9ラージページに関する考慮事項」のセクションにもう1つの直接的なヒントがあります。
MTRRは、4 Kバイトの粒度(4 Kバイトのページと同じ粒度)を持つ限られた数の領域にメモリタイピングを提供します。特定のページのメモリタイプは、プロセッサのTLBにキャッシュされます。
あなたは尋ねました:
各メモリアクセスで、ハードウェアは物理アドレスが指定された範囲内にあるかどうかをチェックします
いいえ。すべてのメモリアクセスがすべてのMTRRと比較されるわけではありません。すべてのMTRR範囲は、PTEがTLBにロードされるときに、メモリのPTEビットと事前に結合されます。その場合、メモリタイプを確認する唯一の場所はTLBラインになります。また、TLBはメモリアクセスごとにチェックされます。
キャッシュを検索するか、writecombiningバッファを検索するか、メモリコントローラに直接送信するか。
いいえ、はっきりとわからないことがあります。キャッシュは、UCの場合でも、すべてのアクセスを検索しました(たとえば、リージョンがUCに変更された場合は、削除する必要のあるキャッシュされたコピーが存在する可能性があります)。
第24章から(Pentium 4についてです):
キャッシュ可能なメモリからのロード
プロセッサがキャッシュできるメモリのタイプは、WP、WT、およびWBメモリ(MTRRおよびPTEまたはPDEで定義)です。
コアがロードモップをディスパッチすると、モップはアロケータステージで予約されていたロードバッファに配置されます。次に、メモリデータ読み取り要求がL1データキャッシュに発行され、実行されます。
- 要求された読み取りデータを含む行のコピーがキャッシュにある場合、読み取りデータはロードバッファに配置されます。
- キャッシュルックアップでミスが発生した場合、リクエストはアップストリームでL2キャッシュに転送されます。
- L2キャッシュに、要求された読み取りデータを含むセクターのコピーがある場合、読み取りデータはすぐにロードバッファーに配置され、セクターはL1データキャッシュにコピーされます。
- キャッシュルックアップでミスが発生した場合、要求はアップストリームでL3キャッシュ(存在する場合)またはFSBインターフェイスユニットに転送されます。
- L3キャッシュに、要求された読み取りデータを含むセクターのコピーがある場合、読み取りデータはすぐにロードバッファーに配置され、セクターはL2キャッシュとL1データキャッシュにコピーされます。
- トップレベルキャッシュでのルックアップでミスが発生した場合、要求はFSBインターフェイスユニットに転送されます。
- セクターがメモリから返されると、読み取られたデータはすぐにロードバッファーに配置され、セクターはL3キャッシュ(存在する場合)、L2キャッシュ、およびL1データキャッシュにコピーされます。
プロセッサコアは、WC、WP、WT、またはWBメモリスペースからデータを読み取るロードを投機的に実行できます。
キャッシュ不可能なメモリからのロード
キャッシュ不可能なメモリタイプは、UCおよびWC(MTRRおよびPTEまたはPDEで定義)です。
コアがロードモップをディスパッチすると、読み取り要求は、アロケータステージで予約されたロードバッファに配置されます。メモリデータの読み取り要求は、プロセッサのキャッシュにも送信されます。キャッシュがヒットした場合、キャッシュラインはキャッシュから削除されます。要求はFSBインターフェースユニットに発行されます。FSBでメモリデータ読み取りトランザクションが実行され、要求されたバイトだけがメモリからフェッチされます。データがメモリから返されると、読み取られたデータはすぐにロードバッファに配置されます。
プロセッサコアは、UCメモリスペースからデータを読み取るロードを投機的に実行することは許可されていません
UCメモリへ
の格納UCは、キャッシュできない2つのメモリタイプの1つです(もう1つはWCメモリタイプです)。UCメモリへのストアが実行されると、アロケータステージで予約されているストアバッファにポストされます。UCメモリへのストアは、L1データキャッシュ、L2キャッシュ、またはL3キャッシュ(存在する場合)にも送信されます。キャッシュヒットが発生した場合、回線はキャッシュから削除されます。
UCメモリへのストアを含むストアバッファがFSBインターフェイスユニットに転送されると、メモリデータ書き込みトランザクション...がFSBで実行されます。
WCメモリへ
の格納WCメモリタイプは、次の特性を持つメモリ領域(ビデオフレームバッファなど)に最適です。
- プロセッサはWCメモリからキャッシュしません。
- WCメモリからのロードの投機的実行が許可されます。
- WCメモリへのストアは、プロセッサのWrite Combining Buffers(WCB)に格納されます。
- 各WCBは1行(64バイトのデータ)を保持できます。
- WCメモリ空間の行に対してストアが実行されると、そのメモリ空間の行への書き込みを記録するために割り当てられたWCBにバイトが蓄積されます。
- WCB内のある場所への後続のストアは、その場所への以前のストアによってその場所に保管されたバイトを上書きできます。つまり、同じ場所への複数の書き込みは折りたたまれ、その場所はその場所に書き込まれた最後のデータバイトを反映します。
- WCBが最終的にFSBを介して外部メモリにダンプされる場合、データは必ずしも以前のプログラムストアが実行されたのと同じ順序でメモリに書き込まれるとは限りません。書き込まれるデバイスは、このタイプの動作を許容する必要があります(つまり、正しく機能する必要があります)。詳細については、1080ページの「WCBFSBトランザクション」を参照してください。
WTメモリに保存
キャッシュ可能に保存すると、ライトスルーメモリが実行されます。ストアは、アロケータステージで使用するために予約されたストアバッファに投稿されます。さらに、ストアはルックアップのためにL1データキャッシュに送信されます。いくつかの可能性があります。*ストアがデータキャッシュにヒットした場合、キャッシュ内の行は更新されますが、S状態のままです(つまり、行は有効です)。*ストアがデータキャッシュを見逃した場合、L2キャッシュに転送され、ルックアップが実行されます。*-L2キャッシュの行にヒットした場合、行は更新されますが、S状態のままです(つまり、行は有効です)。*-L2キャッシュでミスし、L3キャッシュがない場合、それ以上のアクションは実行されません。