Interrupt handler
Im Computer Systemprogrammierung, ein Interrupt Handler, auch bekannt als ein Service Routine unterbrechen oder Isr, ist ein spezieller Codeblock unterbrechen Bedingung. Interrupt -Handler werden von Hardware -Interrupts, Software -Interrupt -Anweisungen oder Software initiiert Ausnahmenund werden zur Implementierung verwendet Gerätetreiber oder Übergänge zwischen geschützten Betriebsmodi, wie z. Systemaufrufe.
Die traditionelle Form des Interrupt -Handlers ist der Hardware -Interrupt -Handler. Hardware-Unterbrechungen ergeben Digitale Logik, werden normalerweise über eine hart codierte Tabelle mit Interruptvektoren, asynchron zum normalen Ausführungsstrom (wie die Interrupt-Maskierungsstufen zulässig), häufig mit einem separaten Stapel versehen und automatisch in einen anderen Ausführungskontext (Privilegienebene) für die Dauer der Dauer eingesetzt Die Ausführung des Interrupt -Handlers. Im Allgemeinen werden Hardware-Interrupts und ihre Handler verwendet, um Bedingungen mit hoher Priorität zu bewältigen, die die Unterbrechung des aktuellen Codes erfordern Prozessor führt aus.[1][2]
Später wurde es bequem, dass Software den gleichen Mechanismus mittels eines Software -Interrupts (eine Form von synchronem Interrupt) auslösen kann. Anstatt eine hartcodierte Interrupt-Versandtabelle auf Hardwareebene zu verwenden, werden Software-Interrupts häufig implementiert. Betriebssystem Ebene als Form von Rückruffunktion.
Interrupt -Handler haben eine Vielzahl von Funktionen, die je nach dem Auslöser des Interrupts und der Geschwindigkeit, mit der der Interrupt -Handler seine Aufgabe ausgelöst hat, variiert. Zum Beispiel drücken Sie eine Taste auf a Computer Tastatur,[1] oder die Maus, Auslöser unterbrechen, die Interrupt -Handler aufrufen, die den Schlüssel oder die Position der Maus lesen, und die zugehörigen Informationen in den Speicher des Computers kopieren.[2]
Ein Interrupt-Handler ist ein Gegenstück mit niedrigem Niveau von Event -Handler. Interrupt -Handler haben jedoch einen ungewöhnlichen Ausführungskontext, viele harte Einschränkungen hinsichtlich Zeit und Raum, und ihre intrinsisch asynchrone Natur erschwert sie notorisch schwierig durch Standardpraxis (reproduzierbare Testfälle existieren im Allgemeinen nicht) und fordert so einen speziellen Fähigkeiten an - An wichtige Teilmenge von Systemprogrammierung- Software -Ingenieure, die sich an der Hardware -Interrupt -Ebene engagieren.
Fahnen unterbrechen
Im Gegensatz zu anderen Ereignishandlern wird erwartet, dass Interrupt -Handler Interrupt -Flags im Rahmen ihrer Kernfunktionalität auf geeignete Werte einstellen.
Selbst in einer CPU, die verschachtelte Interrupts unterstützt, wird häufig ein Handler mit allen Interrupts erreicht, die weltweit durch einen CPU -Hardware -Betrieb maskiert werden. In dieser Architektur würde ein Interrupt -Handler normalerweise die geringste Menge an Kontext retten und die globale Interrupt -Deaktivierungsflag bei der ersten Gelegenheit zurücksetzen, um Interrupts mit höherer Priorität zu ermöglichen, um den aktuellen Handler zu unterbrechen. Es ist auch wichtig, dass der Interrupt -Handler die aktuelle Interrupt -Quelle nach einer Methode untertaucht (häufig ein Flag -Bit in einem peripheren Register umschaltet), so dass der aktuelle Interrupt nicht sofort auf dem Handler -Ausgang wiederholt wird, was zu einer unendlichen Schleife führt .
Ein Interrupt -Handler mit dem Interrupt -System in genau dem richtigen Zustand unter jeder Eventualität kann manchmal eine mühsame und anspruchsvolle Aufgabe sein, und das Misshandeln ist die Quelle vieler schwerwiegender Fehler, die das System vollständig anhalten. Diese Fehler sind manchmal intermittierend, wobei der Misshandlungsprotokoll für Wochen oder Monate des kontinuierlichen Betriebs nicht auftritt. Die formale Validierung von Interrupt -Handlern ist enorm schwierig, während das Testen in der Regel nur die häufigsten Fehlermodi identifiziert, wodurch subtile, intermittierende Fehler in Interrupt -Handlern häufig an Endkunden versendet werden.
Ausführungskontext
In einem modernen Betriebssystem ist der Ausführungskontext eines Hardware -Interrupt -Handlers beim Eintritt subtil.
Aus Leistungsgründen wird der Handler in der Regel im Speicher- und Ausführungskontext des laufenden Prozesses eingeleitet, zu dem er keine spezielle Verbindung hat (der Interrupt hat im Wesentlichen den laufenden Kontext an. der unterbrochene Prozess). Im Gegensatz zum unterbrochenen Prozess wird der Interrupt jedoch normalerweise durch einen hartcodierten CPU-Mechanismus auf ein Privilegienniveau erhöht, das hoch genug ist, um direkt auf Hardware-Ressourcen zuzugreifen.
Überlegungen zum Raum stapeln
In einem Mikrocontroller mit niedrigem Niveau fehlt dem Chip möglicherweise Schutzmodi und hat keine Speicherverwaltungseinheit (MMU). In diesen Chips wird der Ausführungskontext eines Interrupt -Handlers im Wesentlichen mit dem unterbrochenen Programm übereinstimmen, das normalerweise auf einem kleinen Stapel fester Größe ausgeführt wird (Speicherressourcen waren traditionell am unteren Ende extrem gering). Oft werden verschachtelte Interrupts bereitgestellt, die die Stapelverwendung verschärfen. Eine primäre Einschränkung des Interrupt-Handlers in diesem Programmieren besteht darin, den verfügbaren Stack im Worst-Case-Zustand nicht zu überschreiten, wobei der Programmierer weltweit über die Stapelraumanforderung jeder implementierten Interrupt-Handler und alle implementierten Interrupt-Handler und Anwendungsaufgaben verpflichtet werden muss.
Wenn zugewiesene Stapelraum überschritten werden (eine Bedingung als a Paketüberfluss) Dies wird normalerweise nicht in Hardware durch Chips dieser Klasse erkannt. Wenn der Stapel in einen anderen beschreibbaren Speicherbereich überschritten wird, funktioniert der Handler normalerweise wie erwartet, aber die Anwendung fällt später (manchmal viel später) aufgrund des Nebeneffekts des Handlers der Speicherbeschäftigung aus. Wenn der Stapel in einen nicht geschriebenen (oder geschützten) Speicherbereich überschritten wird, tritt der Fehler normalerweise im Handler selbst auf (im Allgemeinen leichter Fall für späteres Debuggen).
Im Fall des beschreibbaren Fall kann Überschrieben sein, aber niemals, wenn das System korrekt funktioniert. Es ist üblich, regelmäßig Korruption des Stapelschutzes mit einer Art Wachhundmechanismus zu beobachten. Dies wird den Großteil der Stapelüberlaufbedingungen zu einem Zeitpunkt in der Nähe des beleidigenden Betriebs erteilen.
In einem Multitasking -System hat jeder Ausführungsthread normalerweise einen eigenen Stapel. Wenn für Interrupts kein spezieller Systemstapel bereitgestellt wird, verbraucht Interrupts den Stapelraum aus dem Ausführungsthread unterbrochen. Diese Entwürfe enthalten normalerweise eine MMU, und die Benutzerstapel sind normalerweise so konfiguriert, dass der Stapelüberlauf von der MMU entweder als Systemfehler (zum Debuggen) oder zum Neuaufbau des Speichers zum Erweiterung des verfügbaren Speicherplatzs eingeschlossen ist. Speicherressourcen auf dieser Ebene des Mikrocontrollers sind in der Regel weitaus weniger eingeschränkt, so dass Stapel mit einem großzügigen Sicherheitsmarge zugewiesen werden können.
In Systemen, die hohe Fadenzählungen unterstützen, ist es besser, wenn der Hardware-Interrupt-Mechanismus den Stapel auf einen speziellen Systemstapel umschaltet, so dass keiner der Thread-Stapel für die schlechteste Verschachtel der Interrupt-Nutzung von Worst-Case muss. Winzige CPUs bis zum 8-Bit Motorola 6809 Ab 1978 haben separate System- und Benutzer -Stapel -Zeiger bereitgestellt.
Einschränkungen in Zeit und Gleichzeitigkeit
Aus vielen Gründen ist es sehr erwünscht, dass der Interrupt -Handler so kurz wie möglich ausgeführt wird und für einen Hardware -Interrupt stark entmutigt (oder verboten) ist, um potenziell blockierende Systemanrufe aufzurufen. In einem System mit mehreren Ausführungskernen, Überlegungen von Wiedereinzug sind auch von größter Bedeutung. Wenn das System Hardware bietet DMA, Parallelität Probleme können auch bei nur einem einzigen CPU -Kern auftreten. (Es ist nicht ungewöhnlich Ausgelöst vom DMA -Motor selbst, und der zugehörige Interrupt -Handler wird voraussichtlich sorgfältig treten.)
Eine moderne Praxis hat sich entwickelt, um Hardware-Interrupt-Handler in Elemente in der Front- und Hinterhälfte zu unterbrechen. Die Fronthälfte (oder die erste Ebene) erhält den anfänglichen Interrupt im Kontext des laufenden Prozesses, leitet die minimale Arbeit, um die Hardware in einen weniger dringenden Zustand wiederherzustellen (z. B. das Entleeren eines vollständigen Empfangspuffer) und markiert dann die Rückhälfte (oder zweite Ebene) für die Ausführung in naher Zukunft bei der entsprechenden Planungspriorität; Nach dem Aufrufen arbeitet die Rückhälfte in ihrem eigenen Prozesskontext mit weniger Einschränkungen und vervollständigt den logischen Betrieb des Handlers (z.
Geteilte Handler in modernen Betriebssystemen
In mehreren Betriebssystemen - Linux, Unix, Mac OS, Microsoft Windows, Z/OS, DeSqview und einige andere in der Vergangenheit verwendete Betriebssysteme - unterbrechungsfreie Handler sind in zwei Teile unterteilt: die Interrupt-Handler der ersten Ebene (Flih) und die Zweitstufe Interrupt-Handler (Slih). FLIHs sind auch als bekannt als Harte Interrupt -Handler oder Schnelle Interrupt -Handlerund SLIHs sind auch als bekannt als Langsame/weiche Interrupt -Handler, oder Aufgeschobene Verfahrensanrufe in Fenstern.
Ein FLIH implementiert bei minimaler plattformspezifischer Interrupt-Handhabung ähnlich wie Routinen unterbrechen. Als Reaktion auf einen Interrupt gibt es a Kontextschalterund der Code für den Interrupt wird geladen und ausgeführt. Die Aufgabe eines FLIH besteht darin, den Interrupt schnell zu bedienen oder plattformspezifische kritische Informationen aufzuzeichnen, die nur zum Zeitpunkt des Interrupts verfügbar sind, und zeitlicher Ablauf Die Ausführung eines SLIH für weitere langlebige Interrupt-Handhabung.[2]
FLIHS Ursache Jitter in der Prozessausführung. FLIHS maskieren auch Interrupts. Die Reduzierung des Jitters ist am wichtigsten für Echtzeit-BetriebssystemeDa sie eine Garantie beibehalten müssen, dass die Ausführung eines bestimmten Code innerhalb weniger Zeit abgeschlossen wird. Um Jitter zu reduzieren und das Potenzial für den Verlust von Daten von maskierten Interrupts zu verringern, versuchen Programmierer, die Ausführungszeit eines FLIH zu minimieren und sich so weit wie möglich in die SLIH zu bewegen. Mit der Geschwindigkeit moderner Computer kann FLIHS alle Geräte- und Plattform-abhängigen Handhabungen implementieren und ein SLIH für die weitere plattformunabhängige langlebige Handhabung verwenden.
FLIHs, die Hardware Service in der Regel ihren zugehörigen Interrupt maskieren (oder sie so maskiert halten), bis sie ihre Ausführung abgeschlossen haben. Ein (ungewöhnlicher) Flih, der seinen zugehörigen Interrupt entlarvt, bevor es abgeschlossen ist, heißt a Wiedereintretender Interrupt -Handler. Wiedereintrittsbekämpfte Interrupt -Handler können a verursachen Paketüberfluss von mehreren Vorbecken aus demselben Vektor unterbrechenund so werden sie normalerweise vermieden. In einem Prioritätsunterbrechung Das System maskiert auch (kurz) andere Interrupts mit gleicher oder geringer Priorität.
Ein SLIH erledigt lange Interrupt -Verarbeitungsaufgaben ähnlich wie bei einem Prozess.SLIHs haben entweder eine engagierte Kernel Faden für jeden Handler oder werden von einem Pool von Kernel -Worker -Threads ausgeführt.Diese Themen sitzen auf a Laufen Sie Warteschlange Im Betriebssystem ist die Prozessorzeit verfügbar, damit sie die Verarbeitung für den Interrupt durchführen können.SLIHs können eine langlebige Ausführungszeit haben und sind daher in der Regel ähnlich wie Threads und Prozesse geplant.
In Linux werden FLIHS genannt obere Hälfteund Slihs werden genannt untere Hälfte oder untere Hälfte.[1][2] Dies unterscheidet sich von der Namensnamen in anderen unixähnlichen Systemen, in denen beide ein Teil davon sind untere Hälfte.[Klarstellung erforderlich]
Siehe auch
Verweise
- ^ a b c "Programmierhandbuch für Linux -Kernel -Modul, Kapitel 12. Interrupt Handler". Das Linux -Dokumentationsprojekt. 18. Mai 2007. Abgerufen 20. Februar, 2015.
- ^ a b c d Jonathan Corbet;Alessandro Rubini;Greg Kroah-Hartman (27. Januar 2005). "Linux -Geräte -Treiber, Kapitel 10. Interrupt -Handhabung" (PDF). O'Reilly Media. Abgerufen 20. Februar, 2015.