Debian Linuxがプロセスごとに最大128TiBの仮想アドレス空間を許可するのに64TiBの物理メモリしか許可しないのはなぜですか?


23

私はちょうどここを読んでください

  • プロセスあたり最大128TiBの仮想アドレス空間(2GiBではなく)
  • 4GiB(またはPAE拡張を備えた64GiB)の代わりに64TiB物理メモリをサポート

何故ですか?つまり、物理メモリのサポートはカーネルまたは現在のハードウェアによって制限されていますか?

実際にアドレス指定できる物理メモリの2倍の仮想メモリ空​​間が必要なのはなぜですか?


スワップを追加することもできます。
トールビョーンラヴンアンデルセン

2
それは...多くのRAMだ
dalearn

4
@dalearn -あなたが知っている、私が最初にあなたがそれらを4096キロバイトまで持ってみましょう8ビットのマイクロスのための銀行交換メモリ拡張を得ることができることを学んだ、私が言ったまさに ...同じことを
ジュール・

回答:


35

これらの制限はDebianやLinuxからではなく、ハードウェアから来ています。異なるアーキテクチャ(プロセッサとメモリバス)には異なる制限があります。

現在のx86-64 PCプロセッサでは、MMUは48ビットの仮想アドレス空間を許可しています。つまり、アドレス空間は256TBに制限されます。カーネルアドレスとユーザーランドアドレスを区別するための1ビットを使用すると、プロセスのアドレススペースに128TBが残ります。

現在のx86-64プロセッサでは、物理アドレスは最大48ビットを使用できます。つまり、最大256TBを使用できます。amd64アーキテクチャが導入されて以来、制限は次第に高くなっています(正しく思い出せば40ビットから)。アドレス空間の各ビットには配線とデコードロジックのコストがかかるため(プロセッサが高価になり、速度が低下し、高温になります)、ハードウェアメーカーはサイズを小さくするインセンティブを持っています。

Linuxでは、物理メモリをカーネルスペースに完全にマッピングできるため、物理アドレスは最大2 ^ 46までしか使用できません(したがって、最大64TBまでしか使用できません)。48ビットのアドレス空間があることに注意してください。カーネル/ユーザー用の1ビットは、カーネルアドレス空間用に47ビットを残します。その半分は多くても物理メモリを直接アドレス指定し、残りの半分はカーネルが必要なものをマッピングできるようにします。(Linuxは同時に完全にマッピングできない物理メモリに対応できますが、複雑さが増すため、PAEを搭載したx86-32やLPAEを搭載したarmv7 など、必要なプラットフォームでのみ実行されます。)

いくつかの理由から、仮想メモリが物理メモリよりも大きいと便利です。

  • これにより、カーネルは物理メモリ全体をマップし、仮想マップピン用のスペースを確保できます。
  • 物理メモリのマッピングに加えて、スワップ、ファイル、およびデバイスドライバーのマッピングがあります。
  • 場所にマップされていないメモリがあると便利です:バッファオーバーフローをキャッチするためのページのガード、ASLRによるマップされていない大きなゾーンなど。

9
物理メモリの46ビット制限は、Linuxメモリマップに関連しています。これには、カーネル空間の物理メモリの完全なマッピングが含まれます。つまり、物理メモリは使用可能なアドレス空間の1/4にしか対応できません。
スティーブンキット

誰も@StephenKittのコメントについて詳しく説明できますか?私はそれを理解することに非常に興味がありますが、彼が引用した参考文献を読んだ後でも私はそれを得ません;)
gsi-フランク

@ gsi-frankカーネルが物理メモリ全体を永続的にマップすると便利です。したがって、2 ^ 48アドレス空間では、2 ^ 47はユーザーランドアドレスに、2 ^ 46はカーネルアドレスに、2 ^ 46は物理メモリアドレス指定に使用されます。
ジル 'SO-悪であるのをやめる'

@ gsi-frank古典的な本「Developing your own 32-bit Operating System」のコピーを手に入れることができれば、著者が自分のOSについて同様の決定を下した理由についてかなり深くなります(その場合、 80386の4GiB仮想アドレス空間を、1GiB物理RAMマッピングと2GiBユーザーセグメントを含む2GiBカーネルセグメントに分割します。OSの内部に興味がある人は、おそらくそれを読むべきです-それは、理解するのに十分シンプルであるが、有用なOSカーネルになるのに十分に高度な完全な設計を提供します。
ジュール

カーネルのバージョン4.13以降、x86-64(およびその他のアーキテクチャ)は5レベルのページテーブルで構築できます。これにより、x86-64のアドレス空間は物理RAMで52ビット、仮想RAMで57ビット(4 PiB / 128 PiB)。カーネルスペースのメモリマップにはセキュリティ上の問題があり、近い将来に変更される可能性があります。
スティーブンキット

9

理由はわかりませんが、物理メモリの2倍のアドレス空間をサポートすることが役立つ7つの理由を考えることができます。

  1. 1つ目は、追加のメモリを必要とするアプリケーションを実行できるようにすることです(ディスクへのスワップを意味する場合でも)。
  2. メモリレイアウトをよりクリーンにし、メモリ使用量を分割します。たとえば、OSは、番号が大きいアドレスを使用し、番号が小さいアドレスをアプリケーションに残して、分離をクリーンにすることができます。
  3. アドレス空間レイアウトのランダム化はもう少し効果的です。
  4. ページを実行可能としてマークすると、メモリが残っている可能性があります。
  5. メモリマップドI / O。
  6. メモリの割り当ては簡単です。一度に大きなチャンクを割り当てることができます。
  7. メモリの断片化を削減

1
ありがとう!1)非常に明白で基本的であるため、質問に恥ずかしさを感じます;)
gsi-フランク

2
(3)も非常に重要です。ランダムな推測がほぼ確実にトラップになるように、割り当てるメモリの量よりも桁違いに大きい仮想アドレス空間が本当に必要です。
R ..

6

これらはハードウェアの制限です。現在のx86_64 / amd64ハードウェアでは、48ビットの仮想アドレスとさまざまなサイズ(実装によって異なります。たとえば、ここでのワークステーションは36ビットしかサポートしていません)の物理アドレスを使用できます。Linuxカーネルは仮想アドレス空間を半分に分割します(x86の場合と同様に、カーネルに半分、ユーザー空間に半分を使用)。

だからあなたは得る:

2⁴⁸バイト÷2 =2⁴⁷バイト= 128 TiB

物理アドレスのサイズは、実際には物理的であるため、しばしば小さいです。CPU上の/内のピン/パッド、トランジスタ、接続などを占有し、ボード上のトレースラインを占有します。おそらくチップセットでも同じです。プロセッサコアまたはソケットの設計寿命にわたって考えられない量のRAMをサポートすることは意味がありません。これらはすべて費用がかかります。(それぞれに32個のDIMMスロットと64GiB DIMMがありますが、まだ2TiBしかありません。DIMMの容量が年に2倍になっても、64TiBから5年離れています。

ピーター・コルドが指摘、人々は今のような不揮発性記憶装置を装着している3D XPoint考えられるアドレス空間が不足している可能メモリバスへ、。新しいプロセッサは、物理アドレス空間を48ビットに拡張しました。Debian wikiが更新されていない可能性があります。


メモリバスに直接接続された不揮発性ストレージ(3D XPointなど)が問題になりつつあり、これは今後数年間で物理アドレススペースの需要を大幅に増加させる可能性があります(DRAMよりも密度が高く、ボートの負荷が多いため便利です)多くの場合、RAMのボートロードがあると便利です)。あまり技術的でない記事については、zdnet.com / article / the - non - volatile - memory - revolutionを参照してください(または、より良いものについてはgoogle)。Intel Skylakeは、その説明clflushclflushopt指示でサポートしています。
ピーターコーデス

1
すでに96スロットで最大12TiBのRAMを搭載したシステム(Tyanの4ソケットHPCシステムなど)を購入できるため、64TiBは5年以内に購入できる可能性があります。そして、いくつかの人々は...それらを購入し、そのくらいのRAMとそれらに合うん
スティーブン・キット

うーん@StephenKitt、それのOK DIMM容量が近いダブル😁に3年かかるため
derobert

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