PM Interrupts



  • Hi

    Ich habe mit DPMI versucht dem Timer Interrupt 8 einen neuen Handler zuzuweisen. (int 31; ax=0205 bl=08 cx=cs edx=offset)
    Der neue Handler wird anscheinend auch aufgerufen, aber beim iret stuerzt das Programm wegen einer "Schutzverletzung" ab 😕
    Hat irgendjemand eine Idee, woran das liegen koennte und was ich dagegen tun koennte?



  • Ja hab ne Idee, ich zitiere mal aus meinem Lieblings PM-Tut (http://www.fh-zwickau.de/doc/prmo/start.htm):

    6.2 Probleme
    Task-Wechsel über Interrupts und IRET

    Wird die Task-Umschaltung wie oben erläutert durchgeführt, tritt ein Problem auf, das mit dem Task-Wechsel durch einen Interrupt zusammenhängt. Ein Interrupt-Gate unterbricht einen Task nur temporär. Das heißt, das "Busy-Bit" im unterbrochenen Task bleibt bestehen, das Back-Link Feld im TSS des neuen Tasks bekommt den Wert des Selektors des unterbrochenen TSS zugewiesen und das Bit NT (Nested Task) im EFLAGS-Register wird gesetzt. All das sind Voraussetzungen, um den neuen Task normalerweise mit IRET beenden zu können. Das eigentliche Problem besteht nun darin, daß der Prozessor beim Versuch, einen bereits als "Busy" gekennzeichneten Task erneut aufzurufen, eine Exception auslöst (das darf auch nicht möglich sein, da Tasks nicht reentrant sind).

    Wird ein Task also ein zweites Mal durch den Task-Handler aktiviert, ohne daß vorher das Busy-Bit des jeweiligen Tasks gelöscht wurde, wird eine Exception ausgelöst. Der Task-Handler muß zur Lösung dieses Problems in die Task-Verkettung eingreifen. Dabei müssen die folgenden drei Tätigkeiten durchgeführt werden:

    * dafür sorgen, daß während der Manipulation keine Interrupts auftreten (CLI / STI),
    * das "Back-Link" Feld im TSS des Task-Handlers mit einem Selektor auf das TSS setzen, was nach dem IRET Befehl aktiviert werden soll,
    * das "Busy-Bit" der bereits aktivierten Tasks löschen (das "Busy-Bit" ist Bestandteil des Deskriptortyps des jeweiligen TSS und muß daher in der GDT geändert werden).

    Erst dann kann über IRET zurückgekehrt werden.

    Ich denken mal das ist klar.

    mfg
    -bg-



  • ok, unter diesem Link haette ich garantiert zuletzt nachgeschaut :p

    Na dann mal rumprobieren.
    Mal sehen, ob der Interrupt nachher ueberhaupt noch schnell genug ist. 🙄


Anmelden zum Antworten