내가 아는 한, Linux에는 "빠른 인터럽트"가 있습니다. 즉, SA_INTERRUPT 플래그로 요청된 빠른 인터럽트는 현재 CPU에서 다른 모든 인터럽트가 비활성화된 상태에서 실행됩니다. 그러나 일반적인 인터럽트 핸들러 동작과 어떻게 (그리고 어디에서) 다릅니까?
답변1
오늘부터 기본적으로 flag 에 대해서는 잊어도 됩니다 SA_INTERRUPT
.
~ 사이2.6.182.6.24 새로운 플래그에 대한 마이그레이션 도우미일 뿐입니다 IRQF_DISABLED
.
2.6.24 모든 SA_*
플래그를 제거하고 다음으로 교체했습니다.IRQF_*
배너.
2.6.35 이 "new" 플래그를 다음과 같이 표시하십시오.더 이상 사용되지 않음.
2.6.18 이전 커널을 사용하고 있다면 아마도 사용하지 않을 것입니다(Justin의 답변 참조).
IRQF_DISABLE
오늘날에는 다양한 아키텍처가 다르게 사용됩니다. x86은 여전히 시간이 중요한 기능( time.c
, hpet.c
)과 몇 가지 작업 에만 이를 사용합니다 xen
.
차이점은 일반 인터럽트는 다른 인터럽트(선점)에 의해 중단될 수 있지만 "빠른" 인터럽트는 불가능하다는 것입니다.
답변2
좋은 글이 있네요여기:
이전 버전의 Linux 커널에서는 "빠른" 인터럽트와 "느린" 인터럽트를 구별하는 데 어려움을 겪었습니다. 빠른 인터럽트는 매우 빠르게 처리될 수 있는 반면, 느린 인터럽트는 처리하는 데 더 오랜 시간이 걸립니다. 느린 인터럽트는 프로세서에 매우 부담이 될 수 있으므로 인터럽트를 처리할 때 인터럽트를 다시 활성화하는 것이 좋습니다. 그렇지 않으면 빠른 집중이 필요한 작업이 너무 오랫동안 지연될 수 있습니다.
최신 커널에서는 빠른 인터럽트와 느린 인터럽트 간의 차이점이 대부분 사라졌습니다. 단 한 가지 경우만 남습니다. 빠른 인터럽트(SA_INTERRUPT 플래그를 사용하여 요청된 인터럽트)는 현재 프로세서에서 다른 모든 인터럽트가 비활성화된 상태로 실행됩니다. 두 프로세서가 동시에 동일한 IRQ를 처리하는 것을 볼 수는 없지만 다른 프로세서는 여전히 인터럽트를 처리할 수 있습니다.
그렇다면 드라이버는 어떤 유형의 인터럽트를 사용해야 할까요? 최신 시스템에서 SA_INTERRUPT는 타이머 인터럽트와 같은 몇 가지 특정 경우에만 작동합니다. SA_INTERRUPT는 다른 인터럽트가 비활성화된 상태에서 인터럽트 핸들러를 실행할 타당한 이유가 없는 한 사용해서는 안 됩니다.
따라서 유일한 차이점은 언급한 것입니다. 빠른 인터럽트 핸들러는 더 빠른 성능을 위해 다른 모든 인터럽트 핸들러가 비활성화된 상태에서 실행됩니다.
답변3
ARM Cortex A57을 보고 있습니다. ARM 아키텍처에서 빠른 인터럽트에는 8개의 전용 레지스터가 있으므로 인터럽트가 들어오고 나갈 때 컨텍스트 전환 시간이 최소화됩니다. 우리 SOC 공급업체가 제공할 Linux에 통합될 것인지 또는 어떻게 통합될 것인지 아직 모르겠습니다(결국 그렇게 한다고 가정).