GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie der Linux-Kernel mit Interrupts umgeht

Interrupts sind ein wesentlicher Bestandteil der Funktionsweise moderner CPUs. Beispielsweise wird jedes Mal, wenn Sie eine Taste auf der Tastatur drücken, die CPU unterbrochen, damit der PC Benutzereingaben von der Tastatur lesen kann. Dies geschieht so schnell, dass Sie keine Änderung oder Beeinträchtigung der Benutzererfahrung bemerken.

Außerdem ist die Tastatur nicht die einzige Komponente, die Interrupts verursachen kann. Im Allgemeinen gibt es drei Arten von Ereignissen, die zu einer Unterbrechung der CPU führen können:Hardware-Unterbrechungen , Software-Interrupts und Ausnahmen . Bevor ich auf die verschiedenen Arten von Interrupts eingehe, werde ich einige Begriffe definieren.

Definitionen

Eine Unterbrechungsanforderung (IRQ ) wird vom programmierbaren Interrupt-Controller (PIC) angefordert ) mit dem Ziel, die CPU zu unterbrechen und die Interrupt Service Routine (ISR) auszuführen ). Der ISR ist ein kleines Programm, das je nach Ursache des IRQ bestimmte Daten verarbeitet. Die normale Verarbeitung wird unterbrochen, bis die ISR abgeschlossen ist.

In der Vergangenheit wurden IRQs von einem separaten Mikrochip – dem PIC – gehandhabt, und I/O-Geräte wurden direkt mit dem PIC verdrahtet. Der PIC verwaltete die verschiedenen Hardware-IRQs und konnte direkt mit der CPU sprechen. Wenn ein IRQ auftrat, schrieb der PIC die Daten an die CPU und löste die Interrupt-Anfrage aus (INTR )-Pin.

Heutzutage werden IRQs von einem fortschrittlichen programmierbaren Interrupt-Controller (APIC) verarbeitet ), die Teil der CPU ist. Jeder Kern hat seinen eigenen APIC.

Arten von Interrupts

Wie ich bereits erwähnt habe, können Interrupts je nach Quelle in drei Typen eingeteilt werden:

Hardware-Interrupts

Wenn ein Hardwaregerät der CPU mitteilen möchte, dass bestimmte Daten zur Verarbeitung bereit sind (z. B. eine Tastatureingabe oder wenn ein Paket an der Netzwerkschnittstelle ankommt), sendet es einen IRQ, um der CPU zu signalisieren, dass die Daten verfügbar sind. Dies ruft eine bestimmte ISR auf, die vom Gerätetreiber beim Start des Kernels registriert wurde.

Software-Interrupts

Weitere Linux-Ressourcen

  • Spickzettel für Linux-Befehle
  • Spickzettel für fortgeschrittene Linux-Befehle
  • Kostenloser Online-Kurs:RHEL Technical Overview
  • Spickzettel für Linux-Netzwerke
  • SELinux-Spickzettel
  • Spickzettel für allgemeine Linux-Befehle
  • Was sind Linux-Container?
  • Unsere neuesten Linux-Artikel

Wenn Sie ein Video abspielen, ist es wichtig, die Musik- und Videowiedergabe zu synchronisieren, damit die Geschwindigkeit der Musik nicht variiert. Dies wird durch einen Software-Interrupt erreicht, der wiederholt von einem präzisen Zeitgebersystem (bekannt als Jiffies) ausgelöst wird. Dieser Timer ermöglicht die Synchronisierung Ihres Musikplayers. Ein Software-Interrupt kann auch durch eine spezielle Anweisung zum Lesen oder Schreiben von Daten auf ein Hardwaregerät aufgerufen werden.

Software-Interrupts sind auch entscheidend, wenn Echtzeitfähigkeit erforderlich ist (z. B. in industriellen Anwendungen). Weitere Informationen hierzu finden Sie im Artikel Einführung in Echtzeit-Linux für Embedded-Entwickler der Linux Foundation .

Ausnahmen

Ausnahmen sind die Art von Interrupts, die Sie wahrscheinlich kennen. Wenn die CPU einen Befehl ausführt, der zu einer Division durch Null oder einem Seitenfehler führen würde, wird jede weitere Ausführung unterbrochen. In einem solchen Fall werden Sie darüber durch ein Popup-Fenster oder durch die Anzeige Segmentierungsfehler (Core Dump) informiert in der Konsolenausgabe. Aber nicht jede Ausnahme wird durch eine fehlerhafte Anweisung verursacht.

Ausnahmen können weiter in Fehler unterteilt werden , Fallen , und Abbrüche .

  • Fehler: Fehler sind eine Ausnahme, die das System beheben kann, z. B. wenn ein Prozess versucht, auf Daten von einer Speicherseite zuzugreifen, die auf die Festplatte ausgelagert wurde. Die angeforderte Adresse liegt im Adressraum des Prozesses und die Zugriffsrechte sind korrekt. Wenn die Seite nicht im RAM vorhanden ist, wird ein IRQ ausgelöst und der Seitenfehler-Ausnahmehandler gestartet um die gewünschte Speicherseite ins RAM zu laden. Wenn der Vorgang erfolgreich ist, wird die Ausführung fortgesetzt.
  • Fallen: Traps werden hauptsächlich zum Debuggen verwendet. Wenn Sie in einem Programm einen Haltepunkt setzen, fügen Sie eine spezielle Anweisung ein, die bewirkt, dass es einen Trap auslöst. Ein Trap kann einen Kontextwechsel auslösen, der es Ihrem Debugger ermöglicht, Werte lokaler Variablen zu lesen und anzuzeigen. Die Ausführung kann danach fortgesetzt werden. Traps sind auch die Standardmethode zum Ausführen von Systemaufrufen (wie das Beenden eines Prozesses).
  • Abbrüche: Abbrüche werden durch Hardwarefehler oder inkonsistente Werte in Systemtabellen verursacht. Ein Abbruch meldet nicht die Position der Anweisung, die die Ausnahme verursacht. Dies sind die kritischsten Interrupts. Ein Abbruch ruft den Abbruch-Ausnahmehandler des Systems auf , wodurch der Prozess beendet wird, der ihn verursacht hat.

Befassen Sie sich

IRQs sind nach Priorität in einem Vektor auf dem APIC geordnet (0 =höchste Priorität). Die ersten 32 Interrupts (0–31) haben eine feste Reihenfolge, die von der CPU vorgegeben wird. Eine Übersicht darüber finden Sie auf der Exceptions-Seite von OsDev. Nachfolgende IRQs können anders belegt werden. Die Interrupt-Deskriptor-Tabelle (IDT ) enthält die Zuordnung zwischen IRQ und ISR. Linux definiert für die Zuweisung einen IRQ-Vektor von 0 bis 256.

Um eine Liste der registrierten Interrupts auf Ihrem System auszudrucken, öffnen Sie eine Konsole und geben Sie ein:

cat /proc/interrupts

Sie sollten so etwas sehen:

Die Spalten sind von links nach rechts:IRQ-Vektor, Anzahl der Interrupts pro CPU (0 .. n ), die Hardwarequelle, die Kanalinformationen der Hardwarequelle und den Namen des Geräts, das den IRQ verursacht hat.

Unten in der Tabelle befinden sich einige nicht-numerische Interrupts. Sie sind die architekturspezifischen Interrupts, wie der lokale Timer-Interrupt (LOC ) auf IRQ 236. Einige davon sind im Linux-IRQ-Vektorlayout im Linux-Kernel-Quellbaum angegeben.

Um eine Live-Ansicht dieser Tabelle zu erhalten, führen Sie Folgendes aus:

watch -n1 "cat /proc/interrupts"

Schlussfolgerung

Eine ordnungsgemäße IRQ-Behandlung ist für das ordnungsgemäße Zusammenspiel von Hardware, Treibern und Software unerlässlich. Glücklicherweise macht der Linux-Kernel einen wirklich guten Job, und ein normaler PC-Benutzer wird von der gesamten Unterbrechungsbehandlung des Kernels kaum etwas mitbekommen.

Das kann sehr kompliziert werden und dieser Artikel gibt nur einen kurzen Überblick über das Thema. Gute Informationsquellen für einen tieferen Einstieg in das Thema sind die Linux Inside eBook (CC BY-NC-SA 4.0) und das Linux Kernel Teaching Repository.


Linux
  1. So aktualisieren Sie den Kernel auf dem Linux-Desktop

  2. Linux – Wie aktiviere ich User_namespaces im Kernel? (für Unprivilegiertes `unshare`.)?

  3. Linux – Wie finde ich die Implementierungen von Linux-Kernel-Systemaufrufen?

  4. Linux – Wie kann man feststellen, welches Modul den Kernel verschmutzt?

  5. So bereinigen Sie Caches, die vom Linux-Kernel verwendet werden

Wie man einen Linux-Kernel im 21. Jahrhundert kompiliert

So überprüfen Sie die Kernel-Version in Linux

So aktualisieren Sie den Linux-Kernel auf CentOS 7

So installieren Sie den neuesten Linux-Kernel auf CentOS 7

Wie berechnet man die CPU-Auslastung eines Prozesses durch PID in Linux von C?

Wie lädt Linux das 'initrd'-Image?