私は今読んだ。ここ:
- プロセスあたり最大128TiB仮想アドレス空間(2GiBではなく)
- 4GiB(またはPAE拡張を含む64GiB)の代わりに64TiB物理メモリをサポート
なぜそんなことですか?私は、物理メモリのサポートがカーネルまたは現在のハードウェアによって制限されることを意味しますか?
実際にアドレス指定可能な物理メモリよりも2倍の仮想メモリスペースが必要なのはなぜですか?
ベストアンサー1
これらの制限は、DebianやLinuxではなくハードウェアに由来します。アーキテクチャ(プロセッサとメモリバス)によって制限が異なります。
現在、x86-64 PCプロセッサでは、MMUは次のことを許可します。48ビット仮想アドレス空間。これは、アドレス空間が256TBに制限されることを意味します。 1ビットを使用してカーネルアドレスとユーザーゾーンアドレスを区別すると、プロセスアドレススペースに128 TBのスペースが残ります。
現在x86-64プロセッサでは物理アドレスは最大48ビットまで使用できます。つまり、最大256TBまで保持できます。 amd64アーキテクチャが導入されて以来、この制限は徐々に増加しました(私の記憶が正しい場合は40ビットから始まります)。アドレス空間の各ビットには、いくつかの配線とデコードロジック(プロセッサが高価、低速、熱くなる)が必要なため、ハードウェアメーカーはサイズを縮小するインセンティブを持っています。
Linuxでは、物理メモリをカーネル空間に完全にマッピングできるため、物理アドレスは最大2 ^ 46(つまり最大64 TB)まで許可されます。アドレス空間には48ビットがあり、1つはカーネル/ユーザー用で、47ビットはカーネルアドレス空間用に残されています。その半分は最大物理メモリを直接処理し、残りの半分はカーネルが必要なものすべてをマップできるようにします。 (Linuxは同時に完全にマッピングできない物理メモリを処理できますが、これにより追加の複雑さが発生するため、必要なプラットフォームでのみ実行されます。PAEを含むx86-32LPAEを含むarmv7。 )
物理メモリよりも大きな仮想メモリを持つことは、次の理由で役立ちます。
- これにより、カーネルは物理メモリ全体をマッピングし、追加の仮想マッピングのためのスペースを残します。
- 物理メモリマッピングに加えて、スワップ、ファイル、デバイスドライバへのマッピングもあります。
- いくつかの場所では、マップされていないメモリを持つことが便利です。キャプチャするガードページバッファオーバーフロー、なぜならASLR、等。