Nein, was passiert, ist das Qemu irgendwelchen RAM/ROM als Code ausführt, der nicht ausgeführt werden sollte. Von den Meldungen bezüglich irgendwas mit "Flash" solltest du dich nicht irritieren lassen. Genauso wie wenn der Compiler Fehlermeldungen oder Warnungen ausgibt, sollte man auch beim qemu.log vorgehen: Von oben. Fast immer ist es so, dass die erste Meldung/der erste Interrupt das Problem ist und der Rest sind Folgefehler.
Manchmal ist es besonders einfach festzustellen, bei was es sich um Folgefehler handelt. Zum Beispiel ist hier der Wert von EIP (0000000000001f81) total daneben:
1: v=0d e=a0f8 i=0 cpl=0 IP=0008:0000000000001f81 pc=0000000000001f81 SP=0010:0000000000106018 EAX=0000000000106000
Das heißt der Fehler muss vorher passiert sein, denn der Interrupt davor hat plausible Werte. (Wenn er das nicht hätte, könnte man das selbe Prinzip nochmal anwenden, und noch einen Interrupt weiter oben analysieren.) Das Problem ist also zwischen dem Timer-IRQ und dem Zeitpunkt, zu dem EIP den Wert 1f81 hatte, aufgetreten. Da der Wert in EIP total daneben ist, und der häufigste Grund dafür ein defekter Stack ist (da normalerweise nur ret und iret EIP direkt laden), hab ich deine Interruptstubs in Verdacht. (Weitere Möglichkeit wäre der Taskwechsler.) Bei dem anfangs von mir genannten Problem mit dem Exceptionhandler ist zum Beispiel der Stack nicht balanciert. Vermutlich besteht da allerdings kein Zusammenhang zum ursprünglichen Problem, allerdings könnte das Beheben bei der Diagnose helfen und eventuell die Folgefehler verändern. Zum Beispiel könnte dann dein eigener Exceptionhandler anspringen.
Zur weiteren Diagnose des Problems kannst du einen Debugger verwenden. Die qemu-spezifische Einrichtung des Debuggers ist hier beschrieben:
http://www.lowlevel.eu/wiki/Debugging#bochs_.2F_QEMU Du könntest zum Beispiel versuchen einen Breakpoint auf die IRET-Instruktion zu setzen (
break *address). Beim Erreichen des Breakpoints kannst du den Stack analysieren. ESP sollte auf den Ziel-EIP-Wert Zeigen. Die beiden nächsthöheren Adressen sollten CS und EFLAGS beinhalten. Wenn sie das nicht tun, solltest du die Emulation neustarten und den Breakpoint weiter vorne ansetzen, um herauszufinden, welche Werte da auf dem Stack liegen (also wo sie herkommen), und warum da nicht die richtigen liegen. (Das ist die Debugmethode, die ich anwende, wenn ich keine Ahnung hab, was gerade passiert. Andere Vorgehensweisen sind bestimmt auch möglich.)