2009-05-31 8 views

Antwort

0

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

Also, wenn Ihre Interrupt-Service-Routine seine Sache macht, und dann ein weiterer Interrupt auftritt, wird es als ob Sie sonst noch etwas tun: die entsprechende Interrupt-Routine wird aufgerufen.

Auf der Intel-Architektur wird die "CLI" Anweisung Interrupts deaktivieren, und "Sti" wird sie wieder aktivieren.

2

Es 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 am besten geeignete Prozess sein und ein anderer wird fortgesetzt.

Wenn eine zweite oder nachfolgende Instanz des ursprünglichen Interrupts auftritt, bevor der erste Handler abgeschlossen wird, oder wenn ein Interrupt niedrigerer oder gleicher Priorität auftritt, wird es in ähnlicher Weise gehalten, bis der erste Handler abgeschlossen 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.

4

Folgendes gilt für die x86-Architektur nur, aber auch andere Architekturen könnten auch nach dem gleichen Muster:

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

Die 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-Servicing-Code selbst dies nicht selbst tun konnte, denn wenn IF vor dem Aufruf der Routine nicht deaktiviert wurden, konnten mehr Interrupts auftreten, bevor der Service-Code Zeit hatte, selbst einen einzelnen Befehl auszuführen. Dann würde ein "Firehose" von Interrupts sofort (in allen Dingen) zu einem Stapelüberlauf führen.

Also, als Antwort auf Ihre direkte Frage: In der Regel, wenn eine zweite Hardware-Interrupt auftritt, während eine erste gewartet wird, wird dieser Interrupt in die Warteschleife gesetzt, bis der erste abgeschlossen ist.

Wie immer ist die ganze Geschichte ein bisschen komplizierter. Die Intel Architecture Software Developer’s Manual auf der Intel-Website gibt eine ausführlichere Beschreibung ab Seite 10-4.

Verwandte Themen