Interrupt Vector Table — Änderungen 2063 → 2064

Zeile 1: Zeile 1:
−
<!-- Dieser Artikel ist noch nicht besonders lang und auch nicht besonders hochwertig. Bitte auf Rechtschreibfehler korrigieren. Wahrscheinlich gibt es noch inhaltliche Fehler, diese bitte auch korrigieren.-->
+
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.<br>
 +
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:
  
−
Die Interrupt Vector Table (kurz IVT) ist besteht aus dem ersten Kilobyte des Arbeitsspeichers. Ihre Aufgabe besteht darin, die Adressen für die Interrupts bereitzustellen.<br />
+
Byte
−
Die IVT stellt für jeden Interrupt 2 Addressen zur Verfügung. Daraus folgt, dass genau 256 Interrupts in der IVT platz haben können. Die erste Addresse ist die, an die die CPU springen muss um den Interrupt auszuführen, also die Startaddresse des Interrupt Codes. Die zweite Addresse ist die, an die die CPU nach Ausführung des Interrupts zurückspringen soll.<br />
+
        +---------------+---------------+
−
Nach dem Start des Computers wird die IVT automatisch geschrieben. Die Addressen zeigen auf Funktionen, die das BIOS für diese Interrupts bereitstellt. Nach dem Start ist daher sinnvoll diese durch eigene zu ersetzen. Beispielsweiße will man bei einer "Division durch 0" ganz bestimmte Dinge tun. So ersetzt man die Addressen des Interrupts 0h durch eigene.
+
    0   |            Offset            |
−
So zum Beispiel:
+
        +---------------+---------------+
−
xor ax, ax
+
        +---------------+---------------+
−
mov es, ax
+
    2  |            Segment            |
−
cli; disable interrupt
+
        +---------------+---------------+
−
mov WORD [es:0x04*0x0h], __int0x00 ; Unsere Interrupt Routine
 
−
mov WORD [es:0x04*0x0h+2], __int0x00_back ; Rücksprungaddresse, man kann hier auch einfach das Register cs angeben
 
−
sti
 
  
 +
Die IVT belegt somit genau 256 * 4 = 1024 Byte.<br><br>
 +
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.<br>
 +
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):
  
−
== Quellen ==
+
<pre>
−
*http://lowlevel.brainsware.org/wiki/index.php/Ausgabe_2 - Ausgabe 2 des Lowlevel Magazins
+
xor ax, ax
−
*http://lowlevel.brainsware.org/wiki/index.php/Ausgabe_3 - Ausgabe 3 des Lowlevel Magazins
+
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
 +
</pre>
  
 
[[Category:Glossar]]
 
[[Category:Glossar]]