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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.