Menurut apa yang saya baca sejauh ini, "ketika kernel menerima interupsi, semua penangan terdaftar dipanggil."
Saya memahami bahwa penangan yang terdaftar untuk setiap IRQ dapat dilihat melalui /proc/interrupts
, dan saya juga mengerti bahwa penangan yang terdaftar berasal dari driver yang telah memanggil request_irq
lewat callback kira-kira dalam bentuk:
irqreturn_t (*handler)(int, void *)
Berdasarkan apa yang saya ketahui, masing-masing callback interrupt handler yang terkait dengan IRQ tertentu harus dipanggil, dan tergantung pada handler untuk menentukan apakah interupsi memang harus ditangani olehnya. Jika handler tidak menangani interupsi tertentu, ia harus mengembalikan makro kernel IRQ_NONE
.
Yang saya mengalami kesulitan memahami adalah, bagaimana masing-masing pengemudi diharapkan untuk menentukan apakah harus menangani interupsi atau tidak. Saya kira mereka dapat melacak secara internal jika mereka mengharapkan gangguan. Jika demikian, saya tidak tahu bagaimana mereka dapat menangani situasi di mana beberapa driver di belakang IRQ yang sama mengharapkan interupsi.
Alasan saya mencoba memahami detail ini adalah karena saya mengacaukan kexec
mekanisme untuk mengeksekusi ulang kernel di tengah operasi sistem sambil bermain dengan pin reset dan berbagai register pada PCIe bridge serta PCI downstream alat. Dan dengan melakukan itu, setelah reboot saya mendapatkan panik kernel, atau driver lain mengeluh bahwa mereka menerima interupsi meskipun tidak ada operasi yang terjadi.
Bagaimana pawang memutuskan bahwa interupsi harus ditangani olehnya adalah misteri.
Sunting: Dalam kasus itu relevan, arsitektur CPU yang dimaksud adalah x86
.