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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.