PLIC
Abkürzung für Platform-Level Interrupt Controller; in der RISC-V-Architektur eine Komponente, die Interrupts von ihren Quellen zu den Harts weiterleitet.
PLIC: der Verkehrspolizist für Prozessor-Interrupts
Ein PLIC ist eine Hardwarekomponente in RISC-V-Systemen, die zwischen Interrupt-Quellen (Peripherie, Timer, externe Geräte) und den Prozessorkernen (in RISC-V-Terminologie Harts genannt) sitzt. Die Aufgabe ist einfach: Wenn ein Gerät Aufmerksamkeit braucht, empfängt der PLIC das Signal, entscheidet, welcher Hart es bearbeiten soll, und leitet den Interrupt weiter. Ohne PLIC müsste jeder Hart direkte Verbindungen zu jeder Interrupt-Quelle haben, was in Systemen mit vielen Kernen und vielen Geräten unbeherrschbar wird.
Der PLIC verwaltet Interrupts, indem er jeder Quelle eine Prioritätsstufe zuordnet, typischerweise im Bereich von 0 bis 15 oder höher, je nach Implementierung. Er unterstützt auch Schwellenwertregister: Jeder Hart kann einen Schwellenwert setzen, was bedeutet, dass er nur Interrupts mit höherer Priorität akzeptiert. Dies ermöglicht es einem Kern, niedrig priorisierte Arbeit vorübergehend zu verschieben oder ganze Interrupt-Klassen während kritischer Abschnitte abzulehnen. Der PLIC verfolgt, welche Interrupts anstehen, welche aktiviert sind und welcher Hart jeden bearbeiten sollte.
Routing und Hart-Auswahl
Der PLIC kann eine einzelne Interrupt-Quelle an mehrere Harts oder nur an bestimmte Harts routen. In einigen Designs wird ein Interrupt vom ersten Hart, der das Claim-Register des PLIC liest, beansprucht; in anderen wählt der PLIC selbst den Ziel-Hart. Die Auswahllogik berücksichtigt Priorität, Schwellenwert und manchmal Lastverteilung. Nachdem ein Hart einen Interrupt beansprucht hat, muss er die Bearbeitung abschließen und dann ein Completion-Register schreiben, um dem PLIC zu signalisieren, dass er fertig ist. Dies ermöglicht dem PLIC, den Interrupt freizugeben und möglicherweise an einen anderen Hart zu senden, falls nötig.
PLIC-Implementierungen sind unterschiedlich. Einfache Designs sind mit einer festen Anzahl von Interrupt-Quellen und Harts verdrahtet; komplexe Systeme enthalten konfigurierbare Kontexte (ein Hart kann separate M-Mode- und S-Mode-Kontexte haben, jeder mit eigenem Schwellenwert und Claim-Registern). Der PLIC selbst ist üblicherweise speicherabgebildet und belegt einen zusammenhängenden Adressbereich, auf den Software über Load- und Store-Befehle zugreift. Typische Implementierungen reservieren etwa 4 Bytes pro Interrupt-Quelle plus 8 Bytes pro Hart-Kontext, daher wächst der Speicherplatzbedarf mit der Systemgröße.
In der Praxis entstehen Probleme, wenn Interrupt-Prioritäten falsch konfiguriert sind und latenzempfindliche Geräte von niedrig priorisierten Quellen verhungern, oder wenn der Schwellenwert zu hoch gesetzt ist und Interrupts verloren gehen. Die Rolle des PLIC macht ihn während des normalen Betriebs unsichtbar, aber während der Systemintegration kritisch. Das Debugging erfordert oft, die speicherabgebildeten Register direkt zu untersuchen, um zu sehen, welche Interrupts anstehen oder aktiviert sind und welche Hart-Kontexte sie beansprucht haben.