Die '''Interrupt Vector Table''' (kurz '''IVT''') befindet sich im ersten Kilobyte des Arbeitsspeichers (siehe [[Speicherbereiche]]). Ihre Aufgabe besteht darin, die Adresse der [[ISR | 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.
== 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 |
+---------------+---------------+
{| {{prettytable}}
! 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 ;ax = 0x00 (mov ax, 0x00 wäre ein Byte mehr)
mov es, ax ;es = ax (also 0)
; 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
=== Ein NASM Macro ===
Jetzt ein macro für NASM:
%macro IVT.Handlerwahl 2
push ax
push es
xor ax, ax
mov es, ax
cli
mov WORD [es:%1*4], %2
mov WORD [es:%1*4+2], cs
sti
pop es
pop ex
%endmacro
Das erste Argument muss dann die IRQ-Nummer sein, das zweite ein Label von dem Handler. Das kann dann so benutzt werden:
; ... hier ist der Startcode ...
IVT.Handlerwahl 0x00, IRQ_0x00
; ... hier kommt dann noch irgendein Code ...
IRQ_0x00: ;Handler für IRQ 0
; ... hier kann ein Hinewistext geschreiben werden o.ä. ...
iret
== Links ==
* [http://www.cs.cmu.edu/afs/cs.cmu.edu/user/ralf/pub/WWW/files.html Ralf Brown's Interrupt List] (Download)
* [http://www.ctyme.com/intr/int.htm Ralf Brown's Interrupt List] (online anschaubar)
[[Category:Glossar]]