Autor Thema: Tutoral Teil 6: GPF-Problem  (Gelesen 2975 mal)

BeanMe

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« am: 05. May 2012, 09:43 »
Hallo,

ich habe ein Problem:
Ich habe versucht, nach dem Tutorial einen Kernel zu schreiben.

Seit die Prozesse in den Userspace verschoben wurden, geht nichts mehr.
Es werden nur As ausgegeben.
Außerdem wird ein General Protection Fault ausgelöst.

Könnt ihr mir bitte helfen?

Danke im Voraus,
BeanMe
« Letzte Änderung: 05. May 2012, 10:47 von BeanMe »

Svenska

  • Beiträge: 1 790
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 05. May 2012, 15:32 »
Seit die Prozesse in den Userspace verschoben wurden, geht nichts mehr.
Ein bisschen mehr Informationen als "geht nicht" solltest du schon liefern, wenn du Hilfe möchtest.

Theoretisch sollte das Tutorial fehlerfrei sein.

Gruß,
Svenska

BeanMe

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 07. May 2012, 19:05 »
"geht nicht" heißt: Es werden nur As ausgegeben, danach habe ich eine Exception 13 (GPF)

Anbei ein Foto von QEMU.
Die Prozessorstände werden ausgegeben.

oern

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 07. May 2012, 20:57 »
Hallo,

cs sollte im Userspace vermutlich 0x1b sein und ss 0x23, wenn du die GDT aus dem Tutorial übernommen hast (auf dem Bild ist cs ja 0x08 => kein Userspace und ss ist 0x1b => vermutlich Code-Segment).
Error-Code 0 sagt eigentlich, dass der Fehler im Segment 0 aufgetreten ist.
Außerdem ist in den eflags das IE-Bit (0x200) nicht gesetzt, d.h., die Interrupts sind ausgeschaltet (zum Taskwechsel durch den Timerinterrupt sollten sie aber natürlich an sein).

Das ist zwar immer noch keine Lösung für dein Problem, aber wie Svenska schon sagte, sind das zu wenig Informationen.

Gruß,
oern

BeanMe

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 08. May 2012, 15:17 »
Wenn ein Interrupt behandelt wird, sind Interrupts doch allgemein aus, oder? :?
Ich habe sie jedenfalls nicht ausgeschaltet.

Mehr Infos habe ich nicht. Braucht ihr Source Code?

Was ich erst dachte ist, dass der GPF dadurch entsteht, dass für die Bs in den Videospeicher geschrieben wird, aber dann könnten auch die As nicht kommen.

oern

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 08. May 2012, 15:48 »
Erstens sind die Interrupts nur dann aus, wenn der behandelte Interrupt als Interrupt Gate in der IDT eingetragen ist.
Zweitens sollte der GPF-Handler die Registerwerte ausgeben, die der Prozessor vor dem Interrupt hatte, also die aus dem Userspace, und dort sollten Interrupts eingeschaltet sein.

Womit versuchst du denn, das "Verschieben in den Userspace" zu erreichen?

Vielleicht wäre der Code von der GDT, dem Interrupthandler bzw. Assemblerstub und dem Multitasking nützlich.
Außerdem kannst du qemu mit dem Parameter "-d int,cpu_reset" aufrufen und dann mal die Datei /tmp/qemu.log posten. Daran könnte man zumindest mal sehen, ob der GPF im Scheduler kommt oder ob der Scheduler überhaupt aufgerufen wird.

Gruß,
oern

BeanMe

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 08. May 2012, 15:59 »
OK...
Ich poste jetzt qemu.log:

Zitat
CPU Reset (CPU 0)
EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000000
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00000000
EIP=00000000 EFL=00000000 [-------] CPL=0 II=0 A20=0 SMM=0 HLT=0
ES =0000 00000000 00000000 00000000
CS =0000 00000000 00000000 00000000
SS =0000 00000000 00000000 00000000
DS =0000 00000000 00000000 00000000
FS =0000 00000000 00000000 00000000
GS =0000 00000000 00000000 00000000
LDT=0000 00000000 00000000 00000000
TR =0000 00000000 00000000 00000000
GDT=     00000000 00000000
IDT=     00000000 00000000
CR0=00000000 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=00000000 DR7=00000000
CCS=00000000 CCD=00000000 CCO=DYNAMIC
EFER=0000000000000000
FCW=0000 FSW=0000 [ST=0] FTW=ff MXCSR=00000000
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
CPU Reset (CPU 0)
EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000633
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00000000
EIP=0000fff0 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0000 00000000 0000ffff 00009300
CS =f000 ffff0000 0000ffff 00009b00
SS =0000 00000000 0000ffff 00009300
DS =0000 00000000 0000ffff 00009300
FS =0000 00000000 0000ffff 00009300
GS =0000 00000000 0000ffff 00009300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT=     00000000 0000ffff
IDT=     00000000 0000ffff
CR0=60000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000000 CCO=DYNAMIC
EFER=0000000000000000
FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
SMM: enter
EAX=00000001 EBX=80000b58 ECX=00000000 EDX=00000cfc
ESI=000e5cbd EDI=0003802d EBP=00000cf8 ESP=00006f00
EIP=000e7a31 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     000fce38 00000037
IDT=     000fdcf0 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=000e5c90 CCD=00000001 CCO=LOGICB 
EFER=0000000000000000
SMM: after RSM
EAX=00000001 EBX=80000b58 ECX=00000000 EDX=00000cfc
ESI=000e5cbd EDI=0003802d EBP=00000cf8 ESP=00006f00
EIP=000e7a31 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00c09300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT=     000fce38 00000037
IDT=     000fdcf0 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=ffffff9c CCO=EFLAGS 
EFER=0000000000000000
     0: v=20 e=0000 i=1 cpl=0 IP=0008:00101476 pc=00101476 SP=0010:0011288c EAX=00000031
EAX=00000031 EBX=0002c0e0 ECX=000b8000 EDX=0000000a
ESI=0002c279 EDI=0002c27f EBP=001128a4 ESP=0011288c
EIP=00101476 EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0028 00102020 00000080 0000e900 DPL=3 TSS32-avl
GDT=     00108040 0000002f
IDT=     00108080 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000001 CCD=00000000 CCO=LOGICB 
EFER=0000000000000000
     1: v=20 e=0000 i=0 cpl=3 IP=001b:0010005c pc=0010005c SP=0023:0010e848 EAX=00000007
EAX=00000007 EBX=00000000 ECX=00000a55 EDX=000b89b5
ESI=00000000 EDI=00000000 EBP=0010e85c ESP=0010e848
EIP=0010005c 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 00102020 00000080 0000e900 DPL=3 TSS32-avl
GDT=     00108040 0000002f
IDT=     00108080 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000095 CCD=fffffab7 CCO=EFLAGS 
EFER=0000000000000000
check_exception old: 0xffffffff new 0xd
     2: v=0d e=0000 i=0 cpl=0 IP=0008:0010140e pc=0010140e SP=0010:0010e88c EAX=00000000
EAX=00000000 EBX=00000000 ECX=0010e888 EDX=00000000
ESI=00000000 EDI=0010e89c EBP=001015e1 ESP=0010e88c
EIP=0010140e EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0023 00000000 ffffffff 00cff300 DPL=3 DS   [-WA]
CS =0008 00000000 ffffffff 00cf9a00 DPL=0 CS32 [-R-]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 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 00102020 00000080 0000e900 DPL=3 TSS32-avl
GDT=     00108040 0000002f
IDT=     00108080 000007ff
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000008 CCD=0010e88c CCO=ADDL   
EFER=0000000000000000

//EDIT: Evtl. ist es wichtig zu wissen, dass ich GRUB als Bootloader nutze und von Diskette gebootet habe. Soll ich den Kernel direkt laden?
« Letzte Änderung: 08. May 2012, 16:01 von BeanMe »

oern

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 08. May 2012, 16:14 »
Aha, offenbar passiert der GPF, wenn du zum zweiten Task (der mit den Bs) wechselst, aber schon im Scheduler. Daher kommen wohl auch die Werte für cs und ss und das nicht gesetzte IE-Flag.
Vermutlich vergisst du aber im Interruptstub, ds und es auf 0x10 zu setzen, denn das wird dir nicht von der CPU abgenommen.
Außerdem würde ich mir mit objdump anschauen, was an der Addresse 0x10140e für Code steht, denn dort scheint ja das Problem zu liegen. Wie gesagt, der Quellcode davon (auf pastebin), wäre nicht schlecht.

Unterschiede zwischen GRUB und qemu sollte es eigentlich nicht geben. Ich verwende mittlerweile lieber qemu direkt, weil ich es mir dann sparen kann, ein GRUB-Image zu erstellen.

Gruß,
oern

BeanMe

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 26. May 2012, 20:50 »
Ich habs: Ich habe statt user_stack + 4096 nur user_stack benutzt...
Peinlicher Fehler...

Danke trotzdem!

 

Einloggen