x86-Programmierung und -Betriebsarten (Teil 3)

Interrupt-Vektoren

Jeder Interrupt-Vektor ist 4 Byte lang und gibt im Intel-Format die Adresse Segment:Offset des Interrupt-Handlers an, der den Interrupt bedient. Da ein Interrupt meist eine bestimmte Ursache hat, wie die Anforderung einer Betriebssystemfunktion, der Empfang eines Zeichens über die serielle Schnittstelle et cetera, behandelt der Interrupt-Handler diese Ursachen in geeigneter Weise. Er führt also beispielsweise die Betriebssystemfunktion aus oder nimmt das empfangene Zeichen entgegen. Durch Ersetzen des Handlers kann einem Interrupt auf einfache Weise eine andere Funktion zugeordnet werden.

Die Zuordnung von Interrupt und Interrupt-Vektor erfolgt auf einer Eins-zu-eins-Basis, das heißt, dem Interrupt 0 wird der Interrupt-Vektor 0 (an der Adresse 0000:0000), dem Interrupt 1 der Interrupt-Vektor 1 (an der Adresse 0000:0004) und so weiter zugeordnet. Damit muss nur die Nummer des Interrupt mit 4 multipliziert werden, und man erhält den Offset des Interrupt-Vektors im Segment 0000h. Der Prozessor führt genau diese Multiplikation aus, um aus der Interrupt-Nummer dessen Adresse zu ermitteln. Neben dem Bereich f000:fff0 bis f000:ffff für den Prozessor-RESET existiert damit ein zweiter für den Prozessor reservierter Adressbereich. Diese Adressbereiche stehen für Anwendungsprogramme nicht zur Verfügung. Ein Überschreiben der Interrupt-Vektortabelle mit ungültigen Werten hat katastrophale Folgen: Beim nächsten Interrupt stürzt der Rechner ab.