| Zeile 128: | Zeile 128: | ||
Bevor wir überlegen, welche Segmente wir in unserer GDT definieren wollen, brauchen wir zunächst eine Funktion, um GDT-Einträge in halbwegs lesbarer Form anzulegen. Angenommen die GDT wird als Array von 64-Bit-Integern dargestellt, könnte das wie folgt aussehen. Der Code macht nichts anderes, als die Parameter an die richtige Position gemäß den oben angegebenen Tabellen zu schieben: | Bevor wir überlegen, welche Segmente wir in unserer GDT definieren wollen, brauchen wir zunächst eine Funktion, um GDT-Einträge in halbwegs lesbarer Form anzulegen. Angenommen die GDT wird als Array von 64-Bit-Integern dargestellt, könnte das wie folgt aussehen. Der Code macht nichts anderes, als die Parameter an die richtige Position gemäß den oben angegebenen Tabellen zu schieben: | ||
| − | <c>static void set_entry(int i, unsigned int base, unsigned int limit, int flags) | + | <syntaxhighlight lang=c>static void set_entry(int i, unsigned int base, unsigned int limit, int flags) |
{ | { | ||
gdt[i] = limit & 0xffffLL; | gdt[i] = limit & 0xffffLL; | ||
| Zeile 136: | Zeile 136: | ||
gdt[i] |= ((flags >> 8 )& 0xffLL) << 52; | gdt[i] |= ((flags >> 8 )& 0xffLL) << 52; | ||
gdt[i] |= ((base >> 24) & 0xffLL) << 56; | gdt[i] |= ((base >> 24) & 0xffLL) << 56; | ||
| − | }</ | + | }</syntaxhighlight> |
Welche Segmente Du anlegen willst, hängt natürlich von der Architektur Deines Kernels ab. Mein Vorschlag ist nicht die absolute und einzige Wahrheit, aber er ist ein guter Anfang, wenn Du Dir unsicher bist. Grundlage ist die GDT, wie [[týndur]] sie verwendet und wie sie in den meisten anderen Betriebssystemen anzutreffen ist. Speicherschutz wird dabei über [[Paging]] erledigt, so dass nur ein Minimalsatz von Segmenten übrigbleibt: | Welche Segmente Du anlegen willst, hängt natürlich von der Architektur Deines Kernels ab. Mein Vorschlag ist nicht die absolute und einzige Wahrheit, aber er ist ein guter Anfang, wenn Du Dir unsicher bist. Grundlage ist die GDT, wie [[týndur]] sie verwendet und wie sie in den meisten anderen Betriebssystemen anzutreffen ist. Speicherschutz wird dabei über [[Paging]] erledigt, so dass nur ein Minimalsatz von Segmenten übrigbleibt: | ||