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


97

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

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

私の予想では、64ビットプロセッサの場合、アドレススペースも2 ^ 64になるはずです。

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


11
この本は、AMD64アーキテクチャ(x86-64)の現在の実装について具体的に述べているに違いありません。下位48ビットのみが使用されます。ただし、これはハードウェアの制限ではありません。すべての64ビットを使用できます。
コーディグレイ

7
本を識別するために常に良いアイデアです。
Henk Holterman、2011

1
物理アドレスラインが空いていないと思います(少なくとも16個の追加のCPUピンが必要です)。また、同じプロセッサ上で48ビット空間を物理RAMチップで満たすことができるハードウェアについてはまだ知りません。これが実現可能になったとき、AMDは不足している16ピンを追加すると確信しています:)
Torp

7
The 32-bit processors have 2^32 possible addresses必ずしもそうとは限りませんが、メモリをアドレス指定するための24個の「ピン」のみを持つ32ビットCPUが存在する可能性があります。たとえば、68EC020(安い68020バージョン)は32ビットCPUですが、メモリのアドレス指定用に24ビットを備えています。
しんたけぞう2011

21
64ビットの物理アドレス指定には非常に現実的な問題があり、仮想メモリのページサイズが小さすぎます。これにより、すべてのコンテキストスイッチで巨大なページディレクトリと非常に高価なTLBキャッシュフラッシュが発生します。4KBから4MBページへの移動はオプションですが、現在のオペレーティングシステムとは非常に互換性がありません。
ハンスパッサント2011

回答:


134

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

したがって、CPUメーカーは近道を取りました。彼らは完全な64ビットアドレス空間を可能にする命令セットを使用しますが、現在のCPUは下位48ビットのみを使用します。もう1つの方法は、長年必要とされなかったより大きなアドレス空間の処理にトランジスタを浪費することでした。

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


118
640kbで十分です。

7
まだ8088システムを実行していますか、bdares?
Joe

23
@bdares:悪いアナロジー。8088/8086 archの命令セットには、640kの制限が組み込まれています。新しいISA(386)を作ることだけが、障壁を破ることができました。一方、x86_64はISAのすべての64ビットをサポートします。それらすべてを利用できないのは、現在の世代のハードウェアだけ
です

16
@R。実際には、CPUの制限は1メガバイトでした。IBM PCは、その一部をメモリマップされた周辺機器、BIOSなどに指定しました。他のいくつかの8088/8086設計(メモリが機能する場合は、Zenith Z100)は、周辺機器などにはあまり指定せず、それに応じてアプリケーションプログラムにもっと指定しました。
ジェリーコフィン2011

25
lwn.net/SubscriberLink/655437/9a48cd3e7a8cbe8a <-この応答から3年後、すでにこれらの制限に達しています:) HPマシンには320TBのメモリがあり、48のためにフラットアドレススペースとして提供できませんビットアドレス指定の制限。
2015

18

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

本当の答えは、AMDが安かっただけで、今は誰も気にしないことを望んでいたと思いますが、引用する言及はありません。


14
「安くなる」使用しないピンを追加せず、使用しないトランジスタ用のチップスペースを占有せず、解放されたスペースを使用して既存の命令を高速化するのではないでしょうか。それが安いなら、私は入っています!
Olof Forshell、2011

80386では、2 * 4096のセレクターを使用でき、それぞれに最大4 GBのメモリ(合計32 TB)を含めることができます。80286は、それぞれ最大64KB(1GB)を含む2 * 4096セレクターを許可しました。
Olof Forshell、2011

非線形のセグメント化されたハックは、私の本ではアドレス空間としてカウントされません。ポータブルソフトウェアでそれらを使用する方法はありません。
R .. GitHub ICE HELPING ICE STOP '07 / 07/17

@R ..-ポータブルソフトウェアの定義は、それができるということだと思いました。:-)たとえば、C ++では、ポインターを異なる配列に比較して、それらを別々の4GBセグメントに配置できるようにすることを禁止しています。
Bo Persson、2011

コンパイルで実際に巨大なポインタが生成され、各メモリ逆参照のセグメントレジスタが読み込まれる場合は、はい。しかし、実際にはそれはひどく遅いので、代わりに全員が小さなメモリモデルと__far(さらに悪いことに、FAR/ far!)ポインタを使用しました...
R .. GitHub ICE

10

ウィキペディアの記事の制限セクションをお読みください

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

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


4ペタバイトの4はどこから来たのですか?64本のアドレスラインを話している場合、4ギガバイトである32本のアドレスラインによって可能になったアドレス空間の2乗で終わるはずです。それを二乗すると、4ペタバイトではなく16になるはずです。何か不足していますか?
Olof Forshell、2011

1
これは、現在の物理的な制限(52ビット)から来ています。つまり、PCにこの制限された範囲をサポートするのに十分なRAMを置くことができず、完全な64ビットアドレス空間に必要なものは言うまでもありません。
Damien_The_Unbeliever

9

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

たとえば、1 MBのRAMにアクセスするだけでよい64ビットプロセッサがあるとします。20ビットのアドレスバスで十分です。使用しないすべての追加ピンのコストとハードウェアの複雑さを気にするのはなぜですか?

Motorola 68000はこのようなものでした。内部で32ビット、ただし23ビットのアドレスバス(および16ビットのデータバス)。CPUは16メガバイトのRAMにアクセスでき、ネイティブデータタイプ(32ビット)をロードするには、2回のメモリアクセス(それぞれに16ビットのデータが含まれる)が必要でした。


1
しかし、68000は「16/32ビット」CPUと見なされ、「フル」32ビットCPUとは見なされないため、16ビットの過去にまだ足があると言えます。68020は「フル」32ビットCPUですが、低コストの68EC020バージョンには24ビットのアドレスしかないので、私は68020を例として選びました...この素晴らしいプロセッサーファミリーを考慮して+1!
しんたけぞう2011

@ShinTakezou:正直なところ、80386SXは16ビットCPU(80286のようなアドレス空間があるため)でしたか、それとも32ビット(80386DXの内部アーキテクチャーがあるため)でしたか?あなたがするように言うこともできますが、別の人(これは)は「内部が重要です」と言っています-そしてあなたはそれについて私を引用することができます。
Olof Forshell、2011

@Olof「メモリ」(外部の世界)のコンテキストでは、外部が重要であると思うので、68000は16ビットCPUです(32ビットデータを読み取るには2つの「ステップ」が必要です):D
ShinTakezou

@ShinTakezou:メモリコンテキストは、たとえキャッシュであっても、最新のプロセッサでは非常に密結合されていますが、常にCPU自体の外部にあります。8088は8086と内部的には同等でしたが、8086の16に対して8本のデータバスラインがありました。8088が
Z80、8080、8085

私はそのような問題の専門家ではないので、私には明白なことは何もありません。私は、68000がまだ「古い」プロセッサであると考えることができる、過去のより鋭いカットの必要性に気づきたかったので、そのアドレス空間が32ビット未満に制限されていることは「自然」に見える可能性があります。一方、68020は32ビットにできるため、制限のある68EC020の存在は、それが「制限(またはこれ)時間」ですが、他の考慮事項(64ピンの場合に実際の利点がない場合は安くするなど)を考慮してください。これは、多かれ少なかれこの回答の議論です。
ShinTakezou 11/07/18

7

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


1
Intelは、現在の48ビットから57ビットに拡張する5レベルのページングスキーム提案しています。(レベルごとに同じ9ビット/現在のx86-64ページテーブルと同じ4kページ)。レベルごとに10ビットまたは11ビットを使用するには、ページウォークハードウェアを変更する必要があるため、これは大容量メモリには最適な設計ではないかもしれませんが、4の最大パフォーマンスもサポートする必要があるデュアルモードCPUの賢明な拡張です。現在の形式のレベルテーブル。
Peter Cordes

もちろん、2Mまたは1Gのhugepagesでは、ページディレクトリポインターではなく、トップレベルからhuge-pageテーブルエントリまでの4または3レベルのページテーブルのみです。
Peter Cordes

6

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


4

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

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

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

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

3)各サーバーCPUが各スロットに16個のDDR4 DIMMを収容できると想定します。256GBの最大サイズのDDR4 DIMM。(サーバーのバージョンによっては、ソケットあたりのこの可能な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 DIMM)は45ビットのみを使用します。

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

つまり、要約すると、1)48ビットの物理アドレスは、大量のDDR4が「完全にロード」されている今日の最大のシステムをサポートするのに十分なビットであり、MMIOスペースを必要とする他のIOデバイスもたくさんあります。正確には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に感謝


この質問は、48ビットの仮想アドレス空間サイズについて尋ねています(仮想アドレスを正規にする必要があります)。物理ビットよりも多くの仮想ビットが必要なので、上位半分のカーネルはすべての物理メモリを単一のアドレス空間(それ自体のユーザー空間)にマップできます。あなたが言うように、HWはDRAMコントローラ+ MMIOが使用できるのと同じ数のPAビットを実装するだけでよく、x86-64ページテーブル形式で52ビット制限までの任意の数を使用できます。(なぜ64ビットでは、仮想アドレスは物理アドレス(52ビット長)と比較して4ビット短(48ビット長)ですか?
Peter Cordes

1
HW + SWが57ビットVAのPML5ページテーブルをサポートするまで、4レベルのページテーブル形式も48ビットVAの制限を課します。とにかく、これは便利な回答ですが、間違った質問の下に投稿されているようです。そこにもっと良い場所があるかどうかはわかりませんので、PAとVAについて何かを伝えるためのヘッダーを追加するための編集で、ここに残すことができると思います。
Peter Cordes

2

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

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

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

私は私のポイントを明確にしたと思います。今あなたの質問に来ています... 64ビットプロセッサはそれが64ビットアドレスバスを持っている必要があることを意味しないので、64ビットプロセッサに48ビットアドレスバスを持っていることの間違いはありません...アドレススペースを小さくして、設計と製造を安価にしました...そのような大容量のメモリ(2 ^ 64バイト)を使用する人はいないので、今日は2 ^ 48バイトで十分です。


あなたはあなたのポイントを非常に明確にしたと思いますが、16ビット8086 CPUについてあなたが言ったことで、私が理解していないことが1つあります。2段階の操作で対応できますか?アドレスバスが20ビット幅であっても、CPUに到達すると、レジスタ幅は明らかに16ビットしか取れません...どうやってそれを行うのですか?
プログラマー、

2
うーん... 2ステップ操作。セグメントレジスタには、上位16ビットのみが含まれます。次に、10Hを乗算して20ビットにし、オフセットを追加します。
hafiz031

1

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

インテル ®64 およびIA-32アーキテクチャーのソフトウェア開発者向けマニュアルのセクション3.3.7.1正規アドレスは、次のように述べています。

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

したがって、ビット47から63は、すべて1またはすべて0のスーパービットを形成します。アドレスが正規の形式でない場合、実装はエラーになります。

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

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


1
重要なのは下位48だけですが、ハードウェアはそれが64ビットに正しく符号拡張されていることを確認します。IDKがゼロ拡張を指定しなかった理由。(符号ビットをチェックするだけで)上位アドレスと下位アドレスの比較をより簡単に確認できるようにしたかったのでしょう。または、2 ^ 48境界を特別なものにすることを避け、上部付近のアドレスを32ビットの符号拡張された定数にうまく収めることができます。後者の方が可能性が高いと思います。
Peter Cordes 2017

とにかく、正規の現在のHWチェックは、ソフトウェアがタグ付きポインターに無視されたビットを使用しないようにします。これは、将来のHWで中断するため、必要に応じて将来のハードウェアを拡張できるようにするメカニズムの一部です。(不揮発性メモリが物理アドレス空間と仮想アドレス空間に直接接続されているため、予想よりも早くなる可能性があります。)
Peter Cordes 2017

Core i5上のLinuxのprocfsは、7ffd5ea41000-7ffd5ea62000にマップされると言っています。このアドレス範囲は、上記の「正規の」ルールに従って意味があります。ビット48〜63は0であり、正しい正規アドレスになっています。少し奇妙なのは、Linuxソースのアドレスです。include / asm / pgtable_64_typesには#define __VMALLOC_BASE _AC(0xff92000000000000、UL)と書かれています。これは正規の住所ではありません。そのようなアドレスは0xffff8で始まります。なぜだね。
Olsonist 2017年

ええ、IIRC Linuxはユーザー空間の正規範囲の下半分を使用し、カーネルのみのマッピングには(ほとんど)上半分を使用します。しかし、一部のカーネルメモリは、[vsyscall]ページのようにユーザー空間にエクスポートされます。(これは、現在のPIDのようなものをエクスポートしている可能性があるため、getpid()純粋にユーザースペースです。またgettimeofday()、カーネルによってエクスポートされたユーザースペース+スケールファクターでrdtscを使用することもできます。その一部[vdso]は、下半分。)
Peter Cordes 2017年

IDKは何を__VMALLOC_BASEしますか。おそらくそれは直接使用されていません。
Peter Cordes

0

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


  • NビットのCPUには、Nサイズ以外のエンティティが含まれる場合があります。たとえば、6809から6800までの改良点(どちらも8ビットのCPUと8ビットのデータバス)。6809で導入された重要な機能強化には、2つの8ビットアキュムレータ(AおよびB、単一の16ビットレジスタDに組み合わせることができる)、2つの16ビットインデックスレジスタ(X、Y)および2つの16ビットのスタックポインタ。

モトローラ68000/68020を例にすると、この点についてはすでに回答があります。この質問は、特にx86-64に関するもので、古い8/16ビットCPUではありません。x86-64の場合、大きな要因の1つは、より広い仮想アドレスにはより深いページテーブルが必要であり、その要因はあなたが話している古いチップには存在しなかったことです。
Peter Cordes

データバス幅は、レジスタまたはALU幅と一致する必要はありません。たとえば、P5 Pentiumには64ビットのデータバスがあります(アラインされた64ビットのロード/ストアはアトミックであることが保証されています)が、レジスタ/ ALUは32ビットのみです(統合されたFPUを除き、後のPentium MMXではSIMD ALUs。)
Peter Cordes

OPの書き込み:「64ビットプロセッサの場合、アドレススペースも2 ^ 64であることが期待されていました。」........あなたが書いた:「この質問は、実際には特にx86-64についてであり、古い8/16ビットCPUではありません」。........ OP質問の本質を見逃したと思います。OPの質問は、64ビットCPUに64ビットアドレスバスが必要であるという誤った仮定の結果です。ALUについては、そのエンティティの大部分を記述しました。それらのすべてではありません。
アミットG.

このコメントを再投稿して、スパムメールを止めてください。もちろん、OPはあなたが説明した理由で間違っていますが、私はあなたの答えが同様の間違いをするように見えることを指摘しました。「そのエンティティの大部分:レジスタとアキュムレータ、算術論理演算ユニット(ALU)...」と言うと、これらはデータバス幅と一致しているように聞こえます。「大部分」というフレーズは、どの部分を言っいるのか意味し、それがそれらの部分にのみ当てはまることはありません。
Peter Cordes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.