Autor Thema: Keine Interrupts im Ring 3  (Gelesen 14900 mal)

tiger717

  • Beiträge: 84
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 02. November 2012, 21:54 »
Wenn nichts anderes hilft: Mittels Debugger
  • GDT und TSS im Speicher untersuchen
  • Durch den entsprechenden Code steppen
Hierzu bietet sich die Kombination QEMU/GDB an, siehe hierzu den Artikel bei os-dev.org "How do I use a Debugger with my OS".

jo2105

  • Beiträge: 58
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 02. January 2013, 22:34 »
Ich habe ungefähr das selbe Problem. Wenn ich in den (Ring 3) - Tasks Syscalls oder andere Interrupts aufrufe, wird ein GPR ausgelößt. Allerdings gibt es bei mir keinen TSS-Fault, im Interrupt-log kommt erst der Syscall und direkt danach der GPR.

    42: v=30 e=0000 i=1 cpl=3 IP=001b:00200010 pc=00200010 SP=0023:00008ff8 EAX=00000000
EAX=00000000 EBX=00000030 ECX=00000000 EDX=00000030
ESI=00000000 EDI=00000000 EBP=00008ffc ESP=00008ff8
EIP=00200010 EFL=00000202 [-------] CPL=3 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =001b 00000000 ffffffff 00cffa00 DPL=3 CS32 [-R-]
SS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0000 00000000 00000000 00000000
GS =0000 00000000 00000000 00000000
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00102120 00000080 0000e900 DPL=3 TSS32-avl
GDT=     00106040 0000002f
IDT=     00126080 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00007fec CCO=EFLAGS 
EFER=0000000000000000
check_exception old: 0xffffffff new 0xd
    43: v=0d e=0182 i=0 cpl=3 IP=001b:00200010 pc=00200010 SP=0023:00008ff8 EAX=00000000
EAX=00000000 EBX=00000030 ECX=00000000 EDX=00000030
ESI=00000000 EDI=00000000 EBP=00008ffc ESP=00008ff8
EIP=00200010 EFL=00000202 [-------] CPL=3 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =001b 00000000 ffffffff 00cffa00 DPL=3 CS32 [-R-]
SS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
DS =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
FS =0000 00000000 00000000 00000000
GS =0000 00000000 00000000 00000000
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00102120 00000080 0000e900 DPL=3 TSS32-avl
GDT=     00106040 0000002f
IDT=     00126080 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00007fec CCO=EFLAGS 
EFER=0000000000000000

Mit -d in_asm werde ich auch nicht schlauer, nach dem Syscall wird eben direkt 0xD an den Interrupt-Handler übergeben.

Vielleicht weiß irgendwer wie man da weiterkommt.  :?

jo2105

  • Beiträge: 58
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 02. January 2013, 22:42 »
An der TSS sollte das eigentlich nicht liegen. Denn nach dem GPR wird ganz normal der Fehlerscreen ausgegeben und die CPU eingefroren und das dürfte doch im Ring 3 nicht funktionieren. Und wenn die TSS kaputt wäre dann würde die CPU doch nicht zurück in Ring0 kommen, oder hab ich das falsch verstanden?  :-)

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 02. January 2013, 23:19 »
Der Fehlercode e=0182 bedeutet, dass der Eintrag 0x30 in der IDT fehlerhaft ist. Du solltest prüfen, ob der Deskriptor korrekt initialisiert ist. Inbesondere sollte das Flag IDT_FLAG_RING3 angeben werden, damit der Interrupt aus dem Ring 3 aufgerufen werden kann.
« Letzte Änderung: 02. January 2013, 23:22 von Jidder »
Dieser Text wird unter jedem Beitrag angezeigt.

jo2105

  • Beiträge: 58
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 03. January 2013, 12:16 »
Vielen Dank. :)

Das wird es sein. Ich habe nähmlich nirgendswo das Ring3 Flag angegeben.

/e: An welcher Stelle steht eigentlich das Flag?
/e2: Im Wiki steht es ja^^^(bits 45-46).
/e3: Ich habe für die ganzen Flags 0x8E angegeben (10001110). Da müsste doch eigentlich das Ring3 Flag gesetzt sein oder?  :?
« Letzte Änderung: 03. January 2013, 12:27 von jo2105 »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 03. January 2013, 13:33 »
Es sollte 0xEE sein. Das setzt sich zusammen aus den vier mit OR verknüpften Feldern 0x80 | 0x60 | 0x80 | 0x06, wobei das in der Reihenfolge das Present-Bit, der DPL (Ring), das Bit für 32-Bit-Segment und der Typ (Interrupt Gate) ist.

0x8E wäre korrekt für Ring 0-Einträge.
Dieser Text wird unter jedem Beitrag angezeigt.

jo2105

  • Beiträge: 58
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 03. January 2013, 13:55 »
Yay es funktioniert. :D

Danke. :-)

jo2105

  • Beiträge: 58
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 03. January 2013, 14:12 »
Nochetwas:

Im Tutorial Teil 8 steht ganz am Ende

  ...
    } else {
        /*
         * Wenn wir mindestens ein Multiboot-Modul haben, kopieren wir das
         * erste davon nach 2 MB und erstellen dann einen neuen Task dafuer.
         */
        struct multiboot_module* modules = mb_info->mbs_mods_addr;
        init_elf((void*) modules[0].mod_start);
    }

So wird allerdings nur ein Modul geladen, damit das "Experiment" im Teil 9 funktioniert muss es ne Schleife geben, die modules[0] bis modules[mb_info->mods_count-1] initialisiert. :-)

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 04. January 2013, 17:44 »
So wird allerdings nur ein Modul geladen, damit das "Experiment" im Teil 9 funktioniert muss es ne Schleife geben, die modules[0] bis modules[mb_info->mods_count-1] initialisiert. :-)

In Teil 9 wird gesagt, dass man eine Schleife implementieren soll. Genauer Lesen ;)

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #29 am: 04. January 2013, 19:35 »
Noch empfehlenswerter: Mitdenken. ;)

Sinn und Zweck ist ja nicht, dass das Tutorial jedes Detail vorkaut und man nur noch ein OS kopiert, das mal jemand anderes fürs Tutorial geschrieben hat. Obwohl ich natürlich nicht so naiv bin zu glauben, dass nicht hemmungslos kopiert wird. Vielleicht endet das Tutorial im Moment doch gerade an der richtigen Stelle und man sollte es nicht mehr weiterschreiben.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen