지금까지 읽은 내용에 따르면 "커널이 인터럽트를 수신하면 등록 된 모든 핸들러가 호출됩니다."
각 IRQ에 대해 등록 된 핸들러는을 통해 볼 수 있으며 /proc/interrupts
등록 된 핸들러는 request_irq
대략 콜백을 전달 하는 드라이버에서 나온 것임을 이해합니다 .
irqreturn_t (*handler)(int, void *)
내가 아는 것을 기반으로 특정 IRQ와 관련된 각 인터럽트 처리기 콜백을 호출해야하며, 인터럽트가 실제로 처리해야하는지 여부를 결정하는 것은 처리기의 책임입니다. 핸들러가 특정 인터럽트를 처리하지 않으면 커널 매크로를 반환해야합니다 IRQ_NONE
.
내가 이해하는 데 어려움이있는 것은 각 드라이버가 인터럽트를 처리 해야하는지 여부를 결정하는 방법입니다. 인터럽트를 예상 해야하는 경우 내부적으로 추적 할 수 있다고 생각합니다. 그렇다면 같은 IRQ 뒤에있는 여러 드라이버가 인터럽트를 예상하는 상황을 어떻게 처리 할 수 있을지 모르겠습니다.
내가이 세부 사항을 이해하려고하는 이유 kexec
는 PCIe 브리지 및 다운 스트림 PCI에서 리셋 핀과 다양한 레지스터를 사용하면서 시스템 작동 중에 커널을 다시 실행 하는 메커니즘을 망쳐 놓기 때문 입니다. 장치. 그리고 그렇게하면 재부팅 후 커널 패닉이 발생하거나 다른 드라이버가 아무런 작업도 일어나지 않아도 인터럽트를 받고 있다고 불평합니다.
핸들러가 인터럽트를 처리해야한다고 결정한 방법은 미스터리입니다.
편집 : 관련이있는 경우 문제의 CPU 아키텍처는 x86
입니다.