Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: micha am 01. March 2012, 18:33
-
Hi,
Ich bastle schon lange (sehr lange) an meiner GDT rum.
nur leider läuft der kernel nach dem neuladen der Segmentregister nicht mehr.
Ich hab mir schon die komplette GDT ausgeben lassen: kein fehler gefunden.
Nach dem `lgdt' geht's noch.
Nach dem neuladen der Segmentregister geht es nicht mehr.
So lade ich sie neu:
asm(
"ljmpl $0x08, $1f\n\t"
"1:\n\t"
"mov $0x10, %eax\n\t"
"mov %eax, %ds\n\t"
"mov %eax, %es\n\t"
"mov %eax, %fs\n\t"
"mov %eax, %gs\n\t"
"mov %eax, %ss\n\t"
);
kann mir jemand helfen?
-
Wie sieht denn deine GDT aus?
-
Also ich hab eingentlich keine besondere GDT:
//Nulldeskriptor
set_gdt_entry(0, 0, 0, 0, 0);
//Kernel - Codesegment
set_gdt_entry(1, 0xffff, 0, //index, limit, base
GDT_CODESEG_RD | GDT_SEGMENT | GDT_RING0 | GDT_PRESENT, //Access-Byte
GDT_32_BIT | GDT_4K_GRAN); //Flags
//Kernel - Datensegment
set_gdt_entry(2, 0xffff, 0, //index, limit, base
GDT_DATASEG_WR | GDT_SEGMENT | GDT_RING0 | GDT_PRESENT, //Access-Byte
GDT_32_BIT | GDT_4K_GRAN); //Flags
//Userspace - Codesegment
set_gdt_entry(3, 0xffff, 0, //index, limit, base
GDT_CODESEG_RD | GDT_SEGMENT | GDT_RING3 | GDT_PRESENT, //Access-Byte
GDT_32_BIT | GDT_4K_GRAN); //Flags
//Userpsace - Datensegment
set_gdt_entry(4, 0xffff, 0, //index, limit, base
GDT_DATASEG_WR | GDT_SEGMENT | GDT_RING3 | GDT_PRESENT, //Access-Byte
GDT_32_BIT | GDT_4K_GRAN); //Flags
-
Das Limit scheint schon mal zu klein zu sein. (0xffff statt 0xfffff). Ansonsten wäre jetzt auch mal interessant zu sehen, wie du dir die GDT ausgeben lässt, und was das Ergebnis davon ist. Was hat dir dein Emulator eigentlich in den Logfiles zu dem Absturz gesagt?
-
Hi,
das Problem mit dem Limit hab ich jetzt behoben (ich hatte das halbe Byte vom limit übersehen, dass nach den Flags kommt)
Aber es geht immer noch nicht.
Meine GDT-ausgaben:
gdt[0] = 0x0000000000000000
gdt[1] = 0x00FC9A000000FFFF
gdt[2] = 0x00FC92000000FFFF
gdt[3] = 0x00FCFA000000FFFF
gdt[4] = 0x00FCF2000000FFFF
Die müsten jetzt stimmen(nach 0SDev.org)
In dem Logfile von meinem Emulator finde ich leider nichts über einen Absturz.
Grüße
MIcha
-
Bochs sollte dir immer etwas in das Log schreiben. Qemu schreibt was in die Datei qemu.log im den Parameter -d int übergibst. Diese Datei liegt je nach OS im aktuellen Verzeichnis oder in /tmp. Lad die Datei am besten mal irgendwo hoch, z.B. auf Pastebin.
-
Ich benutze VBox von Oracle. Dann werde ich das image mal mit qemu oder bochs starten
-
Du solltest später ohnehin mit verschiedenen Emulatoren (und evtl. realen PCs) testen, da es kleine Unterschiede in der Emulation gibt.
-
Ich hab versucht mir Qemu zu installieren, doch bei config sagt er mir, dass zlib oder so was fehlt.
Was ist das?
Ich probier mal bochs
-
Wenn du keine besonderen Gründe hast, die Quelltexte bauen zu müssen, dann nimm bitte fertige Binärpakete. Unter Ubuntu macht man das z.B. mit "sudo apt-get install qemu-kvm" in einem Terminalfenster. Für Windows gibt es ebenfalls vorkompilierte Pakete.
Die zlib ist eine Kompressions-Bibliothek und wird mit "sudo apt-get install zlib1g-dev" installiert.
Gruß,
Svenska
-
Hi,
ich hatte einen Datentyp falsch. (Hab mir jetzt die stdint.h erstellt)
Jetzt funktioniert es.
Danke trotzdem für die Hilfe
Micha