Hi taljeth
Also ich hab das mal versucht. Muss gestehen, dass ich noch immer nicht ganz nachvollziehen kann was da passiert (vor allem versteh ich nicht warum das nur manchmal passiert und manchmal eben nicht).
Kannst du mir vielleicht vorweg erklären wo die Register EBP und EIP ihre Werte bekommen?
EBP ist der Basepointer vom Stack und EIP hat das Offset zur nächsten Instruktion soweit ich das richtig verstanden habe.
Beim Suchen sind eigentlich nur mehr Fragen entstanden ^^
Ich hab mir den Output geben lassen wenn das System läuft und problemlos zwischen Task A und B wechselt. Als erstes fiel mir auf, dass anscheinend immer ein INT 32 ausgelöst wird. Woher kommt der? Ich muss gestehen, dass mir das hier:
http://www.ctyme.com/intr/int-32.htm nicht wirklich weiter hilft
Also bei meinem Problem hier seh ich im qemu.log (mit dem parameter -d in_asm) folgendes..
Ich kann sehen, dass Idt_InstallEntried() noch die Interrupt-Table erstellt. Ich gehe davon aus das IN: Func_Name() dafür steht, aus welcher Funktion die Instruktionen kommen. Liege ich da richtig?
Danach kommt noch der Befehl sti für das enablen der Ints.
Jetzt wirds spannend.. Es kommt ein INT 20, der Isr_Handler() wird gerufen, dieser ruft Scheduler_Schedule(), der kommt zurück in Isr_Handler().. wo anscheinend nocht outb(0x20, 0x20) end of interrupt ausgeführt wird. Danach springt der Code zurück in isr_common_stub (also der Interrupt-Main sozusagen).
Hier kann ich noch sehen, dass alles bis zum iret läuft. Da wirds etwas komisch.. Plötzlich befindet sich die CPU hier:
00101a29 <isr13>:
101a29: fa cli
101a2a: 6a 0d push 0xd
101a2c: eb 97 jmp 1019c5 <isr_common_stub>
Laut qemu.log werden
----------------
IN:
0x00101a2a: push $0xd
0x00101a2c: jmp 0x1019c5
ausgeführt. Sollte sich der PC da nicht wenn schon in der isr20 befinden das es ja ein INT20 ist?
Unmittelbar danach befindet sich der PC hier:
(IN: Isr_Handler)
dprint("[ISR] Exception captured. Kernel stopped.");
1016f9: c7 04 24 2c 34 10 00 mov DWORD PTR [esp],0x10342c
101700: e8 cd e9 ff ff call 1000d2 <dprint>
OBWOHL der vorige Befehl
jmp 0x1019c5 war ..
Das ist dann die Stelle wo dann eben die Meldung von qemu kommt
qemu: fatal: Trying to execute code outside RAM or ROM at 0xd08ec08e
Ich weiß, das ist schon recht viel verlangt hier um Hilfe zu bitten aber ich kann nicht wirklich nachvollziehen wie das passiert.
Nur ne kleine Frage am Rande: Kann ich mir das qemu log auch in intel-Syntax ausgeben lassen? ^^