Interrupts von externen GerÀten in einem x86-System. Teil 1. Die Entwicklung der Interrupt-Controller

In diesem Artikel möchte ich die Interrupt-Übermittlungsmechanismen von externen GerĂ€ten im x86-System betrachten und versuchen, die folgenden Fragen zu beantworten:

  • Was ist PIC und wofĂŒr ist es?
  • Was ist APIC und wofĂŒr ist es? WofĂŒr sind LAPIC und I / O APIC?
  • Was sind die Unterschiede zwischen APIC, xAPIC und x2APIC?
  • Was ist MSI? Was sind die Unterschiede zwischen MSI und MSI-X?
  • Wie hĂ€ngen die $ PIR-, MPtable- und ACPI-Tabellen damit zusammen?

Wenn Sie eine Antwort auf eine dieser Fragen erhalten möchten oder sich nur mit der Entwicklung der Interrupt-Controller im x86-System vertraut machen möchten, sind Sie bei cat willkommen.

EinfĂŒhrung


Wir alle wissen, was Unterbrechung ist. FĂŒr diejenigen, die es nicht sind, zitieren Sie aus Wikipedia:

Unterbrechung (englische Unterbrechung) - Ein Signal von Software oder Hardware, das den Prozessor ĂŒber das Auftreten eines Ereignisses informiert, das sofortige Aufmerksamkeit erfordert. Eine Unterbrechung benachrichtigt den Prozessor ĂŒber das Auftreten eines Ereignisses mit hoher PrioritĂ€t, das eine Unterbrechung des vom Prozessor ausgefĂŒhrten aktuellen Codes erfordert. Der Prozessor reagiert, indem er seine aktuelle AktivitĂ€t unterbricht, seinen Status beibehĂ€lt und eine Funktion ausfĂŒhrt, die als Interrupt-Handler (oder Interrupt-Handler) bezeichnet wird und auf das Ereignis reagiert und es bedient. Danach gibt er die Kontrolle an den unterbrochenen Code zurĂŒck.

AbhÀngig von der Quelle des Interrupt-Signals werden sie unterteilt in:

  • asynchron oder extern (Hardware) - Ereignisse, die von externen HardwaregerĂ€ten (z. B. PeripheriegerĂ€ten) stammen und zu einem beliebigen Zeitpunkt auftreten können: ein Signal von einem Timer, einer Netzwerkkarte oder einem Festplattenlaufwerk, TastenanschlĂ€ge, Mausbewegungen. Die Tatsache, dass ein solcher Interrupt im System auftritt, wird als Interrupt Request (IRQ) interpretiert. GerĂ€te melden, dass sie die Aufmerksamkeit des Betriebssystems benötigen.
  • synchrone oder interne Ereignisse im Prozessor selbst infolge der Verletzung bestimmter Bedingungen bei der AusfĂŒhrung von Maschinencode: Division durch Null oder StapelĂŒberlauf, Zugriff auf ungĂŒltige Speicheradressen oder ungĂŒltigen Operationscode;
In diesem Artikel möchte ich externe IRQ-Interrupts diskutieren.

Warum werden sie gebraucht? Angenommen, wir möchten eine Aktion mit einem Eingabepaket fĂŒr eine Netzwerkkarte ausfĂŒhren, wenn diese eintrifft. Um die Netzwerkkarte nicht stĂ€ndig zu fragen: "Haben Sie ein neues Paket?" Verschwenden Sie keine Prozessorressourcen, Sie können den IRQ-Interrupt verwenden. Die GerĂ€te-Interrupt-Leitung ist mit der INTR-Leitung des Prozessors verbunden, und wenn ein Paket empfangen wird, "zieht" die Netzwerkkarte diese Leitung. Der Prozessor versteht, dass Informationen dafĂŒr vorhanden sind, und liest das Paket.

Aber was ist, wenn es viele GerÀte gibt? Sie können nicht genug von allen externen GerÀten der Prozessorbeine erhalten.



Um dieses Problem zu lösen, haben sie einen Chip entwickelt - einen Interrupt-Controller.

Pic


( wiki / osdev )

Der erste war ein Intel 8259 PIC- Chip. 8 Eingangsleitungen (IRQ0-7) und ein Ausgang, der den Controller mit der INTR-Leitung des Prozessors verbindet. Wenn ein Interrupt von einem GerĂ€t auftritt, zieht 8259 die INTR-Leitung, der Prozessor versteht, dass ein GerĂ€t einen Interrupt signalisiert, und fragt den PIC ab, um zu verstehen, welcher IRQx-Zweig den Interrupt verursacht hat. Es gibt eine zusĂ€tzliche Verzögerung fĂŒr diese Umfrage, aber die Anzahl der Interrupt-Leitungen erhöht sich auf 8.



8 Leitungen erwiesen sich jedoch schnell als klein, und um ihre Anzahl zu erhöhen, wurden 2 8259 in Kaskade geschaltete Controller (Master und Slave) (Dual PIC) verwendet.

Die IRQs 0 bis 7 werden vom ersten Intel 8259 PIC (Master) und die IRQs 8 bis 15 vom zweiten 8259 PIC (Slave) verarbeitet. Nur ein Master signalisiert das Auftreten eines Interrupts. Wenn auf den Leitungen 8-15 ein Interrupt auftritt, signalisiert der zweite PIC (Slave) dem Master ĂŒber IRQ 2 einen Interrupt, und der Master signalisiert wiederum der CPU. Dieser kaskadierende Interrupt benötigt eine der 16 Leitungen, bietet jedoch am Ende 15 verfĂŒgbare Interrupts fĂŒr GerĂ€te.



Die Schaltung hat sich etabliert, und das ist es, was sie bedeuten, wenn sie jetzt ĂŒber PIC (Programm Interrupt Controller) sprechen. Anschließend erhielten die 8259-Controller einige Verbesserungen und wurden als 8259A bekannt, und diese Schaltung wurde in den Chipsatz aufgenommen. Zu einer Zeit, als der Hauptbus zum Anschließen externer GerĂ€te der ISA-Bus war, reichte ein solches System insgesamt aus. Es musste nur sichergestellt werden, dass verschiedene GerĂ€te nicht mit derselben IRQ-Leitung verbunden waren, um Konflikte zu vermeiden, da ISA-Interrupts nicht gemeinsam genutzt werden.

Normalerweise war das Layout von Interrupts fĂŒr GerĂ€te mehr oder weniger Standard

Beispiel ( von hier genommen ):
IRQ 0 - Systemtimer
IRQ 1 - Tastaturcontroller
IRQ 2 - Kaskade (Interrupt vom Slave-Controller)
IRQ 3 - serielle Schnittstelle COM2
IRQ 4 - serielle Schnittstelle COM1
IRQ 5 - Parallelport 2 und 3 oder Soundkarte
IRQ 6 - Diskettenregler
IRQ 7 - Parallelport 1
IRQ 8 - RTC-Timer
IRQ 9 - ACPI
IRQ 10 - offen / SCSI / NIC
IRQ 11 - offen / SCSI / NIC
IRQ 12 - Mauscontroller
IRQ 13 - Mathe-Co-Prozessor
IRQ 14 - ATA-Kanal 1
IRQ 15 - ATA-Kanal 2

Die Konfiguration und Arbeit mit 8259 Mikroschaltungen erfolgt ĂŒber E / A-Ports:
ChipRegistrierenE / A-Port
MeisterbildBefehl0x0020
MeisterbildDaten0x0021
SklavenbildBefehl0x00A0
SklavenbildDaten0x00A1

→ Die Dokumentation zum 8259A finden Sie hier.

Der ISA-Bus wurde durch den PCI-Bus ersetzt. Und die Anzahl der GerĂ€te begann deutlich die Zahl 15 zu ĂŒberschreiten. Im Gegensatz zum statischen ISA-Bus können die GerĂ€te in diesem Fall dynamisch zum System hinzugefĂŒgt werden. GlĂŒcklicherweise können in diesem Bus Interrupts gemeinsam genutzt werden (dh mehrere GerĂ€te können an dieselbe IRQ-Leitung angeschlossen werden). Um das Problem des Fehlens von IRQ-Leitungen zu lösen, beschlossen sie, Interrupts von allen PCI-GerĂ€ten in PIRQ-Leitungen zu gruppieren (Programmable Interrupt Request).

Angenommen, wir haben 4 Interrupt-Leitungen frei auf dem PIC-Controller und 20 PCI-GerÀte. Wir kombinieren die Interrupts von 5 GerÀten pro PIRQx-Leitung und verbinden die PIRQx-Leitungen mit dem Controller. Wenn auf der PIRQx-Leitung ein Interrupt auftritt, muss der Prozessor alle an diese Leitung angeschlossenen GerÀte abfragen, um zu verstehen, von wem der Interrupt stammt. Dies löst jedoch im Allgemeinen das Problem. Ein GerÀt, das PCI-Interrupt-Leitungen in einer PIRQ-Leitung bindet, wird hÀufig als PIR-Router bezeichnet.

Bei dieser Methode mĂŒssen Sie sicherstellen, dass die PIRQx-Leitungen nicht mit den IRQx-Leitungen verbunden sind, auf denen bereits ISA-Interrupts gestartet wurden (da dies zu Konflikten fĂŒhrt), und dass die PIRQx-Leitungen ausgeglichen sind (je mehr GerĂ€te wir mit derselben PIRQ-Leitung verbunden haben, desto mehr GerĂ€te benötigen Sie fragt den Prozessor ab, um zu verstehen, welches dieser GerĂ€te den Interrupt verursacht hat).



Hinweis : Das PCI-GerĂ€t -> PIR-Mapping wird im Bild abstrakt dargestellt, da es tatsĂ€chlich etwas komplizierter ist. In der RealitĂ€t verfĂŒgt jedes PCI-GerĂ€t ĂŒber 4 Interrupt-Leitungen (INTA, INTB, INTC, INTD). Jedes PCI-GerĂ€t kann bis zu 8 Funktionen haben, und jetzt hat jede Funktion einen INTx-Interrupt. Welche INTx jede Funktion des GerĂ€ts abruft, hĂ€ngt von der Konfiguration des Chipsatzes ab.

Funktionen sind im Wesentlichen separate logische Blöcke. Beispielsweise kann in einem PCI-GerĂ€t eine Smbus-Controller-Funktion, eine SATA-Controller-Funktion oder eine LPC-Bridge-Funktion vorhanden sein. Auf der Betriebssystemseite ist jede Funktion ein separates GerĂ€t mit einem eigenen Konfigurationsbereich fĂŒr die PCI-Konfiguration.

Das Betriebssystem ĂŒbertrug Informationen ĂŒber Routing-Interrupts im BIOS des PIC-Controllers unter Verwendung der Tabelle $ PIR und durch AusfĂŒllen der Register 3Ch (INT_LN Interrupt Line (R / W)) und 3Dh (INT_PN Interrupt Pin (RO)) des PCI-Konfigurationsraums fĂŒr jede Funktion. Die Spezifikation fĂŒr die $ PIR-Tabelle befand sich zuvor auf der Microsoft-Website , ist jetzt jedoch nicht mehr vorhanden. Der Inhalt der Zeilen der $ PIR-Tabelle kann der PCI-BIOS-Spezifikation [4.2.2. Holen Sie sich PCI Interrupt Routing Options] oder lesen Sie hier

Apic


( Wiki , Osdev )

Die vorherige Methode funktionierte, bis Multiprozessorsysteme erschienen. Tatsache ist, dass PIC in seinem GerĂ€t Interrupts nur an einen Hauptprozessor ĂŒbertragen kann. Ich möchte jedoch, dass die Belastung der Prozessoren durch die Interrupt-Behandlung ausgeglichen wird. Die Lösung fĂŒr dieses Problem war die neue Schnittstelle APIC (Advanced PIC).

FĂŒr jeden Prozessor wird ein spezieller LAPIC-Controller (Local APIC) und ein E / A-APIC- Controller hinzugefĂŒgt, um Interrupts von GerĂ€ten weiterzuleiten. Alle diese Steuerungen sind in einem gemeinsamen Bus namens APIC zusammengefasst (neue Systeme werden jetzt ĂŒber einen Standardsystembus verbunden).

Wenn ein Interrupt von einem GerÀt am E / A-APIC-Pin ankommt, leitet die Steuerung den Interrupt an den LAPIC eines der Prozessoren weiter. Durch das Vorhandensein von E / A-APIC können Sie die Verteilung von Interrupts von externen GerÀten zwischen Prozessoren ausgleichen.

Der erste APIC-Chip war 82489DX , ein separater Chip, der LAPIC und I / O-APIC kombiniert. Um ein System von 2 Prozessoren zu erstellen, wurden 3 solcher Mikroschaltungen benötigt. 2 wĂŒrde als LAPIC und eine als I / O APIC fungieren. SpĂ€ter wurde die LAPIC-FunktionalitĂ€t direkt in die Prozessoren integriert, und die E / A-APIC-FunktionalitĂ€t wurde in den 82093AA-Chip integriert.

Der E / A-APIC 82093AA enthielt 24 Eingangspins, und die APIC-Architektur konnte bis zu 16 CPUs unterstĂŒtzen. Um die KompatibilitĂ€t mit Ă€lteren Systemen aufrechtzuerhalten, wurden alten ISA-Interrupts 0 bis 15 Interrupts zugewiesen. In der IRQ-Zeile 16-23 wurden Unterbrechungen durch PCI-GerĂ€te angezeigt. Jetzt war es möglich, nicht an Interrupt-Konflikte von ISA- und PCI-GerĂ€ten zu denken. Dank der erhöhten Anzahl freier Interrupt-Leitungen ist es auch möglich geworden, die Anzahl der PIRQx-Leitungen zu erhöhen.



Die E / A-APIC- und LAPIC-Programmierung erfolgt ĂŒber MMIO. LAPIC-Register befinden sich normalerweise bei 0xFEE00000, E / A-APIC-Register bei 0xFE00000. GrundsĂ€tzlich können jedoch alle diese Adressen neu konfiguriert werden.

Wie bei PIC wurden zunÀchst einzelne Chips spÀter Teil des Chipsatzes.

Anschließend wurde die APIC-Architektur modernisiert und die neue Version hieß xAPIC (x - erweitert). AbwĂ€rtskompatibilitĂ€t mit der vorherigen Version beibehalten. Die Anzahl der möglichen CPUs im System wurde auf 256 erhöht.

Die nĂ€chste Runde der Architekturentwicklung hieß x2APIC . Die Anzahl der möglichen CPUs im System wurde auf 2 ^ 32 erhöht. Die Controller können im xAPIC-KompatibilitĂ€tsmodus oder im neuen x2APIC-Modus arbeiten, in dem die LAPIC-Programmierung nicht ĂŒber MMIO, sondern ĂŒber MSR-Register (was viel schneller ist) erfolgt. Nach diesem Link zu urteilen , ist IOMMU-UnterstĂŒtzung erforderlich, damit dieser Modus funktioniert.

Es ist zu beachten, dass das System möglicherweise ĂŒber mehrere E / A-APIC-Controller verfĂŒgt. Zum Beispiel eine fĂŒr 24 Unterbrechungen in der SĂŒdbrĂŒcke, die andere fĂŒr 32 im Norden. Im Zusammenhang mit E / A werden APIC-Interrupts hĂ€ufig als GSI (Global System Interrupt) bezeichnet. In einem solchen System wird also GSI 0-55 sein.

Gibt es eine eingebaute LAPIC in der CPU und welche Architektur von den Bit-Flags in der CPUID verstanden werden kann.
Damit das System LAPIC und E / A-APIC erkennen kann, muss das BIOS dem System Informationen ĂŒber diese entweder ĂŒber die MPtable (die alte Methode) oder ĂŒber die ACPI-Tabelle (in diesem Fall MADT) bereitstellen. ZusĂ€tzlich zu allgemeinen Informationen sollten sowohl die MPtable als auch die ACPI (diesmal in der DSDT-Tabelle) Informationen zum Interrupt-Routing enthalten, dh Informationen darĂŒber, welches GerĂ€t auf welcher Interrupt-Leitung sitzt (analog zur $ PIR-Tabelle).

Die MPTable-Tabelle finden Sie in der offiziellen Spezifikation . FrĂŒher befand sich die Spezifikation auf der Intel-Website, jetzt ist sie nur noch im Archiv zu finden. Die ACPI-Spezifikation befindet sich jetzt auf der UEFI-Website (aktuelle Version 6.2 ). Es ist zu beachten, dass Sie mit ACPI das Interrupt-Routing fĂŒr Systeme ohne APIC festlegen können (anstatt die Tabelle $ PIR zu verwenden).

Msi


( Wiki )

Die vorherige Version mit APIC ist gut, aber nicht ohne MĂ€ngel. Alle diese GerĂ€teunterbrechungsleitungen komplizieren die Schaltung und erhöhen die Fehlerwahrscheinlichkeit. Der PCI-Bus wurde durch PCI Express ersetzt, bei dem die Interrupt-Leitungen einfach entfernt werden sollten. Um die KompatibilitĂ€t zu gewĂ€hrleisten, werden Interrupt-Signale (INTx #) von bestimmten Nachrichtentypen emuliert. In diesem Schema fiel die logische HinzufĂŒgung von Interrupt-Leitungen, die frĂŒher durch physische Verbindung von DrĂ€hten erfolgte, auf die Schultern von PCI-BrĂŒcken. Die UnterstĂŒtzung Ă€lterer INTx-Interrupts ist jedoch nur UnterstĂŒtzung fĂŒr die AbwĂ€rtskompatibilitĂ€t mit dem PCI-Bus. TatsĂ€chlich hat PCI Express eine neue Methode zur Zustellung von Interrupt-Nachrichten vorgeschlagen - MSI (Message Signaled Interrupts). Bei dieser Methode schreibt das GerĂ€t einfach in den MMIO-Bereich, der dem Prozessor-LAPIC zugewiesen ist, um eine Unterbrechung zu signalisieren.



FrĂŒher wurden einem PCI-GerĂ€t (dh allen seinen Funktionen) nur 4 Interrupts zugewiesen, jetzt können jetzt bis zu 32 Interrupts adressiert werden.

Bei MSI gibt es keine gemeinsame Nutzung fĂŒr die Leitungen, jeder Interrupt entspricht seinem GerĂ€t.

MSI-Interrupts lösen auch ein anderes Problem. Angenommen, ein GerĂ€t fĂŒhrt eine Speicherschreibtransaktion durch und möchte seinen Abschluss ĂŒber einen Interrupt melden. Eine Schreibtransaktion auf dem Bus kann jedoch wĂ€hrend des Übertragungsprozesses (von dem das GerĂ€t ĂŒberhaupt nichts weiß) verzögert sein, und das Interrupt-Signal wird vor dem Prozessor eintreffen. Somit liest die CPU immer noch ungĂŒltige Daten. Wenn MSI verwendet wird, werden Informationen ĂŒber MSI sowie Daten ĂŒbertragen und können einfach nicht frĂŒher eingehen.

Es sollte beachtet werden, dass MSI-Interrupts ohne LAPIC nicht funktionieren können, aber die Verwendung von MSI kann uns durch I / O-APIC ersetzen (Design-Vereinfachung).

Anschließend erhielt diese Methode die MSI-X-Erweiterung. Jetzt kann jedes GerĂ€t bis zu 2048 Interrupts haben. Und es wurde möglich, jedem Interrupt einzeln anzugeben, auf welchem ​​Prozessor er ausgefĂŒhrt werden soll. Dies kann fĂŒr stark belastete GerĂ€te wie Netzwerkkarten sehr nĂŒtzlich sein.

FĂŒr die MSI-UnterstĂŒtzung sind keine zusĂ€tzlichen BIOS-Tabellen erforderlich. Das GerĂ€t muss jedoch die MSI-UnterstĂŒtzung in einer der Funktionen in seiner PCI-Konfiguration melden, und der GerĂ€tetreiber muss die Arbeit mit MSI unterstĂŒtzen.

Fazit


In diesem Artikel haben wir die Entwicklung von Interrupt-Controllern untersucht und allgemeine theoretische Informationen zur Übermittlung von Interrupts von externen GerĂ€ten in einem x86-System erhalten.

Im nÀchsten Teil werden wir uns ansehen, wie jeder der beschriebenen Controller in der Praxis unter Linux verwendet wird.

Referenzen:


Source: https://habr.com/ru/post/de430548/


All Articles