Was passiert, wenn ein anderer Interrupt ausgelöst wird, bevor die erste Interrupt-Aktion abgeschlossen ist?

8

Diese Frage stammt aus dem Interrupt-Handling-Thema.

Angenommen, ein Interrupt wird bearbeitet. Was passiert, wenn ein anderer Interrupt ausgelöst wird, noch bevor die erste Interrupt-Aktion abgeschlossen ist?

    
Jonathan Leffler 31.05.2009, 01:49
quelle

3 Antworten

4

Das Folgende trifft nur auf die x86-Architektur zu, aber andere Architekturen könnten dem gleichen Muster folgen:

Es gibt ein Prozessor-Flag mit dem Namen IF (Interrupt Flag), das steuert, ob Hardware-Interrupts verarbeitet werden können oder in die Warteschleife gesetzt werden müssen. Wenn IF = 0 ist, werden Interrupts verschoben, bis das Flag wieder aktiviert wird (mit Ausnahme des NMI, des nicht maskierbaren Interrupts, der als 'Nur-Not-Interrupt' gedacht ist, der nicht blockiert werden kann).

Der IF wird automatisch vom Prozessor gelöscht, bevor eine Interrupt-Wartungsroutine aufgerufen wird. Dies ist notwendig, um zu verhindern, dass Interrupt-Aufrufe außer Kontrolle geraten. Beachten Sie, dass der Interrupt-Service-Code selbst dies nicht selbst tun konnte, denn wenn IF vor Eintritt in die Routine nicht deaktiviert wurde, konnten mehr Interrupts auftreten, bevor der Service-Code Zeit hatte, selbst einen einzelnen Befehl auszuführen. Dann würde ein "Firehose" von Interrupts sofort (aus allen Dingen) einen Stapelüberlauf ergeben.

Also, als Antwort auf Ihre direkte Frage: Wenn ein zweiter Hardware-Interrupt auftritt, während einer der ersten gewartet wird, wird dieser Interrupt normalerweise gehalten, bis der erste abgeschlossen ist.

Wie üblich ist die ganze Geschichte etwas komplizierter. Das Intel-Architektur-Software-Entwicklerhandbuch auf der Intel-Website enthält eine ausführlichere Beschreibung ab Seite 10-4.

    
Euro Micelli 31.05.2009 03:20
quelle
2

Das hängt vom System ab. Wenn der neue Interrupt eine höhere Priorität hat als der erste, wird normalerweise geantwortet, indem der Handler für den ersten Interrupt ausgesetzt wird. Wenn der Handler beendet ist, wird der ursprüngliche Interrupt-Handler fortgesetzt. Schließlich wird unter der Annahme, dass keine Interrupts mehr auftreten, der ursprüngliche Handler beendet und der normale Dienst wird fortgesetzt. Manchmal wird der wiederaufgenommene Prozess der Prozess sein, der unterbrochen wurde; manchmal wird es nicht mehr der geeignetste Prozess sein und ein anderer wird fortgesetzt.

Wenn eine zweite oder nachfolgende Instanz des ursprünglichen Interrupts auftritt, bevor der erste Handler beendet wird, oder wenn ein Interrupt mit niedrigerer oder gleicher Priorität auftritt, wird er ähnlich lange gehalten, bis der erste Handler beendet ist. Bevor die normale Verarbeitung wieder aufgenommen wird, sucht der Kernel nach ausstehenden Interrupts, die behandelt werden sollten, aber blockiert wurden.

Ein Interrupt-Handler kann andere Interrupts blockieren.

    
Jonathan Leffler 31.05.2009 01:54
quelle
0

Nun, wenn Interrupts nicht nach dem ersten Interrupt deaktiviert wurden, bewirkt der zweite, dass Ihre Interrupt-Service-Routine erneut aufgerufen wird. Sie müssen sicherstellen, dass Interrupts deaktiviert werden, um dieses entschieden unerwünschte Verhalten zu vermeiden.

Wenn also Ihre Interrupt-Service-Routine ihre Sache macht und dann ein weiterer Interrupt auftritt, ist es genauso, als würden Sie noch etwas anderes tun: Die entsprechende Interrupt-Routine wird aufgerufen.

In der Intel-Architektur wird die "cli" -Anweisung Interrupts deaktivieren und "sti" wird sie wieder aktivieren.

    
Mr. Shickadance 31.05.2009 01:53
quelle

Tags und Links