| Zeile 45: | Zeile 45: | ||
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: | 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 | + | <syntaxhighlight lang=asm>mov $0x23, %ax |
| − | mov %ax, %ds</ | + | mov %ax, %ds</syntaxhighlight> |
==Struktur== | ==Struktur== | ||
| Zeile 153: | Zeile 153: | ||
Nachdem der Kernel eine GDT im Speicher liegen hat, die er für seine Segmente verwenden möchte, muss er das Register GDTR ändern. Dieses Register enthält die Adresse und das sogenannte Limit der GDT – dies entspricht ihrer Länge minus ein Byte – und wird über den Befehl '''lgdt''' geladen. Da das Register 6 Bytes breit ist, kann dieser Befehl den neuen Wert nicht direkt als Operand entgegennehmen, sondern erwartet einen Pointer auf eine Speicherstelle, die diese 6 Bytes enthält: | Nachdem der Kernel eine GDT im Speicher liegen hat, die er für seine Segmente verwenden möchte, muss er das Register GDTR ändern. Dieses Register enthält die Adresse und das sogenannte Limit der GDT – dies entspricht ihrer Länge minus ein Byte – und wird über den Befehl '''lgdt''' geladen. Da das Register 6 Bytes breit ist, kann dieser Befehl den neuen Wert nicht direkt als Operand entgegennehmen, sondern erwartet einen Pointer auf eine Speicherstelle, die diese 6 Bytes enthält: | ||
| − | <c>static uint64_t gdt[GDT_ENTRIES]; | + | <syntaxhighlight lang=c> |
| + | static uint64_t gdt[GDT_ENTRIES]; | ||
// ... | // ... | ||
| Zeile 164: | Zeile 165: | ||
.pointer = gdt, | .pointer = gdt, | ||
}; | }; | ||
| − | asm volatile("lgdt %0" : : "m" (gdtp));</ | + | asm volatile("lgdt %0" : : "m" (gdtp)); |
| + | </syntaxhighlight> | ||
Dadurch wird allerdings nur der Verweis auf die Tabelle geändert, tatsächliche Auswirkungen hat die Änderung noch nicht. Auf die Tabelle wird nur zugegriffen, wenn ein Segmentregister neu geladen wird. Daher müssen jetzt noch alle Segmentregister neu geladen werden: | Dadurch wird allerdings nur der Verweis auf die Tabelle geändert, tatsächliche Auswirkungen hat die Änderung noch nicht. Auf die Tabelle wird nur zugegriffen, wenn ein Segmentregister neu geladen wird. Daher müssen jetzt noch alle Segmentregister neu geladen werden: | ||
| − | <asm> | + | <syntaxhighlight lang=asm> |
mov $0x10, %ax | mov $0x10, %ax | ||
mov %ax, %ds | mov %ax, %ds | ||
| Zeile 177: | Zeile 179: | ||
ljmp $0x8, $.1 | ljmp $0x8, $.1 | ||
.1: | .1: | ||
| − | </ | + | </syntaxhighlight> |
== Web-Links== | == Web-Links== | ||