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

97

In einem Buch habe ich folgendes gelesen:

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

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

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

er4z0r
quelle
11
Das Buch muss speziell über die aktuelle Implementierung der AMD64-Architektur (x86-64) gesprochen haben. Es werden nur die niederwertigen 48 Bits verwendet. Dies ist jedoch keine Hardwarebeschränkung - alle 64 Bit sind verfügbar.
Cody Gray
7
Immer eine gute Idee, das Buch zu identifizieren.
Henk Holterman
1
Ich vermute, dass physische Adressleitungen nicht frei sind (Sie benötigen mindestens 16 zusätzliche CPU-Pins). Und mir ist noch keine Hardware bekannt, die einen 48-Bit-Speicherplatz mit physischen RAM-Chips auf demselben Prozessor füllen kann. Wenn dies machbar wird, bin ich sicher, dass AMD die fehlenden 16 Pins hinzufügen wird :)
Torp
7
Selbst wenn dies The 32-bit processors have 2^32 possible addressesnicht unbedingt der Fall ist, kann eine 32-Bit-CPU mit nur 24 "Pins" für die Adressierung des Speichers vorhanden sein. Beispielsweise ist 68EC020 (billigere 68020-Version) eine 32-Bit-CPU, jedoch mit 24 Bit zur Adressierung des Speichers.
ShinTakezou
21
Es gibt ein sehr reales Problem mit der physischen 64-Bit-Adressierung. Die Seitengröße des virtuellen Speichers ist zu klein. Dies führt zu enormen Seitenverzeichnissen und extrem teuren TLB-Cache-Leeren bei jedem Kontextwechsel. Das Verschieben von 4 KB auf 4 MB Seiten ist eine Option, aber mit aktuellen Betriebssystemen sehr inkompatibel.
Hans Passant

Antworten:

134

Weil das alles ist, was benötigt wird. 48 Bit geben Ihnen einen Adressraum von 256 Terabyte. Das ist viel. Sie werden in naher Zukunft kein System sehen, das mehr benötigt.

Also haben die CPU-Hersteller eine Abkürzung genommen. Sie verwenden einen Befehlssatz, der einen vollständigen 64-Bit-Adressraum zulässt, aber aktuelle CPUs verwenden nur die unteren 48 Bit. Die Alternative bestand darin, Transistoren für die Handhabung eines größeren Adressraums zu verschwenden, der für viele Jahre nicht benötigt werden würde.

Sobald wir uns dem 48-Bit-Limit nähern, müssen nur noch CPUs freigegeben werden, die den gesamten Adressraum verwalten. Es sind jedoch keine Änderungen am Befehlssatz erforderlich, und die Kompatibilität wird nicht beeinträchtigt.

jalf
quelle
117
640kb ist genug für jeden.
7
Führen Sie immer noch ein 8088-System aus, bdares?
Joe
23
@bdares: Schlechte Analogie. In den Befehlssatz des 8088/8086-Bogens ist ein Limit von 640 KB integriert. Nur mit einer neuen ISA (386) konnte die Barriere durchbrochen werden. x86_64 unterstützt dagegen alle 64 Bit in der ISA. Es ist nur die Hardware der aktuellen Generation, die nicht alle nutzen kann ...
R .. GitHub STOP HELPING ICE
16
@R. Tatsächlich betrug die Beschränkung in der CPU ein Megabyte. Der IBM PC hat einen Abschnitt davon für speicherabgebildete Peripheriegeräte, BIOS usw. festgelegt. Einige andere 8088/8086-Designs (Zenith Z100, wenn Speicher bereitgestellt wird) sind weniger für Peripheriegeräte und dergleichen und entsprechend mehr für Anwendungsprogramme vorgesehen.
Jerry Coffin
25
lwn.net/SubscriberLink/655437/9a48cd3e7a8cbe8a <- Drei Jahre nach dieser Antwort stoßen wir bereits an diese Grenzen :) Der HP Computer verfügt über 320 TB Speicher und kann ihn aufgrund der 48 nicht als flachen Adressraum bereitstellen -Bit-Adressierungsbeschränkung.
Agam
18

Jede Antwort, die sich auf die Busgröße und den physischen Speicher bezieht, ist leicht falsch, da die Frage von OP den virtuellen Adressraum und nicht den physischen Adressraum betraf . Zum Beispiel war die angeblich analoge Grenze für einige 386 eine Grenze für den physischen Speicher, den sie verwenden konnten, nicht für den virtuellen Adressraum, der immer volle 32 Bit betrug. Im Prinzip können Sie sogar mit nur wenigen MB physischem Speicher volle 64 Bit virtuellen Adressraum verwenden. Natürlich können Sie dies durch Austauschen oder für spezielle Aufgaben tun, bei denen Sie dieselbe Seite an den meisten Adressen zuordnen möchten (z. B. bestimmte Operationen mit geringen Datenmengen).

Ich denke, die wirkliche Antwort ist, dass AMD nur billig war und hoffte, dass sich jetzt niemand darum kümmern würde, aber ich habe keine Referenzen zum Zitieren.

R .. GitHub HÖREN SIE AUF, EIS ZU HELFEN
quelle
14
"Billig sein" Ich denke, Sie meinen, keine Pins hinzuzufügen, die niemals verwendet werden, keinen Chipplatz für Transistoren zu beanspruchen, die nicht verwendet werden, und den freigegebenen Platz zu nutzen, um vorhandene Anweisungen schneller zu machen? Wenn das billig ist, bin ich dabei!
Olof Forshell
Der 80386 ermöglicht 2 * 4096 Selektoren mit jeweils bis zu 4 GB Speicher (insgesamt 32 TB). Der 80286 erlaubte 2 * 4096 Selektoren mit jeweils bis zu 64 KB (1 GB).
Olof Forshell
Nichtlineare segmentierte Hacks zählen in meinem Buch nicht als Adressraum. Es gibt keine Möglichkeit für tragbare Software, sie zu nutzen.
R .. GitHub STOP HELPING ICE
@R .. - Ich dachte, die Definition von tragbarer Software ist, dass es kann . :-) Zum Beispiel verbietet C ++ das Vergleichen von Zeigern in verschiedene Arrays, damit sie sich in separaten 4-GB-Segmenten befinden können.
Bo Persson
Wenn Ihre Kompilierung tatsächlich große Zeiger generiert und für jede Speicher-Dereferenzierung ein Segmentregister lädt, dann ja. Aber in Wirklichkeit ist das schrecklich langsam, und stattdessen haben alle kleine Speichermodelle und __far(oder noch schlimmer, FAR/ far!) Zeiger verwendet ...
R .. GitHub STOP HELPING ICE
10

Lesen Sie den Abschnitt mit den Einschränkungen des Wikipedia-Artikels :

Ein PC kann nicht 4 Petabyte Speicher enthalten (aufgrund der Größe der aktuellen Speicherchips, wenn nichts anderes), aber AMD stellte sich große Server, gemeinsam genutzte Speichercluster und andere Verwendungen des physischen Adressraums vor, die sich in absehbarer Zukunft dem nähern könnten, und die 52 Die physische Bitadresse bietet ausreichend Raum für Erweiterungen, ohne die Kosten für die Implementierung physischer 64-Bit-Adressen zu verursachen

Das heißt, es macht derzeit keinen Sinn, eine vollständige 64-Bit-Adressierung zu implementieren, da wir kein System erstellen können, das einen solchen Adressraum vollständig nutzen kann. Daher wählen wir etwas aus, das für die Systeme von heute (und morgen) praktisch ist.

Damien_The_Unbeliever
quelle
Woher kommen die 4 in den 4 Petabyte? Wenn es sich um 64 Adressleitungen handelt, sollten wir das Quadrat des Adressraums erhalten, das durch 32 Adressleitungen ermöglicht wird, was 4 Gigabyte entspricht. Quadrieren Sie das und wir sollten 16 haben, nicht 4 Petabyte. Vermisse ich etwas
Olof Forshell
1
Es kommt von der aktuellen physischen Grenze (52 Bit) - der Punkt ist, dass wir nicht genug RAM in einen PC stecken können, um diesen eingeschränkten Bereich zu unterstützen, geschweige denn, was für einen vollständigen 64-Bit-Adressraum erforderlich wäre.
Damien_The_Unbeliever
9

Die interne native Register- / Operationsbreite muss nicht in der externen Adressbusbreite berücksichtigt werden.

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

Das Motorola 68000 war so; 32 Bit intern, jedoch mit einem 23-Bit-Adressbus (und einem 16-Bit-Datenbus). Die CPU konnte auf 16 Megabyte RAM zugreifen, und zum Laden des nativen Datentyps (32 Bit) waren zwei Speicherzugriffe erforderlich (jeder mit 16 Bit Daten).


quelle
1
Aber 68000 wird als "16/32 Bit" -CPU betrachtet, nicht als "volle" 32-Bit-CPU. Man könnte also sagen, dass es in der 16-Bit-Vergangenheit noch einen Fuß hat. Ich habe den 68020 als Beispiel ausgewählt, da seine kostengünstige 68EC020-Version nur für Adressen 24 Bit enthält, obwohl der 68020 eine "volle" 32-Bit-CPU ist ... +1, um diese wunderbare Prozessorfamilie in Betracht zu ziehen!
ShinTakezou
@ShinTakezou: War der 80386SX ehrlich gesagt eine 16-Bit-CPU (weil er einen Adressraum wie der 80286 hatte) oder 32-Bit (weil er die interne Architektur eines 80386DX hatte)? Man könnte sagen, wie Sie es tun, aber ein anderer (dieser) sagt "intern ist das, was zählt" - und Sie können mich dazu zitieren.
Olof Forshell
@Olof Ich denke, dass im Kontext des "Speichers" (der die Außenwelt ist) das Externe zählt, also ist 68000 eine
16-
@ShinTakezou: Der Speicherkontext, selbst Caches, befindet sich immer außerhalb der CPU selbst, obwohl sie in modernen Prozessoren extrem eng miteinander verbunden sind. Der 8088 war intern gleich dem 8086, obwohl er acht Datenbusleitungen zu den sechzehn des 8086 hatte. Ich sehe nicht, was Sie anscheinend als offensichtlich ansehen, dass der 8088 in dieselbe Gruppe wie der Z80, 8080, 8085 usw. eingestuft werden sollte. Die Frage nach der Breite des Datenbusses scheint in diesem Zusammenhang trivial
Olof Forshell
Ich bin überhaupt kein Experte für eine solche Angelegenheit, daher habe ich nichts Offensichtliches für mich. Ich wollte nur die Notwendigkeit eines schärferen Schnitts mit der Vergangenheit bemerken, wo man denken könnte, dass 68000 immer noch ein "alter" Prozessor ist dass es "natürlich" erscheinen könnte, dass sein Adressraum auf weniger als 32 Bit begrenzt ist, während der 68020 32 Bit kann, so dass die Existenz des 68EC020 mit seiner Begrenzung klar macht, dass es eine Wahl ist, die nicht auf "Begrenzung davon" ( oder diesmal) "aber zu anderen Überlegungen (möchte es billiger machen, wenn es keinen wirklichen Vorteil gibt, 64 Pins zu haben), was mehr oder weniger das Argument dieser Antwort ist.
ShinTakezou
7

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

Brendan
quelle
1
Intel schlägt ein 5-Level-Paging-Schema vor , das von derzeit 48 Bit auf 57 Bit erweitert werden soll. (Gleiche 9 Bit pro Ebene / 4 KBeiten wie aktuelle x86-64-Seitentabellen). Die Verwendung von 10 oder 11 Bit pro Ebene hätte eine Änderung der Page-Walk-Hardware erforderlich gemacht. Dies ist möglicherweise nicht das optimale Design für großen Speicher, aber eine sinnvolle Erweiterung für eine Dual-Mode-CPU, die auch maximale Leistung für 4-Bit unterstützen muss. Level-Tabellen im aktuellen Format.
Peter Cordes
Bei 2M- oder 1G-Riesenseiten sind es natürlich nur 4 oder 3 Ebenen von Seitentabellen von der obersten Ebene bis zu einem Riesenseitentabelleneintrag anstelle eines Seitenverzeichniszeigers.
Peter Cordes
6

Aus meiner Sicht ergibt sich dies aus 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.

Linzuojian
quelle
4

Um die ursprüngliche Frage zu beantworten: Es war nicht erforderlich, mehr als 48 Bit PA hinzuzufügen.

Server benötigen die maximale Speicherkapazität. Versuchen wir also, tiefer zu graben.

1) Die größte (häufig verwendete) Serverkonfiguration ist ein 8-Socket-System. Ein 8S-System ist nichts anderes als eine 8-Server-CPU, die über eine kohärente Hochgeschwindigkeitsverbindung (oder einfach einen Hochgeschwindigkeitsbus) zu einem einzigen Knoten verbunden ist. Es gibt größere Cluster, aber es gibt nur wenige, 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 8S normalerweise als sehr hochwertig angesehen wird.

2) Die wichtigsten Speichertypen, die von Servern verwendet werden, sind byteadressierbarer regulärer DRAM-Speicher (z. B. DDR3 / DDR4-Speicher), Memory Mapped IO - MMIO (z. B. Speicher, der von einer Zusatzkarte verwendet wird) sowie Konfigurationsbereich, der zum Konfigurieren verwendet wird die Geräte, die im System vorhanden sind. 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 je nach tatsächlicher Konfiguration des Systems auch eine große Menge an MMIO.

3) Angenommen, jede Server-CPU kann 16 DDR4-DIMMs in jedem Steckplatz aufnehmen. Mit einer maximalen DDR4-Größe von 256 GB. (Abhängig von der Serverversion beträgt diese Anzahl möglicher DIMMs pro Socket weniger als 16 DIMMs. Lesen Sie jedoch weiter, um das Beispiel zu verdeutlichen.)

Jeder Socket kann also theoretisch 16 * 256 GB = 4096 GB = 4 TB haben. In unserem Beispiel-8S-System kann die DRAM-Größe maximal 4 * 8 = 32 TB betragen. Dies bedeutet, dass die maximale Anzahl von Bits, die zur Adressierung dieses DRAM-Raums benötigt werden, 45 beträgt (= log2 32 TB / log2 2).

Wir werden nicht auf die Details der anderen Speichertypen (MMIO, MMCFG usw.) eingehen, aber der Punkt hier ist, dass der "anspruchsvollste" Speichertyp für ein 8-Socket-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), verbleiben (48-45 =) 3 Bit. Das heißt, wenn wir die unteren 45 Bits ausschließlich für 32 TB DRAM verwenden, haben wir immer noch 2 ^ 3-mal adressierbaren Speicher, der für MMIO / MMCFG für insgesamt 256 TB adressierbaren Speicherplatz verwendet werden kann.

Zusammenfassend lässt sich sagen: 1) 48 Bit physische Adresse sind viele Bits, um die größten Systeme von heute zu unterstützen, die mit reichlich DDR4 und vielen anderen E / A-Geräten, die MMIO-Speicherplatz benötigen, "voll geladen" sind. 256 TB um genau zu sein.

Beachten Sie, dass dieser 256-TB-Adressraum (= 48 Bit physische Adresse) KEINE Festplattenlaufwerke wie SATA-Laufwerke enthält, da diese NICHT Teil der Adresszuordnung sind, sondern nur den Speicher, der byteadressierbar ist und dem Betriebssystem ausgesetzt ist.

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

Für den Benutzer bedeutet dies, dass Sie, obwohl Sie eine große, hochmoderne Server-CPU haben, die> 48 Bit Adressierung unterstützt, wenn Sie ein Betriebssystem ausführen, das nur 48 Bit PA unterstützt, nur 256 TB nutzen können .

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

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

b) Welche Betriebssystemversion verwenden Sie und wie viele PA-Bits werden erkannt / unterstützt?

Das Minimum von (a, b) bestimmt letztendlich die Menge an adressierbarem Speicherplatz, den Ihr System nutzen kann.

Ich habe diese Antwort geschrieben, ohne die anderen Antworten im Detail zu untersuchen. Außerdem habe ich mich nicht im Detail mit den Nuancen von MMIO, MMCFG und der Gesamtheit der Adresskartenkonstruktion befasst. Aber ich hoffe das hilft.

Vielen Dank, Anand K Enamandram, Server Platform Architect der Intel Corporation

Anand K Enamandram
quelle
Diese Frage stellt etwa 48-Bit virtuellen Adressraum Größe (erfordern virtuelle Adressen kanonische sein). Sie möchten mehr virtuelle Bits als physische Bits, sodass ein High-Half-Kernel den gesamten physischen Speicher einem einzelnen Adressraum (einem eigenen oder einem Benutzerraum) zuordnen kann. Wie Sie sagen, muss HW nur ​​so viele PA-Bits implementieren, wie die DRAM-Controller + MMIO verwenden können, und kann eine beliebige Anzahl bis zur 52-Bit-Grenze im x86-64-Seitentabellenformat verwenden. ( Warum in 64 Bit ist die virtuelle Adresse 4 Bit kurz (48 Bit lang) im Vergleich zur physischen Adresse (52 Bit lang)? )
Peter Cordes
1
Das 4-Ebenen-Seitentabellenformat legt auch die 48-Bit-VA-Grenze fest, bis HW + SW PML5-Seitentabellen für 57-Bit-VAs unterstützt. Auf jeden Fall ist dies eine nützliche Antwort, aber sie scheint unter der falschen Frage zu stehen. Ich bin mir nicht sicher, ob es einen besseren Ort dafür gibt, also können wir ihn hier lassen, hoffentlich mit einer Bearbeitung, um einen Header hinzuzufügen, der etwas über PA vs. VA aussagt.
Peter Cordes
2

Viele Menschen haben dieses Missverständnis. Aber ich verspreche Ihnen, wenn Sie dies sorgfältig lesen, nachdem Sie dies gelesen haben, werden alle Ihre Missverständnisse klar sein.

Zu sagen, dass ein 32-Bit- oder 64-Bit-Prozessor nicht bedeutet, dass er einen 32-Bit-Adressbus oder einen 64-Bit-Adressbus haben sollte! ... Ich wiederhole es NICHT !!

32-Bit-Prozessor bedeutet, dass er über eine 32-Bit-ALU (Arithmetic and Logic Unit) verfügt. Dies bedeutet, dass er mit einem 32-Bit-Binäroperanden (oder einfach einer Binärzahl mit 32 Ziffern) und einem 64-Bit-Prozessor mit 64-Bit-Binär arbeiten kann Operand. Wenn Sie also einen 32-Bit- oder 64-Bit-Prozessor verwenden, bedeutet dies NICHT, dass maximal Speicher installiert werden kann. Sie zeigen nur, wie groß der Operand sein kann ... (analog kann man sich vorstellen, dass ein 10-stelliger Rechner Ergebnisse mit bis zu 10 Stellen berechnen kann ... er kann uns keine 11 Stellen oder andere größere Ergebnisse liefern ... obwohl dies der Fall ist in Dezimalzahl, aber ich erzähle diese Analogie der Einfachheit halber) ... aber was Sie sagen, ist der Adressraum, der die maximale direkt interfaceable Größe des Speichers (RAM) darstellt. Der RAM ' Die maximal mögliche Größe wird durch die Größe des Adressbusses bestimmt und ist nicht die Größe des Datenbusses oder sogar der ALU, auf der die Größe des Prozessors definiert ist (32/64 Bit). Ja, wenn ein Prozessor einen 32-Bit- "Adressbus" hat, kann er 2 ^ 32 Byte = 4 GB RAM adressieren (oder für 64 Bit sind es 2 ^ 64) ... aber ein Prozessor hat 32 Bit oder 64 Bit Keine Relevanz für diesen Adressraum (Adressraum = wie weit er auf den Speicher zugreifen kann oder die maximale Größe des RAM) und er hängt nur von der Größe seiner ALU ab. Natürlich können Datenbus und Adressbus gleich groß sein, und dann scheint es, dass ein 32-Bit-Prozessor bedeutet, dass er auf 2 ^ 32 Byte oder 4 GB Speicher zugreift ... aber es ist nur ein Zufall und es wird nicht der gleiche sein für alle.... Zum Beispiel ist Intel 8086 ein 16-Bit-Prozessor (da er eine 16-Bit-ALU hat). Wie Sie sagen, sollte er auf 2 ^ 16 Byte = 64 KB Speicher zugreifen, aber das ist nicht wahr. Es kann auf bis zu 1 MB Speicher für 20-Bit-Adressbus zugreifen .... Sie können googeln, wenn Sie irgendwelche Zweifel haben :)

Ich glaube, ich habe meinen Standpunkt klargestellt. Kommen wir nun zu Ihrer Frage ... da ein 64-Bit-Prozessor nicht bedeutet, dass er einen 64-Bit-Adressbus haben muss, ist es nichts Falsches, 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 machen ... da niemand einen so großen Speicher (2 ^ 64 Byte) verwenden wird ... wo 2 ^ 48 Byte heutzutage mehr als genug sind.

hafiz031
quelle
Ich denke, Sie haben Ihren Standpunkt sehr deutlich gemacht. Eines verstehe ich jedoch nicht, was Sie über die 16-Bit-8086-CPU gesagt haben: Wie kann eine 16-Bit-CPU mit einer 20-Bit-Adresse umgehen? Behandelt es es in 2 Schritten? Selbst wenn der Adressbus 20 Bit breit ist, kann die Registerbreite nach Erreichen der CPU offensichtlich nur 16 Bit betragen ... Wie machen sie das?
Programmierer
2
Hmm ... 2 Schritte Betrieb. Das Segmentregister enthält nur die oberen 16 Bits. Dann wird es mit 10H multipliziert, um 20 Bit zu erhalten, und dann wird der Offset addiert.
hafiz031
1

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

In Abschnitt 3.3.7.1 Kanonische Adressierung im Softwareentwicklerhandbuch für Intel® 64- und IA-32-Architekturen heißt es:

Bei einer kanonischen Adresse müssen die Bits 63 bis 48 auf Nullen oder Einsen gesetzt sein (abhängig davon, ob Bit 47 eine Null oder eine 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 dies anders. Laut ARMv8 Instruction Set Overview 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 vorzeichenerweitert 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 Ziel einer indirekten Verzweigung verwendet wird

Olsonist
quelle
1
Nur die unteren 48 sind von Bedeutung, aber die Hardware überprüft, ob das Vorzeichen korrekt auf 64 Bit erweitert wurde. IDK, warum sie keine Null-Erweiterung angegeben haben; Vielleicht wollten sie es bequemer machen, nach einer Adresse mit hoher oder niedriger Hälfte zu suchen (indem sie nur das Vorzeichenbit überprüfen). Oder um zu vermeiden, dass die 2 ^ 48-Grenze speziell wird, können Adressen in der Nähe der Oberseite bequem in 32-Bit-Konstanten mit Vorzeichenerweiterung passen. Ich denke, letzteres ist wahrscheinlicher.
Peter Cordes
Wie auch immer, die aktuelle HW-Prüfung auf Canonical verhindert, dass Software ignorierte Bits für markierte Zeiger verwendet, die bei zukünftigen HW-Anwendungen nicht mehr funktionieren. Dies ist Teil des Mechanismus, der es ermöglicht, zukünftige Hardware bei Bedarf zu erweitern. (Was eher früher als erwartet sein könnte, da nichtflüchtiger Speicher direkt in den physischen und virtuellen Adressraum eingebunden ist.)
Peter Cordes
procfs unter Linux auf meinem Core i5 sagt, dass es 7ffd5ea41000-7ffd5ea62000 zugeordnet wird. Dieser Adressbereich ist gemäß der obigen "kanonischen" Regel sinnvoll. Bit 48-63 sind 0, was es zu einer korrekten kanonischen Adresse macht. Was etwas seltsam ist, sind einige Adressen in der Linux-Quelle. In include / asm / pgtable_64_types steht #define __VMALLOC_BASE _AC (0xff92000000000000, UL). Dies ist KEINE kanonische Adresse. Eine solche Adresse würde mit 0xffff8 beginnen. Keine Ahnung warum.
Olsonist
Ja, IIRC Linux verwendet die niedrige Hälfte des kanonischen Bereichs für den Benutzerbereich und (meistens) die hohe Hälfte für Nur-Kernel-Zuordnungen. Ein Teil des Kernelspeichers wird jedoch wie die [vsyscall]Seite in den Benutzerbereich exportiert . (Das mag Sachen wie aktuelle PID werden exportieren , so dass getpid()rein User-Space ist. Auch gettimeofday()nur RDTSC in User-Space + Skalierungen exportiert vom Kernel verwenden können. Obwohl einige das ist denke ich in [vdso], die in der Nähe der Spitze der ist untere Hälfte.)
Peter Cordes
IDK was __VMALLOC_BASEmacht. Vermutlich wird es nicht direkt verwendet.
Peter Cordes
0

Eine CPU wird hauptsächlich aufgrund ihrer Datenbusgröße und eines großen Teils ihrer Entitäten (interne Architektur) als "N-Bits" betrachtet : Register, Akkumulatoren, Arithmetik-Logikeinheit (ALU), Befehlssatz usw. Zum Beispiel: Die gute alte Motorola 6800 (oder Intel 8050) CPU ist eine 8-Bit-CPU. Es verfügt über einen 8-Bit-Datenbus, eine interne 8-Bit-Architektur und einen 16-Bit-Adressbus.


  • Obwohl die N-Bit-CPU möglicherweise andere Entitäten als N-Bits hat. Zum Beispiel die Verbesserungen im 6809 gegenüber dem 6800 (beide sind 8-Bit-CPUs mit einem 8-Bit-Datenbus). Zu den im 6809 eingeführten signifikanten Verbesserungen 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-Indexregistern (X, Y) und zwei 16-Bit-Stapelzeiger.
Amit G.
quelle
Es gibt bereits eine Antwort , die diesen Punkt am Beispiel von Motorola 68000/68020 anführt. Bei dieser Frage geht es wirklich um x86-64, nicht um alte 8/16-Bit-CPUs. Im Fall von x86-64 ist einer der Hauptfaktoren, dass breitere virtuelle Adressen eine tiefere Seitentabelle benötigen und dieser Faktor für die alten Chips, über die Sie sprechen, nicht vorhanden war.
Peter Cordes
Die Datenbusbreite muss nicht mit der Register- oder ALU-Breite übereinstimmen. Zum Beispiel hat P5 Pentium einen 64-Bit-Datenbus (ausgerichtete 64-Bit-Lasten / -Speicher sind garantiert atomar), aber Register / ALUs sind nur 32-Bit (mit Ausnahme der integrierten FPU und im späteren Pentium MMX der SIMD) ALUs.)
Peter Cordes
OP write: "Meine Erwartung war, dass der Adressraum bei einem 64-Bit-Prozessor ebenfalls 2 ^ 64 betragen sollte." ........ Sie schreiben: "Bei dieser Frage geht es wirklich speziell um x86-64, nicht um alte 8/16-Bit-CPUs". ........ Ich denke, Sie haben die Essenz der OP-Frage übersehen. Die OP-Frage ist das Ergebnis der falschen Annahme, dass eine 64-Bit-CPU einen 64-Bit-Adressbus haben sollte. Über die ALU schrieb ich einen großen Teil ihrer Entitäten; Nicht alle von ihnen.
Amit G.
Hör auf, mich zu spammen, indem du diesen Kommentar erneut postest. Ja, natürlich ist das OP aus dem von Ihnen beschriebenen Grund falsch, aber ich habe darauf hingewiesen, dass Ihre Antwort so aussieht, als ob sie einen ähnlichen Fehler macht. Sie sagen " und folglich einen großen Teil seiner Entitäten: Register und Akkumulatoren, Arithmetic-Logic-Unit (ALU) ... ", was so klingt, als würden Sie sagen, dass diese Dinge mit der Datenbusbreite übereinstimmen. Der Ausdruck "ein großer Teil" impliziert, dass Sie sagen, welche Teile, nicht dass es nur manchmal für diese Teile gilt.
Peter Cordes