6

Linux での x86-64 のユーザー仮想アドレス空間は 47 ビット長です。これは基本的に、Linux が約 128 TB の仮想アドレス範囲でプロセスをマップできることを意味します。

しかし、x86-64 アーキテクチャが各プロセスに対して ISA で定義された 4 レベルの階層ページ テーブル (基数ツリーとして配置) をサポートしていることに私は混乱しています。ページ テーブルのルートは、最大 512 GB の連続した仮想アドレス空間しかマップできません。では、Linux はどのようにして 512GB を超える仮想アドレス範囲をサポートできるのでしょうか? プロセスごとに複数のページ テーブルを使用しますか? はいの場合、プロセスの場合、CR3 (ページテーブルのベースのアドレスを含む x86-64 のレジスタ) には、特定のプロセスに対して何を含める必要がありますか? 何か不足していますか?

4

2 に答える 2

8

ページ テーブルのルートは、最大 512 GB の連続した仮想アドレス空間しかマップできません。では、Linux はどのようにして 512GB を超える仮想アドレス範囲をサポートできるのでしょうか? プロセスごとに複数のページ テーブルを使用しますか? はいの場合、プロセスの場合、CR3 (ページテーブルのベースのアドレスを含む x86-64 のレジスタ) には、特定のプロセスに対して何を含める必要がありますか? 何か不足していますか?

「ページ テーブルのルート」とはどういう意味かわかりませんが、x86-64 でのページングは​​次のようになります。

  • ページ テーブル - ページング構造の最下位レベル。それぞれが 1 つの 4 KiB ページを記述する 512 個の 8 バイト エントリ (PTE) を持っているため、PT512 * 4 KiB = 2 MiBはメモリを記述します (2 MiB ページとしても機能しますが、ここでは省略します)。
  • ページ ディレクトリ - PT を指す 512 個の 8 バイト エントリ (PDE) を含む、PT と同様のテーブル。そのため、PD512 * 2 MiB = 1 GiBはメモリを記述します (PT と同様に、1 GiB ページとしても機能します)。
  • ページ ディレクトリ ページ テーブル - PD に似ていますが、PD を指す 512 個の 8 バイト エントリ (PDPTE) が含まれています。そのため、PDPTE512 * 1 Gib = 512 GiBはメモリについて説明します。
  • ページング構造の最高レベルである PML4 は、PDPT を指す 512 個の 8 バイト エントリ (PML4E) を含むテーブルです。そのため、PML4512 * 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をマップすると見なしたという部分を見逃したという事実ですか?しかし、私が明確にすることができるものがあれば、尋ねてくださいそれ。

于 2012-06-28T14:55:32.130 に答える
0

通常、プロセスのアドレス空間は共有されません。つまり、関連するページ テーブルも個別のプロセス間で共有されません。これは、4 つのテーブル レベルすべてを意味します。

もちろん、共通 (カーネル) 部分は常にすべてのアドレス空間に存在するため、実際にはある程度の共有がありますが、そこにあるメモリにはカーネル自体のみがアクセスできます。

それ以外は、実際、すべてのプロセスには独自のページ テーブルがほとんどあり、それらのいずれかで 2 48 個のアドレスすべてを使用しても問題はありません。少なくとも、CPU 側に特別な制限はありませんが、OS 側には制限があります。

于 2012-06-28T14:28:32.113 に答える