BIOS-Interrupts vs Hardware-Interrupts
Auf einem x86-Chip, der im Real-Modus ausgeführt wird, werden Interrupts mithilfe der IVT (Interrupt Vector Table) aufgelöst. Hierbei handelt es sich um ein Array unter der Adresse 0000h: 0000h, das aus 256 Einträgen und 32-Bit-Adressen (Segment + Offset) besteht Zeigen Sie auf den Interrupt-Handler-Code.
Diese Seite (zusammen mit vielen anderen) listet auf, dass der erste benutzerdefinierbare Interrupt-Handler 20 Stunden ist. Die ersten 32 Handler sind reserviert und werden für verschiedene Zwecke verwendet. Beispielsweise wird Interrupt 10h für x87-FPU-Ausnahmen verwendet, während Interrupt 13h für SIMD-FP-Ausnahmen verwendet wird. Diese Seite (zusammen mit vielen anderen, einschließlich der Interrupt-Liste von Ralf Brown) zeigt jedoch, dass die Interrupts 10h und 13h vom BIOS für Video- bzw. Festplattendienste definiert werden. Fehlt mir etwas oder werden diese Interrupt-Adressen gleichzeitig für Hardware- und Software-Interrupts verwendet?
Antworten
Während die Dokumentation für die 8088-CPU, die im ursprünglichen IBM-PC verwendet wurde, die ersten 32 Interrupt-Vektoren für CPU-Ausnahmen reservierte, verwendete der 8088 nur einige davon. Als IBM den PC entwarf, ignorierten sie dies und wiesen die reservierten, aber nicht verwendeten Vektoren für ihre eigenen Zwecke zu.
Der ursprüngliche 8088 definierte nur Ausnahmen für die ersten 5 Interruptvektoren für Divide Error, Single Step, NMI, Breakpoint bzw. Overflow. Die Interrupt-Vektoren 5 bis 31 wurden im Benutzerhandbuch für die 8086-Familie von Intel als reserviert markiert:
Trotzdem hat IBM beschlossen, dass das BIOS den Interrupt-Controller so konfiguriert, dass Hardware-Interrupts ab Interrupt-Vektor 8 bereitgestellt werden. Da der ursprüngliche IBM PC nur 8 Hardware-Interrupts unterstützte, wurden die Vektoren 8 bis 15 für Hardware-Interrupts verwendet. IBM begann dann, BIOS-Services ab Vektor 16 (10h) zuzuweisen, die mithilfe von Software-Interrupts aufgerufen werden sollen. Zusätzlich wurde Vektor 5 verwendet, um eine Druckbildschirmfunktion zu implementieren. Reservierte Vektoren 6 und 7 wurden nicht verwendet.
Leider erwies sich dies als Fehler von IBM, als Intel beim Entwurf des 80286 zusätzliche CPU-Ausnahmen im reservierten Bereich definierte, die bis zum Vektor 13 (0Dh) reichten. Dies bedeutete, dass der IBM PC / AT, der die 80286-CPU verwendete, aber auch abwärtskompatibel mit dem ursprünglichen 8088-basierten IBM PC sein musste, Interruptvektoren mit zwei verschiedenen Zwecken hatte, einen von der CPU und einen vom BIOS definierten.
Insbesondere BOUNDerwies es sich als ziemlich störend , sowohl den Druckbildschirm als auch die Verstoßausnahme unter Verwendung von Vektor 5 zu haben. Theoretisch hätte dies kein Problem sein sollen, da jedes Programm, das die neue BOUNDAnweisung verwendet, einen eigenen Interrupt-Handler installieren müsste, der zwischen den beiden Quellen unterscheiden könnte. In der Praxis wurde die BOUNDAnweisung jedoch unbeabsichtigt von abgestürzten Programmen ausgeführt, und der Standard-BIOS-Handler blieb dann in einer Endlosschleife des Druckens des Bildschirms stecken.
Die anderen widersprüchlichen Verwendungen für die Vektoren waren nicht so problematisch, da die Ausnahmen 10 bis 13 normalerweise nur im geschützten Modus generiert würden. Ein Betriebssystem im geschützten Modus musste nicht abwärtskompatibel sein und konnte das BIOS nicht verwenden. Daher konnte der Interrupt-Controller so konfiguriert werden, dass Hardware-Interrupts über Vektoren außerhalb des reservierten Bereichs übertragen werden.
Die restlichen CPU-Ausnahmen, die vom späteren Intel-Prozessor definiert wurden, wurden entweder normalerweise nicht durch Real-Mode-Code generiert, der abwärtskompatibel sein musste, oder durch Standard-BIOS-Handler behandelt, die die Quellen ordnungsgemäß unterscheiden konnten.
In der ursprünglichen PC / AT-Architektur wird das FPU-Ausnahmesignal, das direkt an einen dedizierten Eingangspin der Haupt-CPU angeschlossen werden sollte und als INT 10h angezeigt werden soll, durch Klebelogik an den zweiten IRQ-Controller umgeleitet, sodass es als IRQ angezeigt wird 13 (dh INT 75h) stattdessen. Die meisten anderen widersprüchlichen Vektoren sind so beschaffen, dass die hardwaredefinierten Vektoren nur im geschützten Modus und die BIOS-definierten Vektoren nur im realen Modus von Interesse sind, so dass normalerweise kein realer Konflikt auftritt. Grundsätzlich geht es bei IBM-Ingenieuren darum, Dinge anders zu machen, als von Intel-Ingenieuren beabsichtigt.