Nach dem, was ich bisher gelesen habe: "Wenn der Kernel einen Interrupt empfängt, werden alle registrierten Handler aufgerufen."
Ich verstehe, dass die registrierten Handler für jeden IRQ über angezeigt werden können /proc/interrupts
, und ich verstehe auch, dass die registrierten Handler von den Treibern stammen, die die request_irq
Übergabe eines Rückrufs in etwa in der Form aufgerufen haben :
irqreturn_t (*handler)(int, void *)
Basierend auf dem, was ich weiß, sollte jeder dieser Interrupt-Handler-Rückrufe, die dem bestimmten IRQ zugeordnet sind, aufgerufen werden, und es ist Sache des Handlers, zu bestimmen, ob der Interrupt tatsächlich von ihm behandelt werden soll. Wenn der Handler den bestimmten Interrupt nicht verarbeiten soll, muss er das Kernelmakro zurückgeben IRQ_NONE
.
Ich habe Probleme zu verstehen, wie jeder Treiber bestimmen soll, ob er den Interrupt behandeln soll oder nicht. Ich nehme an, sie können intern den Überblick behalten, wenn sie einen Interrupt erwarten sollen. Wenn ja, weiß ich nicht, wie sie mit der Situation umgehen können, in der mehrere Treiber hinter demselben IRQ einen Interrupt erwarten.
Der Grund, warum ich versuche, diese Details zu verstehen, ist, dass ich mit dem kexec
Mechanismus herumspiele, um den Kernel mitten im Systembetrieb erneut auszuführen, während ich mit den Reset-Pins und verschiedenen Registern auf einer PCIe-Brücke sowie einer nachgeschalteten PCI spiele Gerät. Und dabei bekomme ich nach einem Neustart entweder Kernel-Panics oder andere Treiber, die sich beschweren, dass sie Interrupts empfangen, obwohl keine Operation stattgefunden hat.
Wie der Handler entschieden hat, dass der Interrupt von ihm behandelt werden soll, ist das Rätsel.
Bearbeiten: Falls relevant, handelt es sich um die betreffende CPU-Architektur x86
.