| Zeile 124: | Zeile 124: | ||
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 Länge der GDT 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 Länge der GDT 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 | + | <c>static uint64_t gdt[GDT_ENTRIES]; |
// ... | // ... | ||
struct { | struct { | ||
| − | + | uint16_t length; | |
void* pointer; | void* pointer; | ||
} __attribute__((packed)) gdtp = { | } __attribute__((packed)) gdtp = { | ||
| Zeile 140: | Zeile 140: | ||
<asm> | <asm> | ||
| − | mov $0x10, % | + | mov $0x10, %ax |
| − | mov % | + | mov %ax, %ds |
| − | mov % | + | mov %ax, %es |
| − | mov % | + | mov %ax, %ss |
ljmp $0x8, $.1 | ljmp $0x8, $.1 | ||
.1: | .1: | ||