aus Wikipedia: Der Reset-Vektor für den 8086-Prozessor befindet sich unter der Adresse FFFF0h Wo wird der Rücksetzvektor gespeichert?
Die Adresse des Rücksetzvektors - in diesem Fall FFFF0h - einer CPU ist hardwaremäßig festgelegt. Es ist Teil der Spezifikation der CPU. Die CPU geht zu dieser Adresse, holt die Adresse, die sie dort findet, springt zu dieser -Adresse und beginnt mit der Ausführung. Es ist eine Art Doppelumleitung mit einem festen ersten Schritt (die CPU geht an FFFF0h, was höchstwahrscheinlich in einem ROM irgendeiner Art ist) und ein zweiter Schritt, der von der Maschine abhängt. In einem PC zeigt der Vektor auf einen frühen Initialisierungscode im BIOS, der den Startvorgang startet, aber im Allgemeinen könnte im Prinzip alles sein, was hardwaremäßig in diese Adresse gemappt werden kann, aber 99,9% der Zeit ist es eine Art von ROM (PROM, EPROM, EEPROM, etc.).
Nehmen Sie beispielsweise an, dass die Entwurfsspezifikationen für eine CPU mit einem 32-Bit-Adressraum so sind, dass der Vektor für den Kaltstart 0xffff4, der Rücksetzvektor 0xffff0 und die untere 1MiB ( 0x00000 bis 0xfffff) ist für den ROM-Boot-Code reserviert. Angenommen, Sie kaufen ein Board mit einem Socket für ein 1MiB ROM, das diesem Adressraum zugeordnet ist.
Dann schreibst du ein ROM-BIOS für diese Maschine, das etwa ein halbes Megabyte ist, und das Ergebnis, dass du mit deinem Compiler und Assembler herumhantierst, ist, dass du am Ende eine Objektcodedatei hast, die den allerersten Code enthält Sie möchten beim Einschalten 0x1230 Bytes in die Datei versetzen, wo Sie ein kleines ultra-basisches Setup ausführen, und dann zum Offset 0x3210 in der Datei springen, wo der Code ausreicht, um von einem Warmstart oder Reset aus zu starten. In diesem Fall würden Sie Ihre Objektcodedatei auf 1MiB auffüllen, sicherstellen, dass der Wert 0x00003210 bei Offset 0x000ffff0 ist und der Wert 0x00001230 bei Offset 0x000ffff4 ist.
Sie brennen die Datei auf ein kompatibles ROM ab der Adresse 0x0, so dass die Dateioffsets direkt in Adressen im Bereich 0x00000000 bis 0x000fffff übersetzt werden. Wenn das Gerät eingeschaltet wird, geht es sofort zu Adresse 0x000ffff4, findet dort den Wert 0x00001230, lädt diesen -Wert in den Befehlszeiger (oder Programmzähler, wie immer Sie es nennen wollen) und beginnt mit der Ausführung bei Adresse 0x00001230, wo Ihr Cold-Boot-Code ist.
Die CPU weiß, ob sie zurückgesetzt oder komplett aus- und wieder eingeschaltet wurde. Wenn die CPU zurückgesetzt wird (z. B. durch Dreifachfehler), dann geht sie, statt zur Adresse 0x000ffff4 zu gehen, zu ihrem Rücksetzvektor bei 0x000ffff0, lädt den Wert 0x00003210 und beginnt mit der Ausführung das . Dies ist im Wesentlichen, wie ein PC den POST überspringen kann, wenn er neu gestartet wird, aber nicht, wenn er aus- und wieder eingeschaltet wird. Es hat verschiedene Vektoren, je nachdem, ob es "kalt" oder "warm" ist.
In der Realität führen moderne CPUs höchstwahrscheinlich eine Reihe von Mikrocodes intern aus, bevor sie sich den Adress- und Datenbussen nähern, um die Reset- oder Boot-Vektoren zu holen. Dieser Mikrocode wird höchstwahrscheinlich auf die CPU hochgeladen werden können, aber das ändert nichts an der Grundidee auf der Architekturebene, und das "Vektorisieren" ist eine sehr, sehr alte Praxis, die sich aus der Allgegenwärtigkeit (auf nicht-vektorisierten CPUs) ergibt ) der Reset-Adresse, die Anweisungen enthält, die äquivalent zu "Sprung zur Adresse 0x01230" sind, wobei effektiv das "Vektorisieren" manuell durchgeführt wird.
Tags und Links x86 addressing