Autor Thema: GDT  (Gelesen 3698 mal)

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« am: 01. March 2012, 18:33 »
GDT
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?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 01. March 2012, 19:06 »
Wie sieht denn deine GDT aus?
Dieser Text wird unter jedem Beitrag angezeigt.

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 01. March 2012, 19:50 »
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

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 01. March 2012, 19:54 »
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?
Dieser Text wird unter jedem Beitrag angezeigt.

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 02. March 2012, 14:42 »
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

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 02. March 2012, 15:43 »
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.
Dieser Text wird unter jedem Beitrag angezeigt.

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 02. March 2012, 16:04 »
Ich benutze VBox von Oracle. Dann werde ich das image mal mit qemu oder bochs starten

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 02. March 2012, 16:21 »
Du solltest später ohnehin mit verschiedenen Emulatoren (und evtl. realen PCs) testen, da es kleine Unterschiede in der Emulation gibt.

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 02. March 2012, 16:54 »
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

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 02. March 2012, 17:35 »
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

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 03. March 2012, 17:07 »
Hi,
ich hatte einen Datentyp falsch. (Hab mir jetzt die stdint.h erstellt)
Jetzt funktioniert es.

Danke trotzdem für die Hilfe

Micha

 

Einloggen