最新の x86_64 マイクロプロセッサ (Intel SandyBridge、AMD Bulldozer) で、TLB (L1 および L2) が複数のページ サイズでの同時アクセスをサポートしているかどうか知っている人はいますか? x86 コア パイプラインはページ サイズに関する情報を MMU に提供しますか?
よろしくお願いします、
アレックス
これは、TLB が許可するものではなく、アーキテクチャが許可するものの問題です。PS
アーキテクチャでは、適切なレベルでページ ディレクトリ エントリのビットを設定することにより、同じページ階層内に小さい (4k)、大きい (2M)、および巨大な (1G) ページを混在させることができます。
すべてのレベルの TLB が必ずしもすべてのサイズのページをキャッシュできるわけではありませんが、必要に応じてページを混在させることをやめるべきではありません。
現在、MMU の前の x86 パイプには、ページ サイズに関するデータを実際に必要とするものは何もありません。それはすべて、ページ階層自体にエンコードされています。
ページ分割に関して、 アドレスx
にページ境界があり、 で始まるメモリ アクセスがx - 1
1 バイト幅を超える場合、両方のページにアクセスします。これは、2 つのページのサイズが異なっていても機能します。
TLB は通常、コードとデータの 2 つに分割されます。これらのそれぞれは、いくつかのレベルに分割される場合がありますが、通常は L1 であり、場合によっては L2 です。各レベルは、単一のページ サイズまたは混合ページ サイズをサポートする場合があります。
たとえば、私のプロセッサでは、2mb/4mb ページ用の I-L1 TLB が混在、2mb/4mb ページ用の D-L1 TLB が混在、4kb ページ用の I-L1 TLB、4kb ページ用の D-L1 TLB があります。最後に、4kb ページ用の D-L2 TLB です。
TLB が混合ページをサポートする場合、TLB は特定の仮想アドレス タグに関連付けられたページ サイズを格納します。
TLB レベルにページ サイズごとに複数の個別のキャッシュがある場合、ページ サイズがまだ不明であるため、ルックアップは並行して実行されます。
いずれの場合も、L1 TLB がミスした場合、ページ テーブル ウォークを試みる前に L2 がチェックされます。
詳細が明らかになったので、ようやくあなたの質問に答えることができます。同時に複数のページ サイズを使用できますが、重複することはありません (OS では、同じ場所に 2 つの仮想ページをマップすることはできません)。実際、カーネルは内部的にさまざまな目的で複数のページ サイズを使用しています。
OS によっては、ユーザー空間プロセスで複数のページ サイズを使用するのが簡単な場合と面倒な場合があります。詳細については、Linux Huge Page サポートおよび Windows Large Page サポートを参照してください。他の OS のドキュメントには、これに関する詳細が記載されています。