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

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

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

「Understanding the Linux Kernel、3rd」本の第2章「メモリのアドレス指定」、「Linuxのページング」のサブ章、および「カーネルページテーブル」のセクションでは、RAMサイズが896MB未満の場合の最終カーネルページテーブルについて説明します。 :

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

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

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

実際には、拡張ページングと一般ページングがどのように共存できるかを理解していません。誰かがこれらの問題を説明してもらえますか?

  • どのような状況でカーネルは4MBページを使用しますか?それとも4KBページですか?
  • kmallocジョブではどのページフレームサイズを使用しますか? vmallocの場合?
  • 初期コードとデータ(カーネルセグメント、一時ページテーブル、および128 KBの動的データ)がRAMの最初の8 MBに適していると仮定すると(本書に記載されている例のように)、実際のRAM容量はどうなりますか?コードとデータ?データはわずか5MBです。カーネルは8 - 5 = 3MBを無駄にしますか?

答え1

1. どのような状況でカーネルは 4MB ページを使用しますか?それとも4KBページですか?

アプリケーションは大きなページを要求でき、PAGE_SIZE がカーネルソースコードにコンパイルされない場合、カーネルはページサイズを決定しません。 mmapフラグを使用して、アプリケーションソースコードのページサイズを決定します。

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

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

3.初期コードとデータ(カーネルのセグメント、一時ページテーブル、および128 KBの動的データ)がRAMの最初の8 MBに適していると仮定すると(本書に記載されている例のように)実際の量はどうですか? ?わずか5MBのコードとデータ:カーネルは8 - 5 = 3MBを無駄にしますか?

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

関連情報