仮想メモリのページ サイズを変更することはできますか? ウィキペディアの MMU 記事の X86_64 の部分で、さまざまなページ サイズについて説明しているため、私はこれを求めています。ページサイズを実際に変更できる場合、どのように変更しますか?
5 に答える
x86_64 では、 hugetlbfsを使用して、通常の 4 KiB ページの代わりに 2 MiB ページを明示的に要求できます。透過的なヒュージ ページをサポートする最新のカーネルでは、メモリの断片化がそれほど大きくなく、十分なメモリがまだ空いている場合、小さなページをバックグラウンドでヒュージ ページに自動的に連結できます。
私の知る限り、アプリケーションがページサイズを要求できるオペレーティングシステムはありません。x86_64ページングシステムは、さまざまなサイズのページを混在させる機能を提供しますが、これは通常、大量のメモリが一度に割り当てられる場合にのみ使用されます。
x86_64(およびx86)では、仮想アドレスは一連のページテーブルを介して物理アドレスにマップされます。各テーブルは、物理仮想アドレスに特定のビット数を提供します。x86_64は現在、マッピングごとに最大4つのテーブルを使用でき、それぞれが9つの仮想アドレスビットを提供し、下位12ビットがページ内のオフセットを指定します。最初の3つのテーブルはそれぞれ次のテーブルの物理アドレスを指し、最後のテーブルは実際のページの物理アドレスを指します。
| PML4T entry |-+
V
+-| PDPT entry |
V
| PDT entry |-+
V
| PT entry |-> Physical address (4kB page)
ただし、2番目と3番目のテーブルエントリにもビットが含まれています。これが設定されている場合、それ以上のテーブルがないことを示し、そのエントリが物理アドレスを提供します。これが発生すると、他のテーブルによって提供されるビットが物理ページオフセットに移動され、削除されたテーブルごとにページサイズに512が乗算されます。
| PML4T entry |-+
V
+-| PDPT entry |
V
| PDT entry (PS=1) | -> Physical address (2MB page)
特定の仮想アドレスへのマップに使用されるテーブルの数を変更することにより、オペレーティングシステムは4kB(4テーブル)、2MB(3テーブル)、または1GB(2テーブル)のページを作成できます。各テーブルエントリでビットが提供されるため、さまざまなページサイズを混在させることができます。たとえば、2MBのページの後に4kBのページを続けることができます。
はいといいえ。
ページサイズは固定されています。ただし、仮想メモリ領域のサイズは(x86アーキテクチャでは)そうではありません。ページと同じサイズではない仮想メモリ領域を作成する場合、それはセグメントと呼ばれます。
以下は、このトピックに関するいくつかの興味深いリンクです...
http://linuxgazette.net/155/krishnakumar.html
Windows: http://windows.microsoft.com/en-US/windows-vista/Change-the-size-of-virtual-memory
Linux:
/usr/src/linux/include/asm-generic/page.h には、次の行があります。
/* PAGE_SHIFT はページサイズを決定します */
PAGE_SHIFT 12 を定義する
以下の記事のコメント欄で説明しています。
http://www.cyberciti.biz/faq/linux-check-the-size-of-pagesize/
/proc/sys/vm/swappiness パラメーター。システム ページ キャッシュからページを削除するのではなく、ランタイム メモリをスワップ アウトする間のバランスを変更します。