拡張 (4MB) ページングと通常 (4KB) ページングは​​どのように共存しますか?

拡張 (4MB) ページングと通常 (4KB) ページングは​​どのように共存しますか?

x86 アーキテクチャでは、「拡張ページング」により、ページ フレーム (物理メモリ) を 4 KB ではなく 4 MB にすることができます。

書籍「Linux カーネルの理解、第 3 版」の第 2 章「メモリ アドレス指定」、サブ章「Linux でのページング」、セクション「カーネル ページ テーブル」では、RAM サイズが 896 MB 未満の場合の最終的なカーネル ページ テーブルについて次のように説明されています。

[...] カーネルは、大きなページを利用して RAM をアドレス指定できます (この章の前半の「拡張ページング」セクションを参照)。

ただし、「拡張ページング」セクション (サブ章「ハードウェアでのページング」) には、次のように書かれています。

拡張ページングは​​通常のページングと共存します。

拡張ページングと通常のページングがどのように共存するのか、私にはよく分かりません。誰かこれらの質問を説明していただけませんか:

  • カーネルが 4 MB ページを使用するのはどのような場合ですか? それとも 4 KB ページですか?
  • kmalloc 操作に使用されるページ フレーム サイズはどれですか? vmalloc の場合は?
  • 初期のコードとデータ (カーネルのセグメント、暫定ページ テーブル、および動的データ用の 128 KB) が RAM の最初の 8 MB に収まると仮定した場合 (本書で示されている例のように)、実際のコードとデータの量が 5 MB だけだった場合はどうなるでしょうか。カーネルは 8 - 5 = 3 MB を無駄にするでしょうか。

答え1

1. カーネルが 4 MB ページを使用するのはどのような場合ですか? それとも 4 KB ページですか?

アプリケーションは巨大なページを申請できますが、カーネルは PAGE_SIZE をカーネル ソース コードにコンパイルしない限りページ サイズを決定しません。mmap フラグを使用すると、アプリケーションのソース コードでページ サイズを決定できます。

2. kmalloc 操作に使用されるページ フレーム サイズはどれですか? vmalloc の場合はどれですか?

kmalloc は Linux カーネルのデフォルトのページ サイズ (カーネルの PAGE_SIZE) を使用します。これはコンパイル時または実行時に決定されます。vmalloc も同様です。

3. 初期のコードとデータ (カーネルのセグメント、暫定ページ テーブル、および動的データ用の 128 KB) が RAM の最初の 8 MB に収まると仮定した場合 (本書で示されている例のように)、実際のコードとデータの量が 5 MB だけだった場合はどうなるでしょうか。カーネルは 8 - 5 = 3 MB を無駄にするでしょうか。

無駄なメモリのサイズは PAGE_SIZE とデータによって決まります。ページ サイズが 4MB、データが 5MB の場合、無駄なメモリ サイズは (PAGE_SIZE*N) - 5MB = 3MB になります。

関連情報