仮想アドレス空間でページ サイズはどのように決定されますか?

仮想アドレス空間でページ サイズはどのように決定されますか?

Linux は、すべてのアドレスが物理アドレスではなく仮想アドレスである仮想メモリ システムを使用します。これらの仮想アドレスは、プロセッサによって物理アドレスに変換されます。

この変換を容易にするために、仮想メモリと物理メモリはページに分割されます。これらの各ページには、ページ フレーム番号という一意の番号が与えられます。

ページ サイズは 2 KB、4 KB などになる場合があります。しかし、このページ サイズの数値はどのようにして決定されるのでしょうか。アーキテクチャのサイズによって影響を受けるのでしょうか。たとえば、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 になるのですか?

ビットをシフトすると、2 の 2 乗算が実行されます。したがって、実際には、ビットを左にシフトすると ( 1 << PAGE_SHIFT)、2^12 = 4096 の乗算が実行されます。

$ echo "2^12" | bc
4096

答え2

ハードウェア(具体的にはMMU(CPU の一部)によって、可能なページ サイズが決まります。プロセッサ レジスタ サイズとは関係がなく、アドレス空間サイズとは間接的な関係しかありません(MMU が両方を決定するという点において)。

ほぼすべてのアーキテクチャは 4kB のページ サイズをサポートしています。一部のアーキテクチャはより大きなページをサポートしていますが (いくつかはより小さなページもサポートしています)、4kB は広く普及しているデフォルトです。

Linux は次の 2 つのページ サイズをサポートしています。

  • 通常サイズのページは、すべてのアーキテクチャでデフォルトで4kBであると思いますが、一部のアーキテクチャでは他の値が許可されています。たとえば、ARM64または8kB、16kB、64kBIA64これらはMMUの記述子の最深レベル(Linuxでは個人教育)。
  • 巨大なページ、コンパイルされている場合は (CONFIG_HUGETLB_PAGEは必須であり、CONFIG_HUGETLBFSほとんどの用途でも同様です)。これは、MMU 記述子の 2 番目に深いレベル (Linux では PMD と呼ばれます) に対応します (少なくとも通常はそうですが、すべてのアーキテクチャでこれが当てはまるかどうかはわかりません)。

ページ サイズは、メモリ使用量、メモリ使用量と速度の間の妥協点です。

  • ページ サイズが大きいほど、ページが部分的に使用されるときに無駄が多くなり、システムのメモリが早く不足することになります。
  • MMU 記述子のレベルが深くなると、ページ テーブル用のカーネル メモリが増えます。
  • MMU 記述子のレベルが深くなると、ページ テーブルのトラバーサルに要する時間が長くなります。

ほとんどのアプリケーションでは、ページ サイズを大きくしてもメリットはわずかですが、コストは大きくなります。そのため、ほとんどのシステムでは標準サイズのページのみが使用されます。

システム上の(通常の)ページサイズを照会するには、getconfユーティリティまたはC関数sysconf

$ getconf PAGE_SIZE
4096

巨大ページの使用ファイルシステムをマウントしhugetlbfsmmapそこにファイルを ping する必要があります。

答え3

プロセッサによって、使用可能なページ サイズが決まります。ほとんどの場合、x86 および x86_64 プロセッサのハードウェア実装ページ サイズは 4kb です。ただし、オペレーティング システムは必要に応じて一度に複数のページを割り当てることができるため、ソフトウェアで 8kb、16kb、または 32kb のページを効果的に実装できます。

x86 および x86_64 プロセッサは、それぞれ標準の 4kb ページに加えて 4mb および 2mb ページを混在させることもできます。この機能が使用される場合は、主にカーネル スペースの割り当てに使用されます。

答え4

ページ サイズは、主にプロセッサ アーキテクチャによって異なります。x86 では、保護モードが導入された 386 プロセッサの時代から、ページ サイズは 4 kB でした。

x64 モードでは、サイズが 2 MB の巨大なページも存在します。ただし、それらの使用は少し複雑です。

ページサイズの詳細については、ウィキペディアの記事

関連情報