Dockers DEV Site


Updates · Faq · Home 

Deskriptortabellen

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)

Deskriptortabelle
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.

Deskriptortabellen-Register
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):

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

Index
weiter >>
<< zurück ||

Last change 27/11/2022 by Docker Rocker.
This page uses no cookies, no tracking - just HTML.
Author: "Docker Rocker" ~ 2022 · [Public Git]