web-dev-qa-db-ja.com

x86-64システムに48ビットの仮想アドレス空間しかないのはなぜですか?

本の中で私は以下を読みました:

32ビットプロセッサには2 ^ 32のアドレスがあり、現在の64ビットプロセッサには48ビットのアドレス空間があります

私の期待は、64ビットプロセッサの場合、アドレス空間も2 ^ 64である必要があるということでした。

だから私はこの制限の理由は何だろうと思っていましたか?

85
er4z0r

必要なのはそれだけだからです。 48ビットは、256テラバイトのアドレス空間を提供します。それは沢山。すぐにそれ以上を必要とするシステムを見ることはないでしょう。

そこで、CPUメーカーは近道をしました。完全な64ビットアドレス空間を許可する命令セットを使用しますが、現在のCPUは下位48ビットのみを使用します。代替手段は、長いアドレス空間を処理するためにトランジスタを浪費することでしたが、これは長年必要ではありませんでした。

したがって、48ビットの制限に近づいたら、アドレス空間全体を処理するCPUを解放するだけで済みますが、命令セットを変更する必要はなく、互換性を損なうこともありません。

122
jalf

OPの質問は仮想アドレス空間ではなく物理アドレス空間であったため、バスサイズと物理メモリに関するすべての回答はわずかに間違っています。たとえば、いくつかの386での類似の制限は、仮想アドレススペースではなく、常に使用可能な物理メモリの制限であり、常に完全な32ビットでした。原則として、物理メモリが数MBしかない場合でも、64ビットの仮想アドレス空間全体を使用できます。もちろん、スワッピングによって、またはほとんどのアドレスで同じページをマップする特別なタスク(たとえば、特定のスパースデータ操作)で行うことができます。

本当の答えは、AMDは安上がりで、誰も気にしないことを望んでいたからだと思いますが、引用することはできません。

17
R..

wikipediaの記事 の制限セクションを読んでください:

PCには4ペタバイトのメモリを含めることはできません(現在のメモリチップのサイズが他に何もない場合)が、AMDは大規模なサーバー、共有メモリクラスター、および近い将来これに近づく可能性のある物理アドレススペースのその他の使用を想定しました64ビットの物理アドレスを実装するコストをかけずに、ビットの物理アドレスは拡張のための十分なスペースを提供します

つまり、この時点で完全な64ビットアドレス指定を実装する意味はありません。そのようなアドレススペースを完全に利用できるシステムを構築することはできないからです。したがって、今日(および明日の)システムに実用的なものを選択します。

内部ネイティブレジスタ/操作幅は、外部アドレスバス幅に反映される必要ではありません。

1 MBのRAMにアクセスするだけで済む64ビットプロセッサがあるとします。必要なのは20ビットアドレスバスだけです。使用しない余分なピンすべてのコストとハードウェアの複雑さに悩まされるのはなぜですか?

Motorola 68000はこのようなものでした。内部的には32ビットですが、23ビットのアドレスバス(および16ビットのデータバス)を備えています。 CPUは16メガバイトのRAMにアクセスでき、ネイティブデータ型(32ビット)を読み込むには2回のメモリアクセスが必要でした(それぞれ16ビットのデータを保持)。

9
user82238

CPUアドレスパスにトランジスタを保存するよりも深刻な理由があります。アドレススペースのサイズを増やす場合は、ページサイズを増やすか、ページテーブルのサイズを増やすか、ページテーブル構造を深くする必要があります(より多くのレベルの変換テーブルです)。これらはすべて、TLBミスのコストを増大させ、パフォーマンスを低下させます。

6
Brendan

私の観点から、これはページサイズの結果です。各ページには、最大で4096/8 = 512のページテーブルエントリが含まれます。そして2 ^ 9 = 512。したがって、9 * 4 + 12 = 48です。

6
linzuojian

元の質問に答えるには、48ビット以上のPAを追加する必要はありませんでした。

サーバーには最大量のメモリが必要なので、さらに掘り下げてみましょう。

1)最大の(一般的に使用される)サーバー構成は、8ソケットシステムです。 8Sシステムは、高速コヒーレントな相互接続(または単に「高速「バス」)によって接続されて単一ノードを形成する8サーバーCPUに他なりません。そこにはより大きなクラスターがありますが、それらはほとんどなく、ここで一般的に使用される構成について話します。実際の使用では、2ソケットシステムは最も一般的に使用されるサーバーの1つであり、8Sは通常非常にハイエンドと見なされます。

2)サーバーで使用されるメモリの主な種類は、バイトアドレス指定可能な通常のDRAMメモリ(例:DDR3/DDR4メモリ)、メモリマップIO-MMIO(アドインカードで使用されるメモリなど)システムに存在するデバイスを構成するために使用される構成スペースと同様に、最初のタイプのメモリは、通常最大のものです(したがって、最大数のアドレスビットが必要です)。 MMIOの量も、システムの実際の構成によって異なります。

3)各サーバーCPUが各スロットに16個のDDR4 DIMMを収容できると仮定します。最大サイズのDDR4 DIMMは256GBです。 (サーバーのバージョンによって異なりますが、ソケットごとのこのDIMMの数は実際には16 DIMM未満ですが、例のために読み続けます)。

したがって、各ソケットは理論的に16 * 256GB = 4096GB = 4 TBを持つことができます。サンプルの8Sシステムの場合、DRAMサイズは最大4 * 8 = 32 TBです。これは、このDRAMスペースに対応するために必要な最大ビット数が45(= log2 32TB/log2 2)であることを意味します。

他のタイプのメモリ(MMIO、MMCFGなど)の詳細には触れませんが、ここでのポイントは、現在利用可能なDDR4 DIMMの最大タイプ(256 GB)を備えた8ソケットシステムの最も「要求の厳しい」タイプのメモリですDIMM)は45ビットのみを使用します。

48ビット(WS16など)をサポートするOSの場合、残りの3ビット(48-45 =)があります。つまり、下位45ビットを32TBのDRAMだけに使用した場合、合計で256 TBのMMIO/MMCFGに使用できるアドレス可能なメモリが2 ^ 3倍ありますアドレス可能なスペース。

要約すると、1)48ビットの物理アドレスは、大量のDDR4と他の多くのIOデバイスで「完全にロード」された今日の最大のシステムをサポートするためのビットです。 MMIOスペースが必要です。正確には256TBです。

この256TBアドレス空間(= 48ビットの物理アドレス)には、アドレスマップの一部ではないため、SATAドライブのようなディスクドライブは含まれず、バイトアドレス可能なメモリのみが含まれ、OSに公開されることに注意してください。

2)CPUハードウェアは、サーバーの生成に応じて、46、48、または> 48ビットの実装を選択できます。しかし、もう1つの重要な要素は、OSが認識するビット数です。現在、WS16は48ビットの物理アドレス(= 256 TB)をサポートしています。

これがユーザーにとって意味することは、48ビットを超えるアドレス指定をサポートできる大規模で最新のサーバーCPUを使用している場合でも、48ビットのPAのみをサポートするOSを実行すると、256 TBしか利用できないことです。

3)全体として、より多くのアドレスビット(=より多くのメモリ容量)を活用するための2つの主な要因があります。

a)CPU HWは何ビットをサポートしていますか? (これは、Intel CPUのCPUID命令によって決定できます)。

b)実行しているOSバージョンと、PAが認識/サポートするビット数。

(a、b)の最小値は、システムが利用できるアドレス可能なスペースの量を最終的に決定します。

他の応答を詳細に検討することなく、この応答を作成しました。また、MMIO、MMCFG、およびアドレスマップ構築の全体のニュアンスについては詳しく調べていません。しかし、これが役立つことを願っています。

おかげさまで、Intel CorporationサーバープラットフォームアーキテクトのAnand K Enamandram氏

3

多くの人々はこの誤解を持っています。しかし、あなたがこれを注意深く読んだなら、私はあなたに約束しています。

プロセッサが32ビットまたは64ビットであるということは、それぞれ32ビットアドレスバスまたは64ビットアドレスバスが必要であることを意味しません!...私はそれを繰り返しません!!

32ビットプロセッサとは、32ビットALU(算術論理ユニット)を意味します...つまり、32ビットバイナリオペランド(または単に32桁のバイナリ数と言う)で動作でき、同様に64ビットプロセッサは64ビットバイナリで動作可能オペランド。そのため、32ビットまたは64ビットのプロセッサが最大メモリ量をインストールできることを意味しません。オペランドがどれだけ大きいかを示しています...(類推のために、10桁の計算機は10桁までの結果を計算できます... 11桁または他の大きな結果を与えることはできません... 10進数でですが、簡単にするためにこのアナロジーを言っています)...しかし、あなたが言っているのは、メモリ(RAM)の直接インターフェース可能な最大サイズであるアドレス空間です。 RAMの最大可能サイズは、アドレスバスのサイズによって決まり、データバスのサイズや、プロセッサのサイズが定義されているALU(32/64ビット)でもありません。はい、プロセッサに32ビットの「アドレスバス」がある場合、RAM(または64ビットの場合は2 ^ 64)の2 ^ 32バイト= 4GBをアドレス指定できます...]プロセッサの32ビットまたは64ビットは、このアドレス空間とは関係がなく(アドレス空間=メモリまたはRAMの最大サイズにアクセスできる範囲)、ALUのサイズのみに依存します。アドレスバスは同じサイズであり、32ビットプロセッサは2 ^ 32バイトまたは4GBメモリにアクセスすることを意味するように見えるかもしれません...しかし、それは偶然であり、すべて同じではありません。 ..たとえば、Intel 8086は16ビットプロセッサであるため(16ビットALUを備えているため)、2 ^ 16バイト= 64 KBのメモリにアクセスする必要がありますが、実際にはそうではありません。 20ビットのアドレスバスを持つためのメモリ....疑問がある場合はグーグルで検索できます:)

64ビットプロセッサは64ビットアドレスバスを持たなければならないという意味ではないので、64ビットプロセッサに48ビットアドレスバスを持たせるのは間違っています。 ...設計と製造を安価にするために、アドレス空間を小さくしました....このような大きなメモリ(2 ^ 64バイト)を使用する人はいないので...今日では2 ^ 48バイトで十分です。

2
hafiz031

少なくともIntel 64では、64ビットVAの下位48ビットのみが使用されることは事実ではありません。上位16ビットが使用されます。

セクション3.3.7.1 Intel®64およびIA-32アーキテクチャソフトウェア開発者向けマニュアルの正規のアドレス指定:

正規のアドレスでは、ビット63〜48をゼロまたは1に設定する必要があります(ビット47がゼロか1かによって異なります)

したがって、ビット47から63は、すべて1またはすべて0のスーパービットを形成します。アドレスが標準形式でない場合、実装はフォールトする必要があります。

AArch64では、これは異なります。 ARMv8命令セットの概要によると、49ビットVAです。

AArch64メモリ変換システムは、49ビットの仮想アドレス(変換テーブルごとに48ビット)をサポートします。仮想アドレスは49ビットから符号拡張され、64ビットポインター内に格納されます。オプションで、システムレジスタの制御下で、64ビットポインターの最上位8ビットは、ロード/ストアアドレスまたは間接分岐のターゲットとして使用された場合に無視される「タグ」を保持できます。

1
Olsonist

CPUは、主にそのデータバスサイズ、およびそのエンティティの大部分(内部アーキテクチャ)で「Nビット」と見なされます:レジスタ、アキュムレータ、算術論理ユニット(ALU)、命令セットなど。たとえば、古き良きMotorola 6800(またはIntel 8050)CPUは8ビットCPUです。 8ビットのデータバス、8ビットの内部アーキテクチャ、および16ビットのアドレスバスを備えています。


  • NビットCPUには、Nサイズ以外のエンティティがある場合があります。たとえば、6800から6800への6809のインポメント(両方とも8ビットデータバスを備えた8ビットCPUです)。 6809で導入された重要な機能強化には、2つの8ビットアキュムレータ(単一の16ビットレジスタDに結合できるAおよびB)、2つの16ビットインデックスレジスタ(X、Y)、および2つの16ビットスタックポインター。
0
Amit G.