Forum: PC-Programmierung GDT erstellen - Dauernd reboot?


von Samuel J. (capstrovor)


Angehängte Dateien:

Lesenswert?

Ich bin gerade dabei die GDT einzurichten. Ich arbeite mit GRUB, es ist 
also schon eine GDT vorhanden, deshalb lade ich die Segmentregister neu.
Ich arbeite nach diesem(n) Tutorial(s):
speziell für GDT: http://www.lowlevel.eu/wiki/Global_Descriptor_Table
Hauptseite: http://www.lowlevel.eu/wiki/Teil_5_-_Interrupts

Sobald ich Segmentregister neu lade, wird ein reboot ausgeführt. Ich 
habe schon eine Vermutung. Und zwar wird im Tutorial angegeben, das 
jeder Eintrag in die GDT 8 Byte groß ist. Aber wenn ich den Prototyp der 
Funktion, die für die Erstellung eines Eintrags zuständig ist, anschaue, 
dann sind darin 2 unsigned und 1 normaler int enthalten. Das wären ja 
dann 32bit*3 /8 = 12 Byte oder. Da ich ja in ein bestimmtes Register 
Anfang und Endadresse der GDT schreiben muss, denke ich dass hier der 
Fehler liegt. Wenn ich aber 12 Byte für die Länge benutze taucht der 
selbe Fehler wieder auf. Kann jemand von euch den Fehler finden?

Im Anhang befinden sich meine c und Assemblerdateinen
Die Datei init.c ist die Hauptdatei.
In der gdt.c wird die GDT befüllt
In der gdt_assembler.S werden die Segmentregister neugeladen.
Die console.c ist unwichtig. Ich weis aber nicht wie ich die Datei 
wieder entfernen kann xD

von Higg G. (higg)


Lesenswert?

So wie ich das sehe, fehlt die Initialisierung des TSS. 
http://www.lowlevel.eu/wiki/Task_State_Segment

Auch wenn du mit Multitasking noch nicht angefangen hast, so hast du ja 
bereits einen Task, über den Informationen im Speicher hinterlegt sein 
müssen. z.B. eben in welchem Ring dieser läuft.
1
// gdt.c
2
3
...
4
uint32_t tss[32] = { 0, 0, 0x10 };
5
...
6
7
void init_gdt()
8
{
9
   ...
10
   set_entry(5, (uint32_t) tss , sizeof(tss), GDT_FLAG_TSS | GDT_FLAG_PRESENT | GDT_FLAG_RING3);
11
}

Denke das dürfte der Grund sein, warum die CPU in deinem Fall einen 
Reset fährt. In der restlichen Initialisierung kann ich keinen Fehler 
entdecken. Diese stimmt mit meiner Implementierung überein, welche 
funktioniert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.