Según lo que he leído hasta ahora, "cuando el núcleo recibe una interrupción, se invocan todos los controladores registrados".
Entiendo que los controladores registrados para cada IRQ se pueden ver a través de /proc/interrupts
, y también entiendo que los controladores registrados provienen de los controladores que han invocado request_irq
pasar una devolución de llamada aproximadamente del formulario:
irqreturn_t (*handler)(int, void *)
En base a lo que sé, cada una de estas devoluciones de llamada del controlador de interrupciones asociadas con la IRQ particular debe invocarse, y depende del controlador determinar si la interrupción debe ser manejada por ella. Si el controlador no debe manejar la interrupción particular, debe devolver la macro del núcleo IRQ_NONE
.
Lo que tengo problemas para entender es cómo se espera que cada controlador determine si debe manejar la interrupción o no. Supongo que pueden realizar un seguimiento interno si se supone que esperan una interrupción. Si es así, no sé cómo podrían lidiar con la situación en la que varios conductores detrás del mismo IRQ esperan una interrupción.
La razón por la que estoy tratando de entender estos detalles es porque estoy jugando con el kexec
mecanismo para volver a ejecutar el kernel en medio de la operación del sistema mientras juego con los pines de reinicio y varios registros en un puente PCIe, así como un PCI descendente dispositivo. Y al hacerlo, después de un reinicio, recibo pánico en el kernel u otros controladores quejándose de que están recibiendo interrupciones a pesar de que no se realizó ninguna operación.
Cómo el manejador decidió que la interrupción debería ser manejada por él es el misterio.
Editar: en caso de que sea relevante, la arquitectura de la CPU en cuestión es x86
.