Ich sollte zuerst alles teilen, was ich weiß - und das ist totales Chaos. Es gibt mehrere verschiedene Fragen zum Thema, also bitte nicht irritieren:).
1) Um einen ISR zu finden, wird die CPU mit einer Interrupt-Nummer versehen. In x86-Maschinen (286/386 und höher) ist ein IVT mit ISRs enthalten; jeder Eintrag von 4 Bytes Größe. Also müssen wir die Interrupt-Nummer mit 4 multiplizieren, um den ISR zu finden. Der erste Fragenkomplex ist - ich bin völlig verwirrt im Mechanismus der CPU, die den Interrupt empfängt. Um einen Interrupt auszulösen, muss zuerst das Gerät nach IRQ suchen - was dann? Die Interrupt-Nummer reist "auf IRQ" zur CPU? Ich lese auch etwas wie Gerät setzen ISR-Adresse auf Datenbus; Was ist das dann ? Was ist das Konzept von Geräten, die den ISR überschreiben? Kann mir jemand ein paar Beispielgeräte sagen, bei denen die CPU nach Interrupts fragt? Und wo findet ISR für sie?
2) Wenn zwei Geräte einen IRQ teilen (was sehr wahrscheinlich ist), wie unterscheidet sich CPU zwischen ihnen? Was, wenn beide Geräte gleichzeitig einen Interrupt der gleichen Priorität auslösen. Ich habe erfahren, dass es Interaktionen gleichen Typs und niedriger Priorität gibt - aber wie erfolgt diese Kommunikation zwischen CPU und Gerätesteuerung? Ich habe die Rolle von PIC und APIC für dieses Problem untersucht, konnte es aber nicht verstehen.
Danke fürs Lesen. Vielen Dank für Ihre Antwort.
CPUs suchen nicht nach Interrupts, zumindest nicht im Sinne einer Software. In Bezug auf Software sind Interrupts asynchrone Ereignisse.
Was passiert, ist, dass Hardware in der CPU die Unterbrechungsanforderung erkennt, die eine elektrische Eingabe auf einer Unterbrechungsleitung ist, und als Reaktion darauf die normale Ausführung von Ereignissen außer Acht lässt, um auf die Unterbrechung zu antworten. In den meisten modernen CPUs wird das, was als nächstes passiert, durch einen Hardware-Handshake bestimmt, der für den Typ der CPU spezifisch ist, aber die meisten von ihnen erhalten irgendeine Art von der unterbrechenden Vorrichtung. Diese Zahl kann 8 Bit oder 32 oder was auch immer sein, abhängig vom Design der CPU. Die CPU verwendet dann diese Unterbrechungsnummer, um in die Unterbrechungsvektortabelle zu indizieren, um eine Adresse zu finden, um die Ausführung der Unterbrechungsdienstroutine zu beginnen. Sobald diese Adresse ermittelt ist (und der aktuelle Ausführungskontext sicher im Stapel gespeichert ist), beginnt die CPU mit der Ausführung des ISR.
Wenn sich zwei Geräte eine Interrupt-Anforderungsleitung teilen, können sie bewirken, dass verschiedene ISRs laufen, indem während dieses Handshake-Vorgangs eine andere Interrupt-Nummer zurückgegeben wird. Wenn genügend Vektornummern verfügbar sind, kann jedes unterbrechende Gerät seinen eigenen Interrupt-Vektor verwenden.
Aber zwei Geräte können sich sogar eine Interrupt-Anforderungsleitung und einen Interrupt-Vektor teilen, vorausgesetzt, das gemeinsam genutzte ISR ist clever genug, um zu allen möglichen Quellen des gegebenen Interrupts zurückzukehren und Statusregister zu überprüfen, welches Gerät den Dienst angefordert hat.
Ein wenig mehr Details
Angenommen, Sie haben ein System, das aus einer CPU, einem Interrupt-Controller und einem unterbrechenden Gerät besteht. Früher waren das separate physikalische Geräte, aber jetzt könnten alle drei sogar auf demselben Chip liegen, aber alle Signale sind immer noch in dem Keramikgehäuse. Ich werde eine PowerPC (PPC) CPU mit einem integrierten Interrupt-Controller, der mit einem Gerät an einem PCI-Bus verbunden ist, als ein Beispiel verwenden, das gut funktionieren sollte.
Nehmen wir an, das Gerät ist ein serieller Port, der Daten überträgt. Ein typischer Seriell-Port-Treiber lädt eine Menge Daten in den FIFO des Geräts, und die CPU kann regelmäßig arbeiten, während das Gerät seine Aufgabe erledigt. In der Regel können diese Geräte so konfiguriert werden, dass sie eine Interrupt-Anforderung generieren, wenn das Gerät nur noch wenig Daten übertragen kann, so dass der Gerätetreiber zurückkommen und mehr Informationen empfangen kann.
Die Hardwarelogik im Gerät erwartet eine PCI-Bus-Interrupt-Bestätigung, bei der einige Dinge passieren können. Einige Geräte verwenden 'autovectoring', was bedeutet, dass sie auf den Interrupt-Controller angewiesen sind, um sicherzustellen, dass die richtige Service-Routine ausgewählt wird. Andere haben ein Register, das der Gerätetreiber vorprogrammiert, das einen Interrupt-Vektor enthält, den das Gerät als Reaktion auf die Interrupt-Bestätigung auf den Datenbus legt, damit der Interrupt-Controller es aufnehmen kann.
Ein PCI-Bus hat nur vier Interrupt-Anforderungsleitungen, so dass unser serielles Gerät eines davon aktivieren muss. (Es spielt keine Rolle, welche zur Zeit, es ist in der Regel etwas Steckplatz abhängig ..) Als nächstes in der Zeile ist der Interrupt-Controller (zB PIC / APIC), die entscheiden wird, ob die Interrupt auf der Basis der Maske Bits, die eingestellt wurden, zu bestätigen seine eigenen Register. Unter der Annahme, dass er den Interrupt bestätigt, erhält er entweder den Vektor von der unterbrechenden Vorrichtung (über die Datenbusleitungen) oder kann, wenn er so programmiert ist, einen "vorgefertigten" Wert verwenden, der durch den APIC-eigenen Gerätetreiber bereitgestellt wird. Bis jetzt ist die CPU von all diesen Vorgängen glücklicherweise nicht gewusst, aber das wird sich ändern.
Jetzt ist es an der Zeit, dass der Interrupt-Controller die Aufmerksamkeit des CPU-Kerns bekommt. Die CPU wird ihre eigenen Interruptmaskenbit (s) haben, die dazu führen können, dass sie die Anforderung von dem PIC einfach ignoriert. Unter der Annahme, dass die CPU bereit ist, Interrupts zu nehmen, ist es nun an der Zeit, dass die eigentliche Aktion startet. Der aktuelle Befehl muss normalerweise zurückgezogen werden, bevor der ISR beginnen kann, so dass dies bei Pipelineprozessoren ein wenig kompliziert ist, aber es genügt zu sagen, dass der Prozessorkontext an irgendeinem Punkt im Befehlsstrom auf dem Stack und der Hardware gespeichert wird -bestimmte ISR übernimmt.
Einige CPU-Kerne haben mehrere Anforderungsleitungen und können den Prozess der Eingrenzung starten, den die ISR über Hardwarelogik ausführt, die den CPU-Anweisungszeiger auf einen von Handle-Top-Handlern übergibt. Die alten 68K und möglicherweise andere taten es so. Der PowerPC (und ich glaube, der x86) haben eine einzige Interrupt-Anfrage. Das x86 selbst verhält sich ein wenig wie ein PIC und kann einen Vektor von den externen PIC (s) erhalten, aber der powerPC springt nur zu einer festen Adresse, 0x00000500.
In der PPC wird der Code bei 0x0500 wahrscheinlich sofort zu irgendwo im Speicher springen, wo Platz für einen ernsthaften Entscheidungscode ist, aber es ist immer noch die Interrupt-Service-Routine.Diese Routine wird zuerst zu dem PIC gehen und den Vektor erhalten und auch den PIC auffordern, die Interruptanforderung in dem CPU-Kern zu bestätigen. Sobald der Vektor bekannt ist, kann der ISR der obersten Ebene einen spezifischeren Handler durchlaufen, der alle Geräte bedient, von denen bekannt ist, dass sie diesen Vektor verwenden. Der vektorspezifische Handler durchsucht dann die Liste der diesem Vektor zugewiesenen Geräte und prüft die Interruptstatusbits in diesen Geräten, um festzustellen, welche Dienste benötigt werden.
Wenn ein Gerät, wie der hypothetische serielle Port, als dienstanfällig befunden wird, unternimmt das ISR für dieses Gerät geeignete Maßnahmen, beispielsweise das Laden der Daten des nächsten FIFO aus einem Betriebssystempuffer in den Sende-FIFO des Ports. Einige Geräte werden ihre Interrupt-Anforderung automatisch als Reaktion auf den Zugriff abbrechen, zum Beispiel kann das Schreiben eines Bytes in den Sende-FIFO dazu führen, dass die serielle Port-Vorrichtung die Anforderungsleitung deaktiviert. Andere Geräte benötigen ein spezielles Steuerregisterbit, das umgeschaltet, gesetzt, gelöscht oder gelöscht werden kann, um die Anforderung zu löschen. Es gibt Billionen von verschiedenen I / O-Geräten und keine von ihnen scheint es auf die gleiche Art und Weise zu tun, daher ist es schwer zu verallgemeinern, aber das ist normalerweise der Weg.
Jetzt gibt es natürlich noch mehr zu sagen - was ist mit den Prioritäten von Interrupts? Was passiert in einem Multi-Core-Prozessor? Was ist mit verschachtelten Interrupt-Controllern? Aber ich habe genug Platz auf dem Server gebrannt. Ich hoffe, dass das hilft.
Ich bin über diese Frage wie nach 3 Jahren gekommen .. Hoffe ich kann helfen;)
Der Intel 8259A oder einfach der "PIC" hat 8 Pins, IRQ0-IRQ7, jeder Pin ist mit einem einzigen Gerät verbunden.
Nehmen wir an, dass Sie einen Knopf auf der Tastatur gedrückt haben. Die Spannung des IRQ1-Pins, der mit dem KBD verbunden ist, ist High. Nachdem die CPU unterbrochen wurde, bestätigen Sie den Interrupt bla bla bla ... the PIC addiert einfach 8 zur Nummer der IRQ-Linie, so dass IRQ1 1 + 8 bedeutet, was 9
bedeutetSO setzt die CPU ihre CS und IP auf den 9. Eintrag in der Vektortabelle .. und weil die IVT ein Array von Longs ist, multipliziert sie einfach die Anzahl der Zellen mit 4;)
CPU.CS = IVT [9] .CS CPU.IP = IVT [9] .IP
der ESR behandelt das Gerät über die I / O-Ports;) Sorry für mein schlechtes Englisch .. bin ein Araber aber:)