Згідно з тим, що я читав до цього часу, "коли ядро отримує переривання, викликаються всі зареєстровані обробники".
Я розумію, що зареєстровані обробники для кожного IRQ можна переглядати через /proc/interrupts
, а також я розумію, що зареєстровані обробники походять від драйверів, які викликали request_irq
передачу у зворотному дзвінку приблизно такої форми:
irqreturn_t (*handler)(int, void *)
Виходячи з того, що мені відомо, кожен із цих зворотних викликів обробника переривань, пов'язаних із конкретним IRQ, повинен викликатись, і саме обробник повинен визначити, чи дійсно він повинен обробляти переривання. Якщо обробник не повинен працювати з певним перериванням, він повинен повернути макрос ядра IRQ_NONE
.
Що у мене виникають проблеми з розумінням, це те, як очікується, що кожен водій повинен визначити, чи повинен він працювати з перериванням чи ні. Я гадаю, що вони можуть постійно відслідковувати, якщо їх очікує перерва. Якщо так, я не знаю, як вони зможуть впоратися з ситуацією, коли кілька водіїв, що стоять за одним IRQ, очікують перерви.
Причина, що я намагаюся зрозуміти ці деталі, полягає в тому, що я псуюся з kexec
механізмом повторного виконання ядра в середині системної роботи, граючи з шпильками для скидання та різними регістрами на мосту PCIe, а також з PCIe вниз за потоком. пристрій. При цьому після перезавантаження я або отримую паніку з ядром, або інші драйвери, які скаржаться, що вони отримують перебої, хоча жодна операція не проводилася.
Як обробник вирішив, що переривання має вирішуватись, це таємниця.
Редагувати: Якщо це доречно, йдеться про архітектуру процесора x86
.