0xFFFFFFF0
Hier beginnt eine x86-kompatible CPU mit der Ausführung von Anweisungen, wenn sie eingeschaltet ist. Dies ist ein festverdrahteter, unveränderlicher Aspekt (ohne zusätzliche Hardware) der CPU, und verschiedene CPU-Typen verhalten sich unterschiedlich.
Warum befindet sich die erste BIOS-Anweisung oben auf einem 4-GB-RAM?
Es befindet sich im "oberen" Bereich des 4-GB- Adressraums - und beim Einschalten wird das BIOS oder UEFI- ROM so eingestellt, dass es auf Lesevorgänge dieser Adressen reagiert.
Meine Theorie, warum das so ist:
Fast alles in der Programmierung funktioniert mit zusammenhängenden Adressen besser. Der CPU-Designer weiß nicht, was ein System-Builder mit der CPU machen möchte. Daher ist es eine schlechte Idee, dass die CPU Adressen benötigt, die in der Mitte des Speicherplatzes liegen und für verschiedene Zwecke benötigt werden. Es ist besser, das "aus dem Weg" oben oder unten im Adressraum zu lassen. Denken Sie natürlich daran, dass diese Entscheidung getroffen wurde, als der 8086 neu war und keine MMU besaß .
In der 8086 existierten Unterbrechungsvektoren an der Speicherstelle 0 und darüber. Interrupt-Vektoren müssen an bekannten Adressen vorliegen und sollten sich aus Gründen der Flexibilität im RAM befinden. Dem CPU-Designer war es jedoch nicht möglich zu wissen, wie viel RAM sich in einem System befinden würde. Es machte also Sinn, mit 0 anzufangen, und diese aufzurüsten (da 1978, als der 8086 erfunden wurde, kein System 4 GB RAM hatte - es war also keine gute Idee, RAM auf 0xFFFFFFF0 zu setzen), und dann musste es ROM sein an der oberen Grenze.
Ab mindestens 80286 könnten Interrupt-Vektoren an eine andere Startposition als 0 verschoben werden, aber moderne 64-Bit-x86-CPUs werden weiterhin im 8086-Modus gestartet, sodass aus Kompatibilitätsgründen immer noch alles auf die alte Weise funktioniert (was lächerlich ist) wie es sich im Jahr 2015 anhört, muss Ihre x86-CPU noch DOS ausführen können).
Da Interrupt-Vektoren bei 0 beginnen und aufwärts arbeiten, müsste ROM von oben beginnen und abwärts arbeiten.
Was würde passieren, wenn mein Computer nur 1 GB RAM hat?
Eine 32-Bit-CPU hat 4.294.967.296 Adressen mit den Nummern 0 (0x00000000) bis 4294967295 (0xFFFFFFFF). ROM kann in einigen Adressen leben und RAM kann in anderen leben. Mit der MMU der CPU kann dies sogar im laufenden Betrieb umgeschaltet werden. RAM muss nicht an allen Adressen leben.
Mit nur 1 GB RAM reagieren einige Adressen beim Lesen oder Schreiben nicht. Dies kann dazu führen, dass ungültige Daten gelesen werden, wenn auf solche Adressen zugegriffen wird oder das System abstürzt.
Was ist mit Systemen mit mehr als 4 GB RAM (z. B. 8 GB, 16 GB usw.)?
Einfacher ausgedrückt: 64-Bit-CPUs haben mehr Adressen (das ist eines der Dinge, die sie zu 64-Bit-CPUs machen - z. B. 0x00000000000000 bis 0xFFFFFFFFFFFFFFFFFF), sodass das zusätzliche RAM "passt". Angenommen, die CPU befindet sich im Long-Modus . Bis dahin ist der RAM da, nur nicht adressierbar.
Warum wird der Stack mit einem bestimmten Wert initialisiert (in diesem Fall einem Wert, der sich bei 0xFFFFFFF0 befindet)?
Ich kann beim Einschalten nicht sofort feststellen, was x86 dem Stapelzeiger zuweist, aber irgendwann müsste er von einer Initialisierungsroutine neu zugewiesen werden, sobald diese Routine feststellt, wie viel RAM im System vorhanden ist. (@Eric Towers in den Kommentaren unten meldet, dass es beim Einschalten auf Null gesetzt wird.)