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


43

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

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

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

回答:


56

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のバイナリ乗算が実行されます。したがって、実際にはビットの左シフト(1 << PAGE_SHIFT)は2 ^ 12 = 4096の乗算を実行しています。

$ echo "2^12" | bc
4096

2
最新のハードウェアは、2MB、およびいくつかの1GBのページサイズをサポートしています。カーネルビルドのデフォルトとして、2MBページの「PAGE_SHIFT」を21に設定できますか?
ReverseFlow

2
@ReverseFlowそのようなことを答えるには、別の質問をします。
キリルBulygin

@sim、なぜビット操作がここで使用されているのだろうか?コンパイラは通常、乗算をビット操作に変換するため、同じパフォーマンスが得られることを読みました。
InAFlash

17

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

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

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

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

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

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

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

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

$ getconf PAGE_SIZE
4096

hugeページを使用するには、hugetlbfsファイルシステムをマウントし、mmapそこにファイルをpingする必要があります。


参考:hugeページを使用する場合はhugetlbfsをマウントする必要はありません。そのカーネルのドキュメントには下部にメモがあり、共有メモリ呼び出しやmmapフラグを使用することもできます。また、さらに興味深いことに、透過的なhugeページを有効にすると、カーネルは通常のページを可能であればすべてのアプリで自動的にhugeページに変換します。
デロバート

これが本当に基本的な答えです。Linuxは、ページングハードウェアを適切に使用するように設計されています。ページングの詳細:stackoverflow.com/questions/18431261/how-does-x86-paging-work
Ciro Santilli新疆改造中心法轮功六四事件

0

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

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

ページサイズの詳細については、Wikipediaの記事をご覧ください。


0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.