Neben den Registern für die globale und lokale Deskriptortabelle sowie das Task-Register besitzt der 80286 noch ein neues Register für die Interrupt-Deskriptortabelle (IDT). Im Real Mode waren die 1024 (1k) niederwertigen Byte des Adreßraums für die 256 Einträge (entsprechend den 256 Interrupts des i386) der Interrupt-Vektortabelle reserviert. Jeder Eintrag enthält im Format Segment:Offset die Einsprungadresse des zugehörigen Interrupt-Handlers.
Auch im Protected Mode stehen 256 Interrupts von 0 bis 255 zur Verfügung. Die Interrupt-Handler werden jedoch nicht mehr über ein Doppelwort mit dem Format Segment:Offset angesprochen, sondern über Gates. Als Einträge in der IDT sind nur Task-, Interrupt- und Trap-Gates zulässig. Damit ist jeder Eintrag statt vier nunmehr acht Bytes lang. Durch den Eintrag Limit im IDTR kann die Größe der Interrupt-Deskriptortabelle jedoch den tatsächlichen Erfordernissen angepaßt werden. Benötigt ein System beispielsweise nur die Interrupts 0 bis 63, so genügt eine IDT mit 64 Einträgen zu acht Bytes, d.h. insgesamt 512 Bytes. Wird ein Interrupt ausgelöst, für den kein Eintrag in der IDT mehr existiert (im angeführten Fall z.B. ein INT 68), so tritt der i386 in den Shutdown-Modus ein. Da im IDTR neben dem Limit auch die Basisadresse der IDT angegeben wird, kann sich die Tabelle irgendwo im Speicher befinden.
Bevor der i386 in den Protected Mode umgeschalten wird, muß das im Real Mode laufende Initialisierungsprogramm neben der GDT auch die IDT aufbauen und deren Basisadresse und Limit in das IDTR laden. Geschieht das nicht, so hängt sich der Prozessor mit ziemlicher Sicherheit auf, bevor die IDT im Protected Mode erstellt werden kann, da jede Art von Exception oder Interrupt entweder ins Nirwana weist oder eine neue Fehler-Exception auslöst, die nicht behandelt werden kann. Beim Einschalten oder einem Prozessor-Reset lädt der i386 von sich aus das IDTR mit dem Wert 000000h für die Basisadresse und 03ffh für das Limit. Diese Werte sind konsistent mit dem reservierten Bereich für die Interrupt-Vektortabelle im Real Mode.
Die Interrupt-, Trap- und Task-Gates weisen denselben Aufbau wie das Call-Gate auf, nur besitzt der Eintrag DWord-Count keine Bedeutung. Die Interrupt- und Trap-Gates definieren in gleicher Weise wie das Call-Gate den Einsprungpunkt über die Einträge Offset und Segmentselektor. Der Segmentselektor weist wie bei einem Call-Gate auf den Segmentdeskriptor in der LDT oder GDT, der die Basisadresse des betreffenden Segments enthält. Der Unterschied zwischen Interrupt- und Trap-Gate besteht darin, daß ein Interrupt-Aufruf über ein Interrupt-Gate die Flags IE (Interrupt Enable) und T (Trap) löscht, das Trap-Gate hingegen nicht.
Die Besonderheiten, die gelten, wenn der Prozessor bei einem Interrupt oder einem CALL- bzw. JMP-Befehl auf ein Task-Gate trifft, werden im folgenden Abschnitt erläutert.
|