De acordo com o que li até agora, "quando o kernel recebe uma interrupção, todos os manipuladores registrados são chamados".
Entendo que os manipuladores registrados para cada IRQ podem ser visualizados via /proc/interrupts
, e também entendo que os manipuladores registrados são provenientes dos drivers que invocaram a request_irq
passagem em um retorno de chamada aproximadamente do formulário:
irqreturn_t (*handler)(int, void *)
Com base no que eu sei, cada um desses retornos de chamada do manipulador de interrupção associados ao IRQ específico deve ser chamado, e cabe ao manipulador determinar se a interrupção deve realmente ser tratada por ele. Se o manipulador não deve lidar com a interrupção específica, ele deve retornar a macro do kernel IRQ_NONE
.
O que estou tendo problemas para entender é como é esperado que cada driver determine se deve lidar com a interrupção ou não. Suponho que eles possam acompanhar internamente se deveriam esperar uma interrupção. Nesse caso, não sei como eles seriam capazes de lidar com a situação em que vários drivers por trás do mesmo IRQ estão esperando uma interrupção.
A razão pela qual estou tentando entender esses detalhes é porque estou mexendo com o kexec
mecanismo para reexecutar o kernel no meio da operação do sistema enquanto brinco com os pinos de redefinição e vários registradores em uma ponte PCIe, bem como uma PCI a jusante. dispositivo. E, ao fazer isso, após uma reinicialização, eu estou tendo pânico no kernel ou outros drivers reclamando que estão recebendo interrupções, mesmo que nenhuma operação esteja ocorrendo.
Como o manipulador decidiu que a interrupção deveria ser tratada por ele é o mistério.
Edit: Caso seja relevante, a arquitetura da CPU em questão é x86
.