Ich würde den PCI-Bustreiber in den Kernel verschieben und den bei einem PCI-Interrupt nachschauen lassen (das müsste irgendwo im Configspace der Devices stehen)
Ja, das steht dort, aber sehr mikrokernelig ist der Ansatz nicht. Selbst bei unserer noch sehr weit gefassten Definition von Mikrokernel.
Wenn man PCI extern behält, sehe ich nur zwei Lösungen: Entweder direkt alle für den IRQ registierten Treiber benachrichtigen oder erstmal an den PCI-Treiber schicken und der verteilt dann weiter, wie es passt. Letzteres dürfte aber etwas langsam werden.
Wenn Device A einen IRQ auslöst und dieser im IRQ-Controller durch den IRQ-Handler abgehackt ist wartet der IRQ-Controller bis das IRQ-Signal wieder verschwindet. Wenn während dessen Device B, das leider am selben IRQ hängt, ebenfalls einen IRQ signalisiert sieht der IRQ-Controller das nicht das die beiden Signale ja verodert werden.
Wann wartet der Interruptcontroller worauf? Wie ich das verstanden habe: Wenn das Signal da ist und der Interrupt nicht maskiert ist, wird halt gefeuert, fertig. Nachdem der Treiber für A den IRQ verarbeitet hat, sendet er kein IRQ-Signal mehr (Kann mir mal jemand mit einer Übersetzung für "deassert" helfen? Danke.
), aber das Signal von B ist nach wie vor an. Sobald das OS den Interrupt also wieder demaskiert, feuert der Interruptcontroller nochmal.
Alles unter der Voraussetzung natürlich, dass alles level triggered ist. Bei edge triggered musst du wohl zwangsläufig alle Treiber informieren, die an dem IRQ hängen, und den EOI senden bevor du die Treiber aufrufst.