Interrupt Vector Table

Aus Lowlevel
Version vom 22. Juli 2007, 20:55 Uhr von Bluecode (Diskussion | Beiträge) (steht doch im Kommentar dran, warum hier cli/sti nicht notwendig ist ;))
Wechseln zu:Navigation,

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            |
       +---------------+---------------+

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ählt 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 mov es, ax

cli  ; IRQs deaktivieren
Dies ist nur notwendig, wenn man einen Eintrag für einen IRQ verändert

mov WORD [es:0], __int0x00  ; Offset: Die Adresse unserer Interrupt Service Routine mov WORD [es:0+2], cs  ; Segment: Wir geben hier das momentane Codesegment an

sti  ; IRQs aktivieren

</asm>

Links