x86_64 Longモードで32ビットコードを実行すると、Linuxカーネルはどのようにページテーブルをソートしますか?

x86_64 Longモードで32ビットコードを実行すると、Linuxカーネルはどのようにページテーブルをソートしますか?

x86_64アーキテクチャを使用すると、ロングモードで実行するとデフォルトで32ビットコードを実行できます。したがって、「互換モード」というサブモードが追加されました。メモリ管理モードは次の表から物理アドレスを計算します。

PML4 (Linux: PGD) -> PDPT (Linux: PUD) -> PD (Linux: PMD) -> PT -> physical page

上記の各テーブルは512エントリで構成され、サイズは64ビットなので、各テーブルのインデックスには9ビットが必要で、PTで取得された最後のアドレスに追加するオフセットには12ビットが必要です。合計48ビットです。 32ビットアドレスを使用すると、同じ効果が得られないことが明らかになります。
他の人はこれがどのように行われるかを説明しようとしました(ここまたはここ)しかし、これは私にとって間違っているようです。 PDPTとPDにはそれぞれ1つの項目しかないと説明されていますが、この動作は理解に少し問題があります。
MMUはPDPTのアドレスを取得するためにアドレスの最初の9つの最上位ビットを使用します。 PDPTには1つのエントリしかありませんが、MMUにはアドレスの次の9ビットをインデックスとして使用する厳密な手順があります。これで、512のケースの1つだけが最初の項目を選択します。 PDにも同じ問題が存在する。
私が見る唯一の問題ではありません。前述のように、32ビットは完全な変換には十分ではないため、一部のテーブルは何とかスキップする必要があります。

私の問題を説明し、誰かが私を助けることができることを願っています。

ベストアンサー1

x86-64中間長モードの互換性サブモードはページングに影響を与えず、64ビット長モードと同じように機能します。 32個の暗黙的な0ビットが、ページング単位を提供する仮想アドレスのビット位置63-32に挿入されます。説明にリンクした最初の質問の回答など、対応するゼロビットを有効なビットにマップするようにページテーブルを設定するだけです。バラより2.1.4.1 長期モードのメモリ管理AMD64アーキテクチャプログラママニュアル第1巻:アプリケーションプログラミング(PDF)

おすすめ記事