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です。