ページ テーブルのルートは、最大 512 GB の連続した仮想アドレス空間しかマップできません。では、Linux はどのようにして 512GB を超える仮想アドレス範囲をサポートできるのでしょうか? プロセスごとに複数のページ テーブルを使用しますか? はいの場合、プロセスの場合、CR3 (ページテーブルのベースのアドレスを含む x86-64 のレジスタ) には、特定のプロセスに対して何を含める必要がありますか? 何か不足していますか?
「ページ テーブルのルート」とはどういう意味かわかりませんが、x86-64 でのページングは次のようになります。
- ページ テーブル - ページング構造の最下位レベル。それぞれが 1 つの 4 KiB ページを記述する 512 個の 8 バイト エントリ (PTE) を持っているため、PT
512 * 4 KiB = 2 MiB
はメモリを記述します (2 MiB ページとしても機能しますが、ここでは省略します)。
- ページ ディレクトリ - PT を指す 512 個の 8 バイト エントリ (PDE) を含む、PT と同様のテーブル。そのため、PD
512 * 2 MiB = 1 GiB
はメモリを記述します (PT と同様に、1 GiB ページとしても機能します)。
- ページ ディレクトリ ページ テーブル - PD に似ていますが、PD を指す 512 個の 8 バイト エントリ (PDPTE) が含まれています。そのため、PDPTE
512 * 1 Gib = 512 GiB
はメモリについて説明します。
- ページング構造の最高レベルである PML4 は、PDPT を指す 512 個の 8 バイト エントリ (PML4E) を含むテーブルです。そのため、PML4
512 * 512 GiB = 256 TiB
はメモリについて記述します。
Linux の正確なメモリ マップはわかりませんが、おそらく上位半分 (-128 TiB から 0 - から0xFFFF800000000000
まで0xFFFFFFFFFFFFFFFF
) はカーネル用に予約されており、下位半分 (0 から 128 TiB から から0x0000000000000000
まで0x00007FFFFFFFFFFF
) はユーザー空間アプリケーション用です。したがって、Linux は、求めている 512 GiB の仮想アドレス範囲の 512 倍をサポートします。Torvalds でさえ「PML4 をサポートしない」とは言いません。何があなたを混乱させているのかわかりません-ページテーブルが2 MiBをマップし、1ページ-4 KiBをマップすると見なしたという部分を見逃したという事実ですか?しかし、私が明確にすることができるものがあれば、尋ねてくださいそれ。