Diskussion:Global Descriptor Table

Aus Lowlevel
Wechseln zu:Navigation,

Ich denke dass die GDT-Tabelle jetzt von den Bytes her richtig ist. Da man ja am Ende auf 8 Bytes kommt. Aber die Bit-Nummerierung ist etwas kaputt. Kann man da nicht besser die Grafik aus dem Magazin nehmen?

Beispielcode falsch?

Ich finde die Grafik ziemlich ansprechend: http://wiki.osdev.org/GDT

Was mir noch aufgefallen ist: Ist der Beispielcode richtig? das RW-Bit ist dort mit der Bitmask 0x40 (also Bit 7) verzeichnet - in der Tabelle aber mit Bit 1.

Ich lasse da jetzt aber mal die Finger weg, weil ich nicht wirklich Ahnung davon habe. Garfield

Also ich schätze mal die Bitnummerierungen in der Tabelle sind falsch. Entweder du schaust in die Magazine, auf OSDev.org oder in ein anderes OS. Bei letzteren kann man zumindestens davon ausgehen, dass es stimmt, da es läuft.Jgraef

Selektoren

Müsste man einen Selektor für Usersegment nicht mit 0x2b angeben, wenn es der 5. eintrag sein soll? Null-Deskriptor (0) + Kernel Codesegment (1) + Kernel Datensegment (2) + User Codesegment (3) + User Datensegment (4) + task state segment(5) hat also Index 5.
und 0x23 = 00100 011 (00100 = 4 müsste aber 5 sein 00101) von daher:
0000 0011 |
0010 1000 =
0010 1011 = 0x2b --Sebi2020 20:27, 9. Jan. 2010 (CET)

Soweit ich das nachvollziehen kann, ja, aber worauf beziehst du dich jetzt genau? --XanClic 21:28, 9. Jan. 2010 (CET)
Auf den Abschnitt Selektoren im GDT Artikel: "Um also nach ds das Segment zu laden, das durch den fünften GDT-Eintrag beschrieben wird, und zwar als Userspace-Segment (Ring 3), könnte man folgenden Code verwenden:
<asm>mov $0x23 %ax mov %ax, %ds</asm>
Müsste es nicht demzufolge dann 0x2b heißen? 0x23 Würde den 4 Eintrag in der GDT laden, und das wäre denn, wenn sie so eingerichtet ist wie vorgeschlagen, das User-Datensegment. --Sebi2020 22:12, 9. Jan. 2010 (CET)
Der fünfte Eintrag hat den Index 4, weil bei Null zu zählen angefangen wird. Passt also alles. --Taljeth 23:39, 9. Jan. 2010 (CET)

Struktur eines Eintrages

Diese Tabelle definiert nicht eindeutig, ob sich LIMIT[19:16] in den oberen 4 Bits (von der Tabelle suggeriert), oder in den unteren 4 Bits (korrekt) von Byte 6 befindet. Ich bin dafür horizontale Tabellen für Bitfelder (siehe z.B. CGA, Control Register, ...) zu verwenden. --Jidder 20:43, 25. Sep. 2010 (CEST)

I286

Bei der I 268 dürfte doch eigentlich nur 24 Bit Base Addressen verwenden. Wie geht das den, wo doch hier alle Descriptoren 32 Bit Base Addressen enthalten. --Sannaj 09:21, 25. Nov. 2011 (CET)

Beim 286 werden einfach die Bits 31..24 von der Basis (also Byte 7 im Descriptor) ignoriert, ebenso wie alle Limit-Bits oberhalb von Bit 15 und das Granularity-Flag. Es gibt auf dem 286 wimre sogar einen korrekten Überlauf in die unteren Bytes wenn so ein Segment die 16MB-Grenze überschreitet, bei 386 und aufwärts gibt es das nicht an der 16MB-Grenze sondern nur an der 4GB-Grenze. Das mit dem ignorieren klappt aber nur bei den Descriptoren für die normalen Datensegmente, einige der System-Descriptoren gibt es hingegen doppelt (mit unterschiedlichen Typen), einmal für 16Bit-PM und einmal für 32Bit-PM (bei 386 und aufwärts funktionieren natürlich beide). --Erik.vikinger 10:04, 25. Nov. 2011 (CET)