Dockers DEV Site
Deskriptorbeispiel
Es soll ein Deskriptor angelegt werden, der ein Segment mit den
folgenden Eigenschaften beschreibt:
- Segmentstart an der physischen Adresse 01F2E3Dh
- eine Länge von 2 MB (2097152d=200000h)
- soll Datensegment sein (lesbar und beschreibar)
- einen DPL von 2
- aufgrund der Segmentlänge ein 80386 Segment ist
Assemblerquelltext:
mein_deskriptor:
dw 0200h ; Segmentgröße, Bit 0..15
dw 2E3Dh ; Segmentbasisadresse, Bit 0..15
db 1Fh ; Segmentbasisadresse, Bit 16..23
db 11010010b ; Zugriffsberechtigung und Typ
db 11000000b ; Zusatzinformation und Segmentgröße, Bit 16..19
db 0 ; Segmentbasisadresse, Bit 24..31
Erläuterungen:
- Das erste Wort des Deskriptors enthält die Bit 0..15
der Segmentgröße. Da die Segmentgröße in
diesem Beispiel 2 MB betragen soll und damit größer
als eine 20 Bit Adresse ist (220=1 MB), muß die Einheit
der Segmentgröße auf 4 KB (4096 Byte) erhöht werden
(siehe auch Byte 7).
Die Forderung nach einem 2 MB großen Segment hat drei Konsequenzen:
- Der Deskriptor muß 80386 kompatibel sein (Setzen des
B-Bit im Byte 7, siehe dort).
- Das Granularity-Bit muß gesetzt werden (G-Bit in Byte
7, siehe dort), um die Segmentgrößeneinheit auf 4096
Byte zu erhöhen.
- Die Segmentlänge muß in ein Format mit der Einheit
4 KB umgewandelt werden (ganzahlige Division durch 4096). Vergleichen
Sie mit obigen Beispiel: Segmentlänge 2 MB=2097152d / 4096d=512d=200h.
Das zweite Wort enthält die unteren 16 Bit der 32-Bit
breiten Segmentbasisadresse (im obigen Beispiel also das LOW-Wort
der 32 Bit Adresse 001F 2E3Dh, also 2E3Dh)
- Das dritte Wort wurde in zwei Byte aufgeteilt. Das niederwertige
Byte enthält die Bit 16..23 der Segmentbasisadresse (im obigen
Beispiel also 1Fh).
Das höherwertige Byte enthält die Zugriffsberechtigungen
und den Segmentyp in binärer Form. Vergleichen Sie mit dem
obigen Beispiel: 1 10 1 001 0b:
- Das höherwertigste Bit ist gesetzt, es kennzeichnet das
Segment als momentan im Speicher verfügbar.
- Die nächsten zwei Bit stellen die Privilegstufe des Segmentes
dar (10b = Privilegstufe 2).
- Da das folgende Bit (das Segment-Bit) gesetzt ist, handelt
es sich bei dem Deskriptor um einen Speichersegmentdeskriptor.
- Das TYPE-Feld (die nächsten drei Bit) enthalten die Kombination
001b, sie stehen für den Segmenttyp 1 (Datensegment, lesen
und schreiben erlaubt).
- Das Access-Bit wird vom Prozessor gesetzt, sollte jedoch auf den
Wert 0 initialisiert werden.
- Auch das vierte Wort wurde in zwei Byte aufgeteilt.
Das höherwertige Byte (das letzte des Deskriptors, Byte 8)
enthält die Bit 24..31 der Segmentbasisadresse, in unserem
Fall (001F 2E3Dh) also 0.
Das niederwertige Byte enthält in den unteren 4 Bit die Bit
16..19 der Segmentlänge (im Beispiel 0000b). In den oberen
4 Bit werden das Bit für die Auflösung (Granularity)
und das B-Bit auf 1 gesetzt, um die Segmentgrößeneinheit
auf 4096 Byte zu erhöhen und um einen 80386 Deskriptor anzuzeigen.
Die beiden letzten Bit werden auf 0 gesetzt.
Last change 27/11/2022 by Docker Rocker.
This page uses no cookies, no tracking - just HTML.
Author: "Docker Rocker" ~ 2022 · [Public Git]