GNU/Linux >> Linux の 問題 >  >> Linux

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

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

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

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

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

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

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

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

ほとんどのアプリケーションでは、ページ サイズを大きくしてもメリットはわずかですが、コストは相当なものです。これが、ほとんどのシステムが通常サイズのページのみを使用する理由です。

getconf を使用して、システムの (通常の) ページ サイズを照会できます。 ユーティリティまたは C 関数 sysconf .

$ getconf PAGE_SIZE
4096

huge page を使用するには hugetlbfs をマウントする必要があります ファイルシステムと mmap ping ファイルがあります。


Linux
  1. Du出力をサイズで並べ替える方法は?

  2. Linux でユーザー空間から物理アドレスにアクセスするには?

  3. ページサイズがアラインされたメモリをどのように割り当てますか?

  1. Linux上のOracle Databaseに追加するスワップ領域の量

  2. mmap の移植性は?

  3. malloc はメモリまたは仮想アドレス空間を返します

  1. Linuxでディスク容量を確認する方法

  2. 仮想マシンにRHEL8をインストールする方法

  3. Linux カーネルをコンパイルするには、どのくらいのサイズが必要ですか?