Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Hauke am 07. August 2005, 16:12
-
Problem beim Zurückspringen vom Interrupt.
Ich habe für den ProtectMode die GDT und IDT programmiert und eingerichtet. Zusätzlich habe ich den PIC umprogrammiert (auf 32 bis 47). Jedoch, wenn ein Interrupt aufgerufen wird und zurückgesprungen wird, wird Exception 13 ausgelöst. Mit welchem Befehl wird von einem Interrupt zurückgesprungen, bisher mache ich es mit Irtd benutzt. Was ist daran falsch?:?:
Ps. Ist es richtig, dass der System Timer Interrupt selbstständig vom System(PIC) ausgeführt wird? (Hier Int 32):?:
Aufbau von einem Interrupt (bei mir)
Interrupt_x:
Pushad
Cli
⦠;Anweisungen
â¦
Sti
Popad
Irtd
-
irtd? hab ich ja noch nie gehört! :)
Bei mir gehts einfach mit iret.
-
âIretâ fuktioniert auch nicht. System Timer Interrupt (int 32) wird ausgelöst. Dann nachdem ich zurückspringen will wird Exception 13 ausgelöst und dann stürzt das System ab. (weil der Fehler ja noch immer da ist.)
-
manipulierst du den stack im interrupt handler?
-
Du musst bei IRQs noch ein EOI (End of Interrupt) an den Pic senden, bei IRQ 0 wäre das 0x20 an den Port 0x20, wenn ich mich richtig errinnere. Ich habe auch immer iret benutzt.
Iret popt CS, EFLAGS, und die Rücksprungaddresse vom Stack und kehrt dann zur Rücksprungaddresse zurück.
-
Na ja, ein fehlender EOI sollte ja nur bewirken das danach kein IRQ mehr kommt. Aber es wird halt wohl darauf hinauslaufen das mit dem Stack was nicht stimmt.
-
Ich hab jetzt fast alles ausprobiert, Code verändert und sonstiges gemacht, aber es funktioniert immer noch nicht, das merkwürdigste daran ist, dass es bei Bocks funktioniert aber beim Computer selbst nicht. Hat jemand vielleicht noch eine Idee?
-
manipulierst du den stack im interrupt handler?
tust du das ?
-
Ich weiß nicht was unter
manipulierst du den stack im interrupt handler?
zu verstehen ist. Bitter erklären. :?:
-
Veränderst du das ESP Register, oder pushest du irgentwelche Sachen, die du dann nicht wieder popst, wärend der Interrupt ausgeführt wird? Eventuell popst du auch zuviel.
-
Ich hab den Fehler gefunden (glaub ich zumindest)
Esp hat den Wert 0x1FFFF und meine Startadresse war 0x10000. Und als ich Esp auf 0x2FFFF gesetzt habe ging es.
Danke für alle Hilfen. :D
-
an deiner stelle würd ich den stack viel weiter oben oder unten machen, nicht so direkt beim kernel