Interrupt Vector Table
Aus Lowlevel
Die Interrupt Vector Table (kurz IVT) befindet sich im ersten Kilobyte des Arbeitsspeichers (siehe Speicherbereiche). Ihre Aufgabe besteht darin, die Adresse der Interrupt Service Routine für jeden Interrupt bereitzustellen. Die IVT hat nur im Real Mode Bedeutung und wird im Protected Mode durch die IDT abgelöst.
Inhaltsverzeichnis |
Aufbau
Insgesamt stehen 256 Interrupts zur Verfügung, deshalb muss die IVT auch 256 Einträge (einen für jeden Interrupt) haben. Ein Eintrag ist 4 Byte groß und enthält eine Realmodeadresse, die aus 2 Byte Segment und 2 Byte Offset besteht. Ein Eintrag sieht im Speicher folgendermaßen aus:
Byte
+---------------+---------------+
0 | Offset |
+---------------+---------------+
+---------------+---------------+
2 | Segment |
+---------------+---------------+
| Byte | |
|---|---|
| 0 | Offset |
| 2 | Segment |
Die IVT belegt somit genau 256 * 4 = 1024 Byte. Die genaue Verwendung dieser Einträge bei Auftreten eines Interrupts wird im Artikel Interrupt erklärt.
Während des Bootvorgangs
Nach dem Start des Computers wird die IVT automatisch vom BIOS erstellt, und die Adressen zeigen auf Funktionen, die entweder das BIOS einem Betriebssystem zur Verfügung stellt, oder die benötigt werden, um mit der Hardware zu kommunizieren.
Nach dem Bootvorgang kann es für ein Betriebssystem sinnvoll sein, einige Interrupts durch eigene Funktionen behandeln zu lassen. Dazu zählen vor allem die Exceptions.
Beispiel
Beispielsweise will man wahrscheinlich eine "Division durch 0" (Interrupt 0) anders als das BIOS behandeln (z.B. den momentanen Prozess beenden und zur Shell zurückkehren):
xor ax, ax mov es, ax ; IRQs deaktivieren: Dies ist nur notwendig, damit nicht während des Anpassens der IVT ein IRQ auftritt, welcher für den Fall, dass ; a) wir hier den Interruptvektor des IRQ verändern ; b) der IRQ-Handler seinerseits den hier veränderten Interruptvektor aufruft ; zu undefiniertem Verhalten führen kann. cli ; Offset: Die Adresse unserer Interrupt Service Routine mov WORD [es:0], __int0x00 ; Segment: Wir geben hier das momentane Codesegment an mov WORD [es:0+2], cs ; IRQs wieder aktivieren sti
Links
- Ralf Brown's Interrupt List (Download)
- Ralf Brown's Interrupt List (online anschaubar)

