Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: capstrovor am 21. April 2014, 20:01

Titel: GDT laden - Problem:
Beitrag von: capstrovor am 21. April 2014, 20:01
Ich bin gerade bei Teil 5 des Lowleveltutorials und habe ein Problem.

Ich rufe in meiner init-Funktion die Funktion init_gdt() auf. In der werden die ganzen Einträge mit set_entry(..) eingetragen.
Dann wird im Tutorial die Funktion load_gdt() aufgerufen. Im Tutorial wird auf eine Beschreibung der GDT verlinkt. Auf dieser Seite ist auch ein Punkt "GDT laden".
Dort steht am Anfang folgender Code:
static uint64_t gdt [GDT_ENTRIES];
Aber diesen Datentyp gibt es ja gar nicht? Wie soll das funktionieren?
 
Titel: Re: GDT laden - Problem:
Beitrag von: Jidder am 21. April 2014, 20:08
Den Datentyp musst du selbst definieren. Das geht zum Beispiel mittels

typedef unsigned long long uint64_t;
oder du bindest den Standard-Header stdint.h ein, den der Compiler mitliefern sollte.

Edit: unsigned long long natürlich.
Titel: Re: GDT laden - Problem:
Beitrag von: capstrovor am 21. April 2014, 20:15
Ok danke!

Wieso kann ich dafür nicht einfach ein int-Array nehmen?
Titel: Re: GDT laden - Problem:
Beitrag von: Jidder am 21. April 2014, 20:55
Theoretisch könntest du das. Dann ist es allerdings etwas komplizierter, wenn du auf die einzelnen Deskriptoren zugreifen willst, weil ein Deskriptor 8 Bytes groß ist, aber ein int ja nur 4 Bytes. Du müsstest also immer mit 2 multiplizieren, was den Code nicht gerade schöner macht.

Eine bessere Lösung als uint64_t wäre für die Deskriptoren ein richtiges struct zu definieren.

Beispielsweise ähnlich wie dies hier:
typedef struct gdt_descriptor {
uint16_t limit;
uint16_t base;
uint8_t base16;
uint8_t access;
uint8_t limit16;
uint8_t base24;
} __attribute__((packed)) gdt_descriptor_t;

Dann kannst du auf die meisten Elemente zugreifen ohne viel rumshiften zu müssen.