Autor Thema: Usermode Multitasking  (Gelesen 9091 mal)

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 05. May 2012, 19:43 »
Also die wichtigsten Informationen sind in diesen Zeilen:

check_exception old: 0xffffffff new 0xd
     0: v=0d e=0028 i=0 cpl=0 IP=0008:00000000001051a5 pc=00000000001051a5 SP=0010:00000000003fff60 EAX=0000000000000028

Also EIP und ESP. In diesem Fall solltest du schauen, auf welchen Befehl EIP zeigt, und in welcher Funktion das ist.

edit: Hm, ich bin heute etwas langsam. Wir wissen ja, welcher Befehl das war ... Dann schau dir die GDT an. Wenn du da nicht einen Debugger hast, der das kann, dann schreibt dir eine print-hex-Funktion und lass sie dir auf dem Bildschirm ausgeben.
« Letzte Änderung: 05. May 2012, 20:04 von Jidder »
Dieser Text wird unter jedem Beitrag angezeigt.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 05. May 2012, 19:44 »
#GP oder #TS sind Exceptions, also Interrupts.
Wenn deine IDT kaputt ist, dann greift die CPU für diesen Interrupt ins Leere, was zu einem Double-Fault führt. Da deine IDT noch immer kaputt ist, entsteht jetzt ein Triple-Fault und damit ein Reset.

Mit "-cpu" kannst du Qemu sagen, welche CPU er emulieren soll. "qemu-system-i386 -cpu pentium3" ist also das, was du möchtest. Wobei du im Augenblick eh nicht mehr benutzt, als ein 386/486er kann.

Gruß,
Svenska

OS_3000

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 05. May 2012, 22:19 »
Zitat
Dann schau dir die GDT an.
Wozu?
Wir wissen ja was drin steht.
Ich weiß bloß nicht was daran falsch ist.
Ich hoffe, ich stehe nicht total auf dem Schlauch.


PS: Die CPU ist jetzt auf Pentium 3 eingestellt.  :-)
Danke für den Tipp.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 05. May 2012, 22:55 »
Es ist die GDT. Wir wissen nicht was drin steht. Aber ich weiß jetzt was nicht drin steht. Der TSS-Deskriptor.
« Letzte Änderung: 05. May 2012, 22:57 von Jidder »
Dieser Text wird unter jedem Beitrag angezeigt.

OS_3000

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 05. May 2012, 23:17 »
Naja es müsste folgendes drinstehen:
    Gdt_SetEntry(1, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT | GDT_FLAG_CODESEG | GDT_FLAG_4K | GDT_FLAG_PRESENT);
    Gdt_SetEntry(2, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT | GDT_FLAG_DATASEG | GDT_FLAG_4K | GDT_FLAG_PRESENT);
    Gdt_SetEntry(3, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT | GDT_FLAG_CODESEG | GDT_FLAG_4K | GDT_FLAG_PRESENT | GDT_FLAG_RING3);
    Gdt_SetEntry(4, 0, 0xfffff, GDT_FLAG_SEGMENT | GDT_FLAG_32_BIT | GDT_FLAG_DATASEG | GDT_FLAG_4K | GDT_FLAG_PRESENT | GDT_FLAG_RING3);
    Gdt_SetEntry(5, (uint32_t)(&Tss_Tss), sizeof(Tss), GDT_FLAG_TSS | GDT_FLAG_PRESENT | GDT_FLAG_RING3);

Wie anfangs gepostet.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 05. May 2012, 23:37 »
Die GDT ist nicht groß genug für den TSS-Eintrag.
Dieser Text wird unter jedem Beitrag angezeigt.

OS_3000

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 05. May 2012, 23:52 »
Habs am Anfang alles schonmal gepostet.
#define GDT_ENTRIECOUNT (5) sollte eigentlich stimmen.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 06. May 2012, 00:20 »
Arrays fangen in C bei 0 an. Von 0 bis 5 sind es 6 Einträge.
Dieser Text wird unter jedem Beitrag angezeigt.

OS_3000

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 06. May 2012, 13:27 »
Oh oh :-o
Vielen Dank, stand wohl wirklich vollends auf dem Schlauch.

Ist klar, das es dann nicht gehen kann.
Im Wiki ist anfangs noch ein leerer Eintrag mit der Null, denn hab ich damals irgendwie nicht beachtet.
Kannst du mir jetzt noch sagen, welchen Sinn dieser Eintrag hat?

Jedenfalls läufts jetzt.
Es kommt zwar nach dem 5 Taskwechsel ein Bluescreen, aber das bekomme ich jetzt selber hin.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #29 am: 06. May 2012, 14:16 »
Der Selektor 0 steht für einen ungültigen Selektor ähnlich wie der NULL-Pointer für einen ungültigen Zeiger steht. Wenn du über ein Segmentregister, das den Nullselektor geladen hat, auf den Speicher zugreifen willst, wirft die CPU einen GPF. Das heißt dieser Eintrag ist nicht nutzbar.
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen