Ich gehe die Treiber-Kernelmodule im Linux-Kernel durch und normalerweise wird request_irq() von der Testfunktion aufgerufen. drivers/net/ethernet/natsemi/ns83820.ko kann ein solches Beispiel sein.
request_irq() ruft request_threaded_irq() auf und dies wird in den Kommentaren erwähnt:
This call allocates interrupt resources and enables the
interrupt line and IRQ handling. From the point this
call is made your handler function may be invoked.
Verknüpfung:https://elixir.bootlin.com/linux/latest/source/kernel/irq/manage.c#L1984
Das bedeutet, dass der Handler aufgerufen werden kann, noch bevor die Prüfung abgeschlossen ist.
Mir ist jedoch aufgefallen, dass bei vielen Treibern nicht auf gemeinsam genutzte Variablen oder Dev-Felder geachtet wird, die im Probe- und Interrupt-Handler gleichzeitig gelesen und geändert werden können.
Ich möchte wissen, wie oft der Fall auftritt, dass Probe und Interrupt-Handler parallel ausgeführt werden.
Antwort1
Der Interrupt-Handler kann aufgerufen werden, während Probe noch nicht fertig ist. Dazu muss das Gerät jedoch initialisiert werden und einen Interrupt generieren. Häufig initialisiert die Probe-Funktion zuerst das Gerät und stellt sicher, dass es keine Interrupts generiert, bevor es den IRQ anfordert. Dadurch wird sichergestellt, dass der Handler erst aufgerufen wird, wenn der Treiber bereit ist, die Interrupts zu verarbeiten.
Eine häufige Ausnahme sind die RTC-Treiber, und ich habe einige davon kürzlich repariert. Dies liegt daran, dass die RTC noch läuft, Linux jedoch nicht, und der Treiber das Gerät nicht bei jedem Booten neu initialisieren darf. Hier ist ein Beispiel: