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 になります。