내 드라이버가 두 개의 서로 다른 IRQ 라인에서 두 개의 서로 다른 인터럽트를 수신해야 하는 시나리오가 있습니다. 두 개의 서로 다른 IRQ를 등록하고 단일 드라이버에 대해 두 개의 서로 다른 처리기를 설치할 수 있습니까? 이를 달성하는 가장 좋은 방법은 무엇입니까?
추신: 이것은 Linux 장치 드라이버이며 두 IRQ는 공유되지 않습니다.
답변1
두 개의 서로 다른 IRQ를 등록하고 단일 드라이버에 대해 두 개의 서로 다른 처리기를 설치합니다.
"그렇게 간단해요." "가능합니까?"에 대한 대답은 "예"입니다.
동일한 CPU의 장치 인터럽트 루틴은 서로 인터럽트하지 않습니다.
LDD3(지금은 꽤 오래된 것임)에 따르면 단일 인터럽트 루틴이 여러 CPU에서 동시에 실행되지 않도록 보장됩니다. 이것이 무엇을 의미하는지 잘 모르겠습니다. 타이머 인터럽트에 적용되는 것을 상상할 수 없습니다.
귀하의 드라이버에서는 서로 다른 인터럽트 루틴이 서로 다른 CPU에서 동시에 실행되기를 원합니다.
그러나 필요할 때 뮤텍스를 구현하는 일반적인 "spinlock irqsave"는 이 경우에도 여전히 잘 작동합니다.
테스트 시스템에서 NMI watchdog 및 lockdep이 활성화되어 있는지 다시 확인하는 것이 좋습니다 :). 인터럽트 루틴 중에 CPU가 회전 상태에 갇히면 NMI 감시가 트리거됩니다.
답변2
이것은 전적으로 가능합니다. 인터럽트 핸들러를 등록할 때 드라이버는 인터럽트가 트리거될 때 호출될 함수의 주소를 커널에 제공합니다. 드라이버는 원하는 만큼 많은 인터럽트를 설정할 수 있으며 모두 동일한 서비스 루틴을 가리킬 수도 있고 모두 자체 인터럽트(또는 다른 것들의 조합)를 가리킬 수도 있습니다.
바라보다이 답변인터럽트가 실제로 처리되는 방법에 대한 자세한 내용입니다.