web-dev-qa-db-ja.com

仮想アドレス空間でのページサイズの決定方法

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

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

一部のページサイズは2 KB、4 KBなどです。しかし、このページサイズの数値はどのように決定されますか?建築の大きさに影響されますか?たとえば、32ビットバスには4 GBのアドレス空間があります。

44
JohnMerlino

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
58
slm

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

ほとんどすべてのアーキテクチャが4kBのページサイズをサポートしています。一部のアーキテクチャは大きなページをサポートします(いくつかは小さなページもサポートします)が、4kBは非常に広範囲にわたるデフォルトです。

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

  • 標準サイズのページは、すべてのアーキテクチャでデフォルトで4kBであると考えていますが、一部のアーキテクチャでは他の値を許可しています。 ARM64 で16kBまたは IA64 で8kB、16kBまたは64kB。これらは、MMU(Linuxが呼び出すもの [〜#〜] pte [〜#〜] )の記述子の最も深いレベルに対応します。
  • 巨大なページ 、(CONFIG_HUGETLB_PAGEは必須であり、CONFIG_HUGETLBFSもほとんどの用途に使用できます)。これは、2番目に深いレベルのMMUディスクリプター(LinuxがPMDと呼ぶもの)に相当します(または、少なくとも通常はそうですが、これがすべてのアーキテクチャーに当てはまるかどうかはわかりません)。

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

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

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

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

$ getconf PAGE_SIZE
4096

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

ページサイズは、主にプロセッサアーキテクチャに依存します。 x86では、プロテクトモードを導入した386プロセッサの時代から、ページサイズは4 kBでした。

X64モードでは、サイズが2 MBの巨大なページが存在する場合もあります。ただし、これらの使用は少し複雑です。

ページサイズの詳細については Wikipediaの記事 を参照してください

0
Tero Kilkanen

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

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

0
Leslie