Hi
Momentan beschäftige ich mich mit multitasking, und möchte ertsmal testweise ein einzigen prozess starten. Dazu legen ich eine neue PD an, und mappe den speicher so, wie ich ihn brauche.
Alles liegt an der adresse, wo es hingehört.
Dann lade ich die neue PD und möchte in den code des prozesses springen. Da ich später taskwechsel per iret machen muss (damit mir keine flags verloren gehen) wollte ich auch für diesen test iret verwenden...
Leider endet das in einem triple fault
Testweise habe ich es dann mal mit ret versucht, und das funktioniert...
Warum funktioniert iret nicht?
aufbau mit ret
; *PD wechseln, und stack initialisieren*
mov eax, 0x00000002 ; Die flags
push eax
popf
mov eax, 0x00003000 ; Hier liegt der code
push eax
ret ; und prozess starten, Funktioniert
Der aufbau zum testen des stackinhaltes (in diesem fall des eflags-wertes)
; *PD wechseln, und stack initialisieren*
pop eax ;eip (0x00003000) > OK
pop eax ;cs (0x00000008) > OK
pop eax ;eflags (0x00000002) > OK
jmp fncprint
hlt
;iret
Und so mach ichs mit iret
; *PD wechseln, und stack initialisieren*
iret
Wie man sieht, sind die werte auf dem stack korrect, und wenn ich manuell die flags ändere, und dann in den code springe funktionierts auch, nur mit iret gets nicht
qemu: fatal: triple fault
EAX=e0000011 EBX=00010ff4 ECX=00c02007 EDX=000003f8
ESI=009fff8f EDI=00a0d800 EBP=009fffa8 ESP=00010ff4
EIP=00a06948 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300
CS =0008 00000000 ffffffff 00cf9a00
SS =0010 00000000 ffffffff 00cf9300
DS =0010 00000000 ffffffff 00cf9300
FS =0010 00000000 ffffffff 00cf9300
GS =0010 00000000 ffffffff 00cf9300
LDT=0000 00000000 0000ffff 00008000
TR =0000 00000000 0000ffff 00008000
GDT= 00012101 0000001f
IDT= 00a0f0d4 0000018f
CR0=e0000011 CR2=00012109 CR3=00c02007 CR4=00000010
CCS=00000010 CCD=e0000011 CCO=LOGICL
Wo liegt das problem?
ps.: Ich habe interrupts deaktiviert. Aber wenn ich sie aktiviere, ändert sich nichts.