wake-up-neo.com

Warum haben x86-64-Systeme nur einen virtuellen 48-Bit-Adressraum?

In einem Buch las ich folgendes:

32-Bit-Prozessoren haben 2 ^ 32 mögliche Adressen, während derzeitige 64-Bit-Prozessoren einen 48-Bit-Adressraum haben

Meine Erwartung war, dass der Adressraum bei einem 64-Bit-Prozessor auch 2 ^ 64 betragen sollte. 

Also habe ich mich gefragt, was ist der Grund für diese Einschränkung?

66
er4z0r

Denn das ist alles was benötigt wird. 48 Bit bieten einen Adressraum von 256 Terabyte. Das ist viel. Sie werden kein System sehen, das bald mehr braucht.

Die CPU-Hersteller haben also eine Abkürzung genommen. Sie verwenden einen Befehlssatz, der einen vollständigen 64-Bit-Adressraum zulässt, aktuelle CPUs verwenden jedoch nur die unteren 48 Bit. Die Alternative bestand darin, Transistoren für den Umgang mit einem größeren Adressraum zu verschwenden, der viele Jahre nicht benötigt wurde.

Sobald wir die 48-Bit-Grenze erreicht haben, müssen Sie nur CPUs freigeben, die den gesamten Adressraum verarbeiten, aber es werden keine Änderungen am Befehlssatz erforderlich, und die Kompatibilität wird dadurch nicht beeinträchtigt.

104
jalf

Jede Antwort, die sich auf die Busgröße und den physischen Speicher bezieht, ist leicht falsch, da sich die Frage von OP auf virtueller Adressraum nicht physikalischer Adressraum lautete. Zum Beispiel war die vermeintlich analoge Grenze für einige 386er eine Beschränkung für den physischen Speicher, den sie verwenden konnten, und nicht für den virtuellen Adressraum, der immer volle 32 Bit aufwies. Im Prinzip könnten Sie einen vollständigen 64-Bit-Adressraum auch mit nur wenigen MB physischem Speicher verwenden. Sie können dies natürlich durch Tauschen tun oder für spezielle Aufgaben, bei denen Sie die gleiche Seite an den meisten Adressen zuordnen möchten (z. B. bestimmte spärliche Datenoperationen).

Ich denke, die wirkliche Antwort ist, dass AMD nur billig war und hoffte, dass sich jetzt niemand dafür interessieren würde, aber ich habe keine Referenzen.

16
R..

Lesen Sie den Abschnitt mit Einschränkungen im Wikipedia-Artikel :

Ein PC kann nicht über 4 Petabyte Speicher verfügen (aufgrund der Größe der aktuellen Speicherchips, wenn nicht anders), AMD sah jedoch große Server, Shared-Memory-Cluster und andere Anwendungen des physischen Adressraums vor, die dies in absehbarer Zeit erreichen könnten, und den 52 Die physikalische Bitadresse bietet viel Raum für Erweiterungen, ohne jedoch die Kosten für die Implementierung physischer 64-Bit-Adressen zu verursachen

Das heißt, es ist sinnlos, zu diesem Zeitpunkt eine vollständige 64-Bit-Adressierung zu implementieren, da wir kein System erstellen können, das einen solchen Adressraum vollständig ausnutzt. Daher wählen wir etwas, das für heutige (und zukünftige) Systeme geeignet ist.

Die interne native Register-/Operationsbreite muss nicht in der externen Adressbusbreite widergespiegelt werden.

Angenommen, Sie haben einen 64-Bit-Prozessor, der nur auf 1 MB RAM zugreifen muss. Ein 20-Bit-Adressbus ist alles, was benötigt wird. Warum sollten Sie sich mit den Kosten und der Hardwarekomplexität all der zusätzlichen Pins befassen, die Sie nicht verwenden werden?

Das Motorola 68000 war so; 32-Bit intern, aber mit einem 23-Bit-Adressbus (und einem 16-Bit-Datenbus). Die CPU konnte auf 16 Megabyte RAM zugreifen, und um den nativen Datentyp (32 Bit) zu laden, wurden zwei Speicherzugriffe durchgeführt (jeder mit 16 Bit Daten).

9
user82238

Es gibt einen schwerwiegenderen Grund, als nur Transistoren im CPU-Adresspfad zu speichern: Wenn Sie den Adressraum vergrößern, müssen Sie die Seitengröße erhöhen, die Seitentabellen vergrößern oder eine tiefere Seitentabellenstruktur haben ist mehr Ebenen von Übersetzungstabellen). All diese Dinge erhöhen die Kosten eines TLB-Fehlschlags, was die Leistung beeinträchtigt. 

6
Brendan

Aus meiner Sicht ist dies das Ergebnis der Seitengröße. Jede Seite enthält höchstens 4096/8 = 512 Einträge der Seitentabelle. Und 2 ^ 9 = 512. Also 9 * 4 + 12 = 48.

6
linzuojian

Um die ursprüngliche Frage zu beantworten: Es waren nicht mehr als 48 Bits PA erforderlich.

Server benötigen die maximale Menge an Speicher. Versuchen wir also, tiefer zu graben.

1) Die größte (häufig verwendete) Serverkonfiguration ist ein 8-Socket-System. Ein 8S-System ist nichts weiter als 8 Server-CPUs, die über eine kohärente Hochgeschwindigkeitsverbindung (oder einfach einen Hochgeschwindigkeitsbus) miteinander verbunden sind, um einen einzelnen Knoten zu bilden. Es gibt größere Cluster, aber es gibt nur wenige und weit voneinander entfernt. Wir sprechen hier von häufig verwendeten Konfigurationen. Beachten Sie, dass das 2-Socket-System in der realen Welt einer der am häufigsten verwendeten Server ist und dass 8S normalerweise als sehr hochwertig gilt.

2) Die Hauptspeichertypen, die von Servern verwendet werden, sind Byteadressierbare reguläre DRAM-Speicher (z. B. DDR3/DDR4-Speicher), Memory Mapped IO - MMIO (z. B. von einer Zusatzkarte verwendeter Speicher) sowie Konfiguration Speicherplatz zum Konfigurieren der im System vorhandenen Geräte. Der erste Speichertyp ist derjenige, der normalerweise der größte ist (und daher die größte Anzahl von Adressbits benötigt). Einige High-End-Server verwenden auch eine große Menge MMIO, abhängig von der tatsächlichen Konfiguration des Systems.

3) Angenommen, jede Server-CPU kann 16 DDR4-DIMMs in jedem Steckplatz aufnehmen. Mit einer maximalen Größe des DDR4-DIMM von 256 GB. (Je nach Serverversion ist die Anzahl der möglichen DIMMs pro Sockel tatsächlich geringer als 16 DIMMs, lesen Sie jedoch weiter, um das Beispiel zu erläutern.).

Jeder Socket kann also theoretisch 16 * 256GB = 4096GB = 4 TB haben. __ Für unser Beispiel eines 8S-Systems kann die DRAM-Größe maximal 4 * 8 = 32 TB sein. Dies bedeutet, dass Die maximale Anzahl von Bits, die erforderlich ist, um diesen DRAM-Speicherplatz zu adressieren, ist 45 (= log2, 32 TB/log2 2).

Wir werden nicht auf die Details der anderen Speichertypen (MMIO, MMCFG usw.) eingehen, aber der Punkt ist hier der anspruchsvollste Speichertyp für ein 8-Sockel-System mit den größten heute verfügbaren DDR4-DIMM-Typen (256 GB) DIMMs) verwenden nur 45 Bit.

Für ein Betriebssystem, das 48 Bit unterstützt (z. B. WS16), gibt es (48-45 =) 3 verbleibende Bits. Dies bedeutet, dass wir, wenn wir die unteren 45 Bit ausschließlich für 32 TB DRAM verwendet haben, immer noch 2 ^ 3 haben Zeiten des adressierbaren Speichers, die für MMIO/MMCFG verwendet werden können, für insgesamt 256 TB adressierbaren Speicherplatz.

Um es zusammenzufassen: 1) 48 Bit Physikalische Adresse sind viele Bits, um die größten Systeme von heute zu unterstützen, die mit reichlich DDR4-Mengen voll ausgelastet sind und auch viele andere IO - Geräte, die dies erfordern MMIO-Raum. 256 TB, um genau zu sein. 

Beachten Sie, dass dieser 256-TB-Adressraum (= 48 Bit physikalische Adresse) KEINE Festplattenlaufwerke wie SATA-Laufwerke enthält, da sie NICHT Teil der Adresszuordnung sind. Sie enthalten nur den byteadressierbaren Speicher, der für das Betriebssystem verfügbar ist.

2) CPU-Hardware kann je nach Servergenerierung 46, 48 oder> 48 Bit implementieren. Ein weiterer wichtiger Faktor ist, wie viele Bits das Betriebssystem erkennt . Heute unterstützt WS16 physische 48-Bit-Adressen (= 256 TB). 

Für den Benutzer bedeutet dies, dass der Server zwar über eine große, hochmoderne Server-CPU verfügt, die> 48 Bit Adressierung unterstützen kann. Wenn Sie ein Betriebssystem ausführen, das nur 48 Bit PA unterstützt, können Sie nur 256 TB nutzen . 

3) Insgesamt gibt es zwei Hauptfaktoren, um die höhere Anzahl von Adressbits (= mehr Speicherkapazität) zu nutzen.

a) Wie viele Bits unterstützt Ihre CPU-HW? (Dies kann durch die CPUID-Anweisung in Intel-CPUs bestimmt werden.).

b) Welche OS-Version läuft und wie viele Bits von PA erkennt/unterstützt es.

Das Minimum von (a, b) bestimmt letztendlich die Menge des adressierbaren Speicherplatzes, den Ihr System nutzen kann.

Ich habe diese Antwort geschrieben, ohne mir die anderen Antworten im Detail anzusehen. Ich habe mich auch nicht eingehend mit den Nuancen von MMIO, MMCFG und der Gesamtheit der Adresskartenkonstruktion beschäftigt. Aber ich hoffe, das hilft.

Vielen Dank, Anand K Enamandram, Server Platform ArchitectIntel Corporation

2

Es ist nicht wahr, dass nur die niederwertigen 48 Bits eines 64-Bit VA verwendet werden, zumindest bei Intel 64. Die oberen 16 Bits werden irgendwie verwendet.

Abschnitt 3.3.7.1 Kanonische Adressierung im Intel® 64- und IA-32-Architekturen Software-Entwicklerhandbuch sagt:

für eine kanonische Adresse müssen die Bits 63 bis 48 auf Nullen oder Einsen gesetzt sein (abhängig davon, ob Bit 47 eine Null oder Eins ist).

Die Bits 47 bis 63 bilden also ein Super-Bit, entweder alle 1 oder alle 0. Wenn eine Adresse nicht in kanonischer Form vorliegt, sollte die Implementierung fehlerhaft sein.

Bei AArch64 ist das anders. Gemäß dem ARMv8-Befehlssatz handelt es sich um eine 49-Bit-VA. 

Das AArch64-Speicherübersetzungssystem unterstützt eine virtuelle 49-Bit-Adresse (48 Bit pro Übersetzungstabelle). Virtuelle Adressen werden von 49 Bit signiert und in einem 64-Bit-Zeiger gespeichert. Optional können unter der Steuerung eines Systemregisters die höchstwertigen 8 Bits eines 64-Bit-Zeigers ein "Tag" enthalten, das ignoriert wird, wenn es als Lade-/Speicheradresse oder als Ziel einer indirekten Verzweigung verwendet wird 

1
Olsonist

Viele Menschen haben dieses Missverständnis. Aber ich verspreche Ihnen, wenn Sie dies sorgfältig lesen. Nach dem Lesen werden alle Ihre falschen Vorstellungen klar sein.

Um zu sagen, dass ein Prozessor 32 Bit oder 64 Bit hat, bedeutet das nicht, dass er einen 32 Bit Adressbus bzw. 64 Bit Adressbus haben sollte ... ... ich wiederhole es nicht !!

Ein 32-Bit-Prozessor bedeutet, dass er über eine 32-Bit-ALU (Arithmetic and Logic Unit) verfügt. Das heißt, er kann mit einem 32-Bit-Binäroperanden arbeiten (oder einfach eine Binärzahl mit 32 Ziffern sagen), und ein 64-Bit-Prozessor kann mit 64-Bit-Binäroperationen arbeiten Operand. Bei einem Prozessor mit 32 Bit oder 64 Bit bedeutet dies NICHT, dass die maximale Speichermenge installiert werden kann. Sie zeigen nur, wie groß der Operand sein kann ... (Analogie können Sie sich vorstellen, dass ein 10-stelliger Rechner Ergebnisse bis zu 10 Stellen berechnen kann ... er kann uns keine 11 Ziffern oder andere größere Ergebnisse liefern ... obwohl dies der Fall ist in dezimal, aber ich sage diese Analogie aus Gründen der Vereinfachung) ... aber was Sie sagen, ist ein Adressraum, der die maximal direkt steckbare Größe des Arbeitsspeichers (RAM) ist. Die maximal mögliche Größe des Arbeitsspeichers wird durch die Größe des Adressbusses bestimmt und ist nicht die Größe des Datenbusses oder der ALU, für die die Prozessorgröße definiert ist (32/64 Bit). Ja, wenn ein Prozessor 32 Bit "Adressbus" hat, kann er 2 ^ 32 Byte = 4 GB RAM adressieren (oder für 64 Bit 2 ^ 64) ... aber ein Prozessor 32 Bit oder 64-Bit hat keine Bedeutung für diesen Adressraum (Adressraum = wie weit er auf den Speicher oder die maximale RAM-Größe zugreifen kann) und ist nur von der Größe seiner ALU abhängig. Natürlich können Datenbus und Adressbus dieselbe Größe haben, und dann scheint es, als würde ein 32-Bit-Prozessor bedeuten, dass er auf 2 ^ 32-Byte- oder 4 GB-Speicher zugreifen wird ... aber es ist nur ein Zufall und es wird nicht dasselbe sein für alle .... zum Beispiel intel 8086 ist ein 16-Bit-Prozessor (da er 16-Bit-ALU hat), so dass Sie sagen sollten, er hätte auf 2 ^ 16 Byte = 64 KB Speicher zugreifen sollen, aber es stimmt nicht. Es kann auf bis zu 1 MB Speicher zugreifen, um einen 20-Bit-Adressbus zu haben. Sie können google, wenn Sie irgendwelche Zweifel haben :)

Ich denke, ich habe meinen Punkt klargestellt. Nun zu Ihrer Frage ... als 64-Bit-Prozessor bedeutet dies nicht, dass er einen 64-Bit-Adressbus haben muss. Daher ist es nicht falsch, einen 48-Bit-Adressbus in einem 64-Bit-Prozessor zu haben ... sie haben den Adressraum kleiner gehalten, um das Design und die Herstellung billig zu gestalten .... da niemand einen so großen Speicher verwenden wird (2 ^ 64 Byte) ... wo 2 ^ 48 Byte heutzutage mehr als genug sind.

1
hafiz031

Eine CPU wird hauptsächlich wegen ihrer Datenbusgröße als "N-Bit" betrachtet, und bei einem Großteil ihrer Entitäten (interne Architektur) gilt: : Register, Akkumulatoren, Arithmetik-Logik-Einheit (ALU), Befehlssatz usw Zum Beispiel: Die gute alte Motorola 6800 (oder Intel 8050) CPU ist eine 8-Bit-CPU. Es hat einen 8-Bit-Datenbus, eine 8-Bit-Architektur und einen 16-Bit-Adressbus.


  • Obwohl die N-Bit-CPU andere Entitäten als die Größe N haben kann. Zum Beispiel die Verbesserungen in der 6809 über die 6800 (beide sind 8-Bit-CPU mit einem 8-Bit-Datenbus). Zu den wesentlichen Verbesserungen, die in 6809 eingeführt wurden, gehörte die Verwendung von zwei 8-Bit-Akkumulatoren (A und B, die zu einem einzigen 16-Bit-Register D kombiniert werden konnten), zwei 16-Bit-Indexregister (X, Y) und zwei 16-Bit-Stapelzeiger.
0
Amit G.