Linuxは、すべてのアドレスが物理アドレスではなく仮想アドレスである仮想メモリシステムを使用します。これらの仮想アドレスはプロセッサによって物理アドレスに変換される。
この変換をより簡単にするために、仮想メモリと物理メモリをページに分割します。各ページには固有のページフレーム番号があります。
一部のページサイズは2KB、4KBなどにすることができます。しかし、このページサイズの数値はどのように決まりますか?アーキテクチャのサイズによって影響を受けますか?たとえば、32ビットバスのアドレス空間は4 GBです。
答え1
次のコマンドを使用してシステム構成を照会して、システムのデフォルトページサイズを確認できますgetconf
。
$ getconf PAGE_SIZE
4096
または
$ getconf PAGESIZE
4096
メモ:上記の単位は通常バイト単位であるため、4096は4096バイトまたは4kBに等しくなります。
これはLinuxカーネルのソースコードに組み込まれています。
はい
$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */
#define PAGE_SHIFT 12
#ifdef __ASSEMBLY__
#define PAGE_SIZE (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK (~(PAGE_SIZE-1))
ギアをシフトすると、どのように4096が出ますか?
Shift を行うと、2 のバイナリ乗算が行われます。したがって、左に移動(1 << PAGE_SHIFT
)するのは実際に2^ 12 = 4096の乗算です。
$ echo "2^12" | bc
4096
答え2
ハードウェア(具体的にメモリ管理ユニット、CPUの一部)によって、可能なページサイズが決まります。これはプロセッサのレジスタサイズとは関係がなく、アドレス空間のサイズとは間接的にのみ関連しています(MMUは両方を決定するため)。
ほとんどすべてのアーキテクチャは4kBのページサイズをサポートします。一部のアーキテクチャではより大きなページをサポートしていますが(一部は小さいページもサポートしています)、4kBは非常に一般的なデフォルトです。
Linuxは2つのページサイズをサポートしています。
- 通常のサイズページは、すべてのアーキテクチャでデフォルトで4kBと考えられますが、一部のアーキテクチャでは16kBなどの他の値を受け入れます。ARM64または8kB、16kB、または64kBIA64。これはMMUの最も深いレベル記述子に対応します(Linuxではこれを呼び出します)。英語を話すテスト)。
- 大きなページ、(でコンパイルされている場合は
CONFIG_HUGETLB_PAGE
必要であり、CONFIG_HUGETLBFS
ほとんどの目的で使用されます)。これは2番目に深いMMU記述子レベル(LinuxではPMDと呼ばれるもの)に対応します(または少なくとも一般的にはそうです。これがすべてのアーキテクチャに適用されるかどうかはわかりません)。
ページ・サイズは、メモリー・スペース、メモリー使用量、および速度のトレードオフです。
- ページサイズが大きいほど、ページが部分的に使用されると、より多くの無駄が発生するため、システムのメモリがより早く不足します。
- MMU記述子レベルが深いほど、ページテーブルのカーネルメモリが増えます。
- MMU記述子レベルが深いほど、ページテーブルのナビゲーションに時間がかかります。
ほとんどのアプリケーションでは、より大きなページサイズの利点は小さいですが、コストは高くなります。これがほとんどのシステムが通常サイズのページだけを使用する理由です。
以下を使用して、システムの(一般)ページサイズを照会できます。getconf
ユーティリティまたはC関数sysconf
。
$ getconf PAGE_SIZE
4096
巨大なページを使うhugetlbfs
ファイルシステムとmmap
pingファイルをここにインストールする必要があります。
答え3
プロセッサは利用可能なページサイズを決定する。ほとんどの場合、x86およびx86_64プロセッサでハードウェアで実装されているページサイズは4kbです。ただし、オペレーティングシステムが必要な場合は、一度に複数のページを割り当てることで、ソフトウェアで8kb、16kb、または32kbのページを効果的に実装できます。
x86およびx86_64プロセッサは、標準の4kbページとそれぞれ4mbおよび2mbページを混在させることもできます。この関数を使用すると、主にカーネル空間を割り当てるために使用されます。
答え4
ページサイズは主にプロセッサアーキテクチャによって異なります。 x86では、保護モードが導入された386プロセッサ時代から、ページサイズは常に4kBでした。
x64 モードでは、最大 2 MB サイズの大容量ページも存在できます。しかし、それらを使用するのは少し複雑です。
ページサイズの詳細については、以下で確認できます。ウィキペディア記事