Zgodnie z tym, co przeczytałem do tej pory, „gdy jądro odbiera przerwanie, wywoływane są wszystkie zarejestrowane programy obsługi”.
Rozumiem, że zarejestrowane moduły obsługi dla każdego IRQ można przeglądać za pośrednictwem /proc/interrupts
, a także rozumiem, że zarejestrowane moduły obsługi pochodzą od sterowników, którzy wywołali request_irq
przekazanie wywołania zwrotnego w przybliżeniu w postaci:
irqreturn_t (*handler)(int, void *)
Na podstawie tego, co wiem, każde z tych wywołań obsługi przerwań związanych z danym przerwaniem IRQ powinno zostać wywołane i to od procedury obsługi zależy, czy przerwanie powinno być przez nią obsługiwane. Jeśli moduł obsługi nie obsługuje określonego przerwania, musi zwrócić makro jądra IRQ_NONE
.
Trudno mi zrozumieć, w jaki sposób każdy kierowca powinien ustalić, czy powinien obsłużyć przerwanie, czy nie. Przypuszczam, że mogą śledzić wewnętrznie, jeśli mają spodziewać się przerwy. Jeśli tak, nie wiem, jak poradziliby sobie z sytuacją, w której wielu kierowców stojących za tym samym IRQ spodziewa się przerwania.
Powodem, dla którego próbuję zrozumieć te szczegóły, jest to, że zadzieram z kexec
mechanizmem ponownego uruchamiania jądra w trakcie działania systemu podczas gry z pinami resetującymi i różnymi rejestrami na moście PCIe, a także z dalszym PCI urządzenie. Robiąc to, po restarcie albo wpadam w panikę jądra, albo inni kierowcy narzekają, że dostają przerwania, mimo że żadna operacja nie miała miejsca.
Tajemnica polega na tym, jak przewodnik zdecydował, że przerwanie powinno zostać obsłużone.
Edycja: W przypadku, gdy jest to istotne, rozważana jest architektura procesora x86
.