Frage

Ich sollte zuerst alles teilen, was ich weiß - und das ist ein komplettes Chaos. Es gibt verschiedene Fragen zum Thema, also bitte nicht irritiert :).

1) Um eine ISR zu finden, ist die CPU mit einer Interrupt -Nummer versehen. In X86 -Maschinen (286/386 und darüber) befinden sich ein IVT mit ISRs; Jeder Eintrag von 4 Bytes an Größe. Wir müssen also die Interrupt -Nummer mit 4 multiplizieren, um den ISR zu finden. Die erste Gruppe von Fragen ist also - ich bin völlig verwirrt im Mechanismus der CPU, die den Interrupt erhält. Um einen Interrupt zu erhöhen, muss das Gerät zunächst nach IRQ untersuchen - was dann? Die Interrupt -Zahl reist "auf IRQ" in Richtung CPU? Ich habe auch so etwas wie Geräte gelesen, das die ISR -Adresse in den Datenbus stellt. Was ist das dann ? Was ist das Konzept der Geräte, die den ISR überschreiben? Kann mir jemand nur wenige Beispielgeräte sagen, auf denen CPU -Umfragen für Interrupts umfragt? Und wo findet es ISR für sie?

2) Wenn zwei Geräte einen IRQ teilen (was sehr gut möglich ist), wie unterscheidet sich die CPU zwischen ihnen? Was ist, wenn beide Geräte gleichzeitig einen Interrupt der gleichen Priorität erhöhen? Ich habe erfahren, dass es unter Interrupts mit gleichen Typen und niedrigen Prioritäten maskiert wird - aber wie diese Kommunikation zwischen CPU und Gerätesteuerung geschieht? Ich habe die Rolle von PIC und APIC für dieses Problem untersucht, konnte aber nicht verstehen.

Danke fürs Lesen. Vielen Dank für die Antwort.

War es hilfreich?

Lösung

CPUs Umfragen nicht nach Interrupts, zumindest nicht im Software -Sinne. In Bezug auf Software sind Interrupts asynchrone Ereignisse.

Was passiert, ist, dass Hardware innerhalb der CPU die Interrupt -Anforderung erkennt, bei der es sich um eine elektrische Eingabe in einer Interrupt -Linie handelt, und als Antwort die normale Ausführung von Ereignissen beiseite legt, um auf den Interrupt zu reagieren. In den meisten modernen CPUs wird das, was als nächstes passiert, durch einen Hardware -Handshake bestimmt, der speziell für die Art der CPU ist, aber die meisten von ihnen erhalten eine Reihe einer Art von dem Unterbrechungsgerät. Diese Zahl kann je nach Design der CPU 8 Bit oder 32 oder was auch immer betragen. Die CPU verwendet dann diese Interrupt -Nummer, um in die Interrupt -Vektor -Tabelle zu indexieren, um eine Adresse zu finden, um die Ausführung der Interrupt -Dienstroutine zu beginnen. Sobald diese Adresse bestimmt ist (und der aktuelle Ausführungskontext wird sicher im Stapel gespeichert), beginnt die CPU mit der Ausführung des ISR.

Wenn zwei Geräte eine Interrupt -Anforderungslinie teilen, können sie unterschiedliche ISRs ausführen, indem sie während dieses Handshaking -Prozesses eine andere Interrupt -Zahl zurückgeben. Wenn Sie über genügend Vektornummern verfügbar sind, kann jedes Unterbrechungsgerät seinen eigenen Interrupt -Vektor verwenden.

Zwei Geräte können jedoch sogar eine Interrupt -Anforderungslinie und einen Interrupt -Vektor teilen, vorausgesetzt, der gemeinsame ISR ist clever genug, um auf alle möglichen Quellen des angegebenen Interrupts zurückzukehren, und überprüft den Statusregister, um zu sehen, welches Gerät angefordert wird.

Ein bisschen mehr Details

Angenommen, Sie haben ein System, das aus einer CPU, einer Interrupt -Controller sowie einem Unterbrechungsgerät besteht. In den alten Zeiten wären diese separaten physischen Geräte gewesen, aber jetzt befinden sich alle drei sogar im selben Chip, aber alle Signale befinden sich noch im Keramikgehäuse. Ich werde eine PowerPC (PPC) -CPU mit einem integrierten Interrupt -Controller verwenden, das mit einem Gerät in einem PCI -Bus verbunden ist, als Beispiel, das gut dienen sollte.

Angenommen, das Gerät ist ein serieller Anschluss, der einige Daten überträgt. Ein typischer serieller Port -Treiber lädt eine Reihe von Daten in das FIFO des Geräts, und die CPU kann regelmäßig arbeiten, während das Gerät seine Sache erledigt. In der Regel können diese Geräte konfiguriert werden, um eine Interrupt -Anforderung zu generieren, wenn das Gerät nur zu übertragen wird, damit der Gerätetreiber zurückkommt und sich mehr in sie einfügt.

Die Hardware -Logik im Gerät erwartet, dass ein PCI -Bus unterbrochen wird. Zu diesem Zeitpunkt können einige Dinge passieren. Einige Geräte verwenden "automatisch", was bedeutet, dass sie sich auf den Interrupt -Controller verlassen, um dafür zu sorgen, dass die korrekte Serviceroutine 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 platziert, damit der Interrupt-Controller abgeholt wird.

Ein PCI -Bus hat nur vier Interrupt -Anforderungsleitungen, daher muss unser serielles Gerät einen davon behaupten. (Es spielt keine Rolle, welcher Moment in der Regel etwas Steckplatz abhängig ist.) Als nächstes befindet sich der Interrupt -Controller (z. seine eigenen Register. Angenommen, es wird den Interrupt anerkannt, erhält der Vektor entweder den Vektor vom Unterbrechungsgerät (über die Datenbuslinien) oder kann, wenn dies programmiert ist, einen "Dosen" -Werte verwenden, der vom eigenen Gerätetreiber des APIC bereitgestellt wird. Bisher war die CPU all diese Ereignisse, aber das wird sich ändern, aber das wird sich ändern.

Jetzt ist es Zeit für den Interrupt -Controller, die Aufmerksamkeit des CPU -Kerns auf sich zu ziehen. Die CPU hat ihre eigenen Interrupt -Maskenbits, die dazu führen können, dass sie nur die Anfrage vom Bild ignoriert. Unter der Annahme, dass die CPU bereit ist, Interrupts zu machen, ist es jetzt an der Zeit, dass die wirkliche Aktion beginnt. Die aktuelle Anweisung muss normalerweise im Ruhestand der ISR in den Ruhestand gehen -Deded ISR übernimmt.

Einige CPU -Kerne verfügen über mehrere Anforderungslinien und können den Prozess der Verengung beginnen, die ISR über die Hardware -Logik ausführt, die den CPU -Befehlszeiger auf eine Handvoll Top -Level -Handler überspringt. Der alte 68k und möglicherweise andere haben es so gemacht. Der PowerPC (und ich glaube, der x86) hat einen einzelnen Interrupt -Anforderungseingang. Der X86 selbst verhält sich ein bisschen wie ein Bild und kann einen Vektor von den externen Bild (en) erhalten, aber der PowerPC springt nur zu einer festen Adresse, 0x00000500.

Im PPC wird der Code bei 0x0500 wahrscheinlich nur sofort in den Speicher kommen, wo Platz für einen ernsthaften Entscheidungscode vorhanden ist, aber es ist immer noch die Interrupt -Service -Routine. Diese Routine wird zuerst zum Bild gehen und den Vektor erhalten, und bitten Sie auch das Bild, die Interrupt -Anfrage nicht mehr in den CPU -Kern geltend zu machen. Sobald der Vektor bekannt ist, kann der ISR auf der obersten Ebene einen spezifischeren Handler beziehen, der alle Geräte, die bekanntermaßen diesen Vektor verwenden, bedienen. Der vektorspezifische Handler geht dann über die Liste der diesem Vektor zugewiesenen Geräten hinunter und überprüft die Interrupt -Status -Bits in diesen Geräten, um zu sehen, welcher Service benötigt.

Wenn ein Gerät wie der hypothetische serielle Anschluss als Wunschservice für dieses Gerät für dieses Gerät ermittelt wird, wird beispielsweise die Daten des nächsten FIFO -Daten aus einem Betriebssystempuffer in das Sender -FIFO des Ports geladen. Einige Geräte fallen automatisch ihre Interrupt-Anfrage als Antwort auf den Zugriff auf, beispielsweise das Schreiben eines Byte in den Sende-FIFO kann dazu führen, dass das serielle Port-Gerät die Anforderungslinie entschlüsselt. Andere Geräte müssen ein spezielles Steuerregister-Bit benötigen, um die Anfrage abzulegen, um die Anforderung zu löschen, zu löschen, zu klären, zu klären, zu klären. Es gibt Zillionen verschiedener E/A -Geräte, und keine zwei von ihnen scheinen es jemals genauso zu tun. Es ist also schwierig, es zu verallgemeinern, aber das ist normalerweise der Weg.

Nun gibt es offensichtlich mehr zu sagen - was ist mit Interrupt -Prioritäten? Was passiert in einem Multi-Core-Prozessor? Was ist mit verschachtelten Interrupt -Controllern? Aber ich habe genug Platz auf dem Server verbrannt. Hoffe, dass alles davon hilft.

Andere Tipps

Ich habe diese Frage wie nach 3 Jahren durchgesehen. Ich hoffe, ich kann helfen;)

Der Intel 8259A oder einfach das "Bild" enthält 8 Pins, IRQ0-IRQ7, jeder Stift wird mit einem einzelnen Gerät verbunden.

Nehmen wir an, dass Sie eine Taste auf die Tastatur gedrückt haben. Die Spannung des IRQ1 -Pin, der mit dem KBD verbunden ist Fügen Sie der Anzahl der IRQ -Linie 8 hinzu, so dass IRQ1 1+8 bedeutet, was 9 bedeutet

So stellt die CPU ihren CS und ihre IP auf den 9. Eintrag in der Vektertabelle fest. Und weil das IVT eine Reihe von Longs ist, multiplizieren Sie nur die Anzahl der Zellen mit 4;)

Cpu.cs = ivt [9] .cs cpu.ip = ivt [9] .IP.

Der ESR befasst sich mit dem Gerät über die E/A -Ports;) Entschuldigung für mein schlechtes Englisch .. bin aber Araber :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top