Interrupt Descriptor Table — Änderungen 4239 → 4601

Zeile 1: Zeile 1:
−
<b>IDT</b> steht für <b>I</b>nterrupt <b>D</b>escriptor <b>T</b>able. Sie wird verwendet um Interrupts [[ISR]]s zuzuordnen. Die Einträge heißen Interrupt Gates
+
<b>IDT</b> steht für <b>I</b>nterrupt <b>D</b>escriptor <b>T</b>able. Sie wird im [[Protected Mode]] des x86 verwendet, um [[Interrupts]] ihre [[ISR | Handler (ISRs)]] zuzuordnen. Die Einträge in der Tabelle heißen ''Interruptdeskriptoren''.
  
 
== Aufbau ==
 
== Aufbau ==
−
Die IDT kann maximal 256 Interruptgates beinhalten, da es nur 256 Interrupts gibt. Ein Interruptgate in der IDT ist 8 Byte groß und sieht folgendermaßen aus:
+
Die IDT kann maximal 256 Interruptdeskriptoren beinhalten, da es nur 256 Interrupts gibt. Ein Interruptdeskriptor in der IDT ist 8 Byte groß und sieht folgendermaßen aus:
  
−
{| border="1" cellpadding="2"
+
{| {{Prettytable}}
 
! 63-48        || 47      || 46-45 || 44 || 43 || 42-40      || 39-32 || 31-16    || 15-0
 
! 63-48        || 47      || 46-45 || 44 || 43 || 42-40      || 39-32 || 31-16    || 15-0
 
|-
 
|-
−
| Offset 31-16 || Present || DPL  || 0  || D  || Type (110b) || 0    || Selektor || Offset 0-15
+
| Offset 31-16 || Present || DPL  || 0  || D  || Typ (110b) || 0    || Selektor || Offset 0-15
 
|}
 
|}
 +
 +
Die IDT besteht aus einem Speicherbereich, in dem direkt aufeinanderfolgend die bis zu 256 Interruptdeskriptoren abgelegt sind (d.h. in Hochsprachen aus einem gepackten Array von 256 Deskriptoren). Für die Behandlung des Interrupt 0 wird der erste Eintrag der Tabelle benutzt, für Interrupt 1 der zweite usw.
  
 
=== Offset ===
 
=== Offset ===
−
Gibt das Offset des ISR innerhalb des Segments an.
+
Gibt das Offset des ISR innerhalb des Segments an. Wenn der entsprechende Interrupt auftritt, wird eip auf diesen Wert gesetzt.
  
 
=== Present ===
 
=== Present ===
−
Gibt an ob dieser Eintrag benutzt wird.
+
Gibt an, ob dieser Eintrag benutzt wird.
  
 
=== DPL ===
 
=== DPL ===
−
Gibt das Descriptor Privilege Level an, das man brauch um diesen Interrupt aufrufen zu dürfen.
+
Gibt das Descriptor Privilege Level an, das man braucht um diesen Interrupt aufrufen zu dürfen.
  
 
=== D ===
 
=== D ===
−
Gibt an ob es sich um ein 32bit (1b) oder um ein 16bit (0b) Segment handelt.
+
Gibt an, ob es sich um ein 32bit- (1b) oder um ein 16bit-Segment (0b) handelt.
  
−
=== Type ===
+
=== Typ ===
−
Sollte bei einem Interruptgate immer 110b sein.
+
{| {{Prettytable}}
 +
! Wert  || Bedeutung
 +
|-
 +
| 110b || '''Interrupt Gate''' - Beim Springen in den Interrupthandler wird eflags.if = 0 gesetzt, d.h. Hardwareinterrupts werden deaktiviert, solange der Handler läuft
 +
|-
 +
| 111b || '''Trap Gate''' - Beim Sprung in den Interrupthandler bleiben Hardwareinerrupts aktiviert
 +
|-
 +
| 101b || '''Task Gate''' - Beim Auftreten des Hardwareinterrupts wird ein Hardware-Taskswitch durchgeführt. Der Selektor zeigt in diesem Fall nicht auf ein Codesegment, sondern auf ein [[TSS]]. Das Offset bleibt unbenutzt.
 +
|}
  
 
=== Selektor ===
 
=== Selektor ===
−
Gibt den Selektor an.
+
Gibt den Selektor des Codesegments an, in das beim Auftreten des Interrupts gewechselt werden soll. Im Allgemeinen ist das das Kernel-Codesegment (Ring 0).
  
 
== Laden einer IDT ==
 
== Laden einer IDT ==
−
Zum Laden einer IDT muss die Instruktion ''lidt &lt;p&gt;'' mit der Adresse eines Selektors geladen werden. Dieser Selektor sind folgendermaßen aus:
+
Zum Laden einer IDT muss die Instruktion ''lidt &lt;p&gt;'' mit der Adresse einer 6 Bytes großen Datenstruktur aufgerufen werden. Die Datenstruktur sieht folgendermaßen aus:
  
−
{| border="1" cellpadding="2"
+
{| {{Prettytable}}
 
! 47-32          || 31-0
 
! 47-32          || 31-0
 
|-
 
|-
−
| Größe der IDT  || Adresse der IDT
+
| Größe der IDT  || Anfangsadresse der IDT
 
|}
 
|}
  
−
== Weitere Informationen ==
+
Damit kann eine IDT beispielsweise mit Code wie dem folgenden geladen werden:
−
[http://www.osdever.net/bkerndev/Docs/idt.htm Bran's Kernel-Development Tutorial ... IDT]
+
 
 +
<c>static long long unsigned int idt[IDT_ENTRIES];
 +
 +
// ...
 +
 +
struct {
 +
    unsigned short int length;
 +
    void* pointer;
 +
} __attribute__((packed)) idtp = {
 +
    .length = IDT_ENTRIES * 8,
 +
    .pointer = idt,
 +
};
 +
asm volatile("lidt %0" : : "m" (idtp));</c>
 +
 
 +
== Siehe auch ==
 +
* [[Interrupt]]
 +
* [[Exception]]
 +
* [[Programmable Interrupt Controller]]
 +
* [http://www.osdever.net/bkerndev/Docs/idt.htm Bran's Kernel-Development Tutorial ... IDT]
  
 
[[Category:Glossar]]
 
[[Category:Glossar]]
 +
[[Kategorie:x86]]