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.

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

Links

Meine Werkzeuge
In anderen Sprachen