Interrupt Vector Table

Aus Lowlevel
(Weitergeleitet von IVT)
Wechseln zu:Navigation, Suche

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.

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):

<asm> 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 </asm>

Ein NASM Macro

Jetzt ein macro für NASM: <asm> %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 </asm> Das erste Argument muss dann die IRQ-Nummer sein, das zweite ein Label von dem Handler. Das kann dann so benutzt werden: <asm>

... 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 Hinweistext geschreiben werden o.ä. ...

iret </asm>

Links