![Unterbrechen eines Interrupts](https://rvso.com/image/168822/Unterbrechen%20eines%20Interrupts.png)
Ich weiß, wie die Interrupt-Behandlung funktioniert (Modus wechseln, Register speichern, Stapel ändern ...). Mich würde jedoch interessieren, was passiert, wenn ein Interrupt auftritt, während wir uns noch im Kernelmodus und nicht im Benutzermodus befinden?
Antwort1
Genau das Gleiche. Wenn wir jedoch einen Interrupt verarbeiten, passiert möglicherweise nichts oder nichts, bis wir fertig sind.
Was wir in jedem Fall tun:
- Modus unbedingt speichern und auf Supervisor-Modus setzen (wird von der Hardware ausgeführt. Ausgelöst durch Interrupt)
- Status unbedingt speichern und Stack wechseln
- Interrupt-Code ausführen
- Stack unbedingt zurückschalten, Zustand wiederherstellen und Modus wiederherstellen
Der Ausdruck „Modus auf Supervisor-Modus setzen“ kann wie folgt gelesen werden:
- Stellen Sie sicher, dass der Modus der Supervisor-Modus ist.
- schreibe eine Eins in das S-Bit des Statusregisters
Unterbrechen eines Interrupts
Es gibt möglicherweise mehrere (aber endliche) Interrupt-Prioritätsstufen. Für jede Stufe gibt es einen Stapel. Ein Interrupt kann nur durch einen Interrupt mit höherer Priorität unterbrochen werden. Interrupts mit niedrigerer Priorität können durch Interrupts mit höherer Priorität blockiert werden. Dies löst die meisten Probleme, da Stapel nicht beschädigt werden können.
Allerdings können Interrupts mit niedrigerer Priorität blockiert werden (einschließlich Benutzerprozesse. Diese haben die niedrigste Interrupt-Priorität). Daher ist es wichtig, sicherzustellen, dass Interrupts schnell sind (nicht viel Code), insbesondere bei Interrupts mit höherer Priorität: Erledigen Sie die Aufgabe und beenden Sie den Vorgang. Lassen Sie einen Interrupt mit niedrigerer Priorität (z. B. einen Benutzerprozess) den Teil ausführen, der Zeit in Anspruch nimmt.
Stapel
Ein Kernel kann denselben Stack wie der Prozess verwenden, wenn ein Prozess den Kernel aufruft (Aufruf synchronisieren: Verwenden eines Systemaufrufs im Code eines Programms).
Ein Kernel verfügt außerdem über einen Stapel für jede Interrupt-Prioritätsstufe. Siehe Abschnitt zum Unterbrechen eines Interrupts.