Согласно тому, что я прочитал до сих пор, «когда ядро получает прерывание, все зарегистрированные обработчики вызываются».
Я понимаю, что зарегистрированные обработчики для каждого IRQ могут просматриваться через /proc/interrupts
, и я также понимаю, что зарегистрированные обработчики происходят от драйверов, которые вызвали request_irq
передачу обратного вызова примерно в форме:
irqreturn_t (*handler)(int, void *)
Исходя из того, что я знаю, должен быть вызван каждый из этих обратных вызовов обработчика прерываний, связанных с конкретным IRQ, и обработчик должен определить, действительно ли оно должно обрабатывать прерывание. Если обработчик не должен обрабатывать конкретное прерывание, он должен вернуть макрос ядра IRQ_NONE
.
Что мне трудно понять, так это то, как каждый драйвер должен определять, должен ли он обрабатывать прерывание или нет. Я предполагаю, что они могут отслеживать внутренне, если они ожидают прерывания. Если это так, я не знаю, как они могли бы справиться с ситуацией, в которой несколько водителей за одним IRQ ожидают прерывания.
Причина, по которой я пытаюсь понять эти детали, заключается в том, что я перебираю kexec
механизм повторного запуска ядра в середине работы системы, играя с выводами сброса и различными регистрами на мосту PCIe, а также в нисходящем PCI устройство. И при этом после перезагрузки у меня либо паника ядра, либо другие драйверы, жалующиеся на то, что они получают прерывания, даже если никакие операции не выполнялись.
Как обработчик решил, что прерывание должно обрабатываться им, остается загадкой.
Редактировать: В случае, если это актуально, рассматриваемая архитектура процессора x86
.