Alle Deskriptoren eines Programmes (beispielsweise Deskriptoren für Code- oder Datensegmente) werden in Tabellen verwaltet. Das hat zur Folge, daß die oben genannten Deskriptoren nicht an jeder beliebigen Position im Speicher stehen dürfen, sondern nur innerhalb einer Deskriptortabelle (Vgl. Abb. 2.7)
Abb. 2.7: Deskriptortabelle
Da der Platz für die Auswahl eines Deskriptors innerhalb eines Selektors auf 13 Bit beschränkt ist (Vgl. auch nächster Punkt: Selektor), kann eine Deskriptortabelle nur insgesamt 8192 Deskriptoren (213=8192) aufnehmen. Ein weiterer Grund besteht darin, daß die maximale Größe einer Deskriptortabelle auf 64 KB eingeschränkt ist (aus 8 Byte pro Deskriptor und einer 64 KB großen Deskriptortabelle folgt: 64 KB (65536) / 8 = 8192 mögliche, 8 Byte lange Einträge).
Weiterhin unterscheidet der Prozessor zwischen mindestens zwei verschiedenen Deskriptortabellen. Zum einen existiert die sogenannte "Global Deskriptor Table" (kurz: GDT). Sie steht allen Prozessen (oder Programmen) gleichermaßen zur Verfügung (daher auch der Name: "Global").
Auch die andere Deskriptortabelle, die "Interrupt Deskriptor Table" (kurz: IDT) ist für alle laufenden Programme verfügbar. Sie enthält spezielle Deskriptoren (sogenannte "Gates"), deren Aufgabe es ist, Adressen für Interrupt-Routinen im Speicher festzuhalten (dazu zählen z.B. Hard- und Softwareinterrupts). Ein Betriebssystem wird durch die IDT in die Lage versetzt, für alle auftretenden Exceptions eine entsprechende Routine bereitzustellen. Die IDT ist mit der Interrupt-Vektor Tabelle im Realmode vergleichbar.
Neben den beiden oben genannten Deskriptortabellen besteht weiterhin die Möglichkeit, jedem laufenden Task seine eigene Deskriptortabelle zur Verfügung zu stellen. Diese Tabelle wird als "Local Descriptor Table" (kurz: LDT) bezeichnet und dient der zusätzlichen Kapselung der einzelnen Tasks.
Um die Startadresse der einzelnen Tabellen im Arbeitsspeicher festzulegen, existieren ab der 80286 CPU drei neue, 40 Bit breite Register. Abb. 2.8 zeigt diese Register im 80386 Format, wo sie von 40 auf 48 Bit erweitert wurden.
Abb. 2.8: Deskriptortabellen-Register
Die in Abb. 2.8 beschriebenen Register können über die folgenden neuen Maschinenbefehle direkt angesprochen werden (mem steht für eine Adresse):
GDTSTRUC STRUC Limit dw ? BaseAdr dd ? GDTSTRUC ENDS
und lädt die Basisadresse und das Limit der Globalen Deskriptortabelle mit den angegebenen Werten neu.
SGDT mem speichert die akt. Werte des Registers GDTR unter der angegebenen Adresse im GDTSTRUC-Format.
LIDT mem erwartet einen Zeiger (mem) auf eine GDTSTRUC und lädt die Basisadresse und das Limit der Interrupt-Deskriptortabelle mit den angegebenen Werten neu.
SIDT mem speichert die akt. Werte des Registers IDTR unter der angegebenen Adresse im GDTSTRUC-Format.
LLDT mem/reg lädt das LDTR Register mit dem angegeben Selektor neu.
SLDT mem/reg speichert den akt. Inhalt des IDTR-Registers im angegebenen Register oder unter der angegebenen Adresse.
Bei der folgenden Speicherstruktur soll es sich um 3 Deskriptoren einer Globalen Deskriptortabelle handeln. Die Adresse, sowie das Limit der Tabelle soll im Register für die Globale Deskriptortabelle (GDTR) gespeichert werden. deskriptor_0 db 8 dup (?) deskriptor_1 db 8 dup (?) deskriptor_2 db 8 dup (?) Die Adresse und die Größe dieser Deskriptortabelle soll gesetzt werden, daher wird die folgende Struktur benötigt: GDTSTRUC STRUC Limit dw ? BaseAdr dd ? GDTSTRUC ENDS gdt_adr GDTSTRUC ? ; Setzen der Größe (Limit) der Globalen Deskriptortabelle; ; da wir drei Deskriptoren vereinbart haben, muß eine GDT-Größe von 3*8 ; Byte oder größer gesetzt werden mov [gdt_adr.Limit],3 * 8 ; Setzen der Basisadresse: ; Die folgende Routine geht davon aus, das wir uns noch im Realmode ; befinden und 32-Bit Register zur Verfügung stehen (80386)! ; Sie wandelt eine Segment:Offsetadresse in eine 32 Bit lineare Adresse ; im Register eax um. xor eax,eax mov ax,seg deskriptor_0 shl eax,4 add ax,offset deskriptor_0 mov [gdt_adr.BaseAdr],eax ; GDT Register neu setzten lgdt gdt_adr |