Global Descriptor Table — Änderungen 6438 → 6672

Zeile 138: Zeile 138:
  
 
== Laden der GDT ==
 
== Laden der GDT ==
−
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 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];
 
<c>static uint64_t gdt[GDT_ENTRIES];
Zeile 145: Zeile 145:
  
 
struct {
 
struct {
−
     uint16_t length;
+
     uint16_t limit;
 
     void* pointer;
 
     void* pointer;
 
} __attribute__((packed)) gdtp = {
 
} __attribute__((packed)) gdtp = {
−
     .length = GDT_ENTRIES * 8,
+
     .limit = GDT_ENTRIES * 8 - 1,
 
     .pointer = gdt,
 
     .pointer = gdt,
 
};
 
};