"Linux 장치 드라이버, 3판"을 읽고 있는데 인터럽트 핸들러를 설명하는 부분을 완전히 이해하지 못합니다. 나는 뭔가를 명확히하고 싶습니다 :
- Linux의 인터럽트 핸들러는 선점형이 아닌가요?
- Linux의 인터럽트 핸들러는 재진입이 불가능합니까?
상반신이 실행되는 한 인터럽트가 비활성화되어 핸들러가 다시 진입할 수 없다는 상하반 모델을 잘 이해하고 있다고 생각합니다.
하지만 우선순위가 높은 인터럽트는 어떻습니까? 기본 Linux 또는 특정 실시간 확장에서만 지원됩니까? 낮은 우선순위 인터럽트가 높은 우선순위 인터럽트에 의해 중단되면 어떻게 됩니까?
답변1
Linux 커널은 모든 UNIX 커널과 마찬가지로 재진입 가능합니다. 이는 CPU가 여러 프로세스를 실행할 수 있음을 의미합니다. 디스크 액세스 읽기가 극도로 느린 HDD 컨트롤러에 의해 처리될 때까지 기다릴 필요가 없습니다. CPU는 디스크 액세스가 완료될 때까지 다른 작업을 처리할 수 있습니다(그렇다면 자체적으로 인터럽트가 발생합니다).
일반적으로 인터럽트는 다른 인터럽트에 의해 중단(선점)될 수 있으며, 이를 "중첩 실행"이라고 합니다. 아키텍처에 따라 인터럽트를 완전히 비활성화하여 중단 없이(비선점형) 실행해야 하는 몇 가지 중요한 기능이 여전히 있습니다. x86에서는 시간 관련 함수( time.c
, hpet.c
) xen
등이 있습니다.
인터럽트에는 "모든 인터럽트 활성화" 또는 "모든 인터럽트 비활성화"라는 두 가지 우선 순위만 있으므로 "높은 우선 순위 인터럽트"가 두 번째인 것 같습니다. 이는 Linux 커널이 인터럽트 우선순위와 관련하여 알고 있는 유일한 동작이며 실시간 크기 조정과는 아무 관련이 없습니다.
인터럽트 가능한 인터럽트("낮은 우선순위 인터럽트")가 다른 인터럽트("높음" 또는 "낮음")에 의해 중단되면 커널은 인터럽트에 의해 중단된 이전 실행 코드를 저장하고 새 인터럽트 처리를 시작합니다. 이 "중첩"은 여러 번 발생할 수 있으므로 여러 수준의 중단이 발생합니다. 그 후 커널은 이전 인터럽트에서 저장된 코드를 다시 로드하고 이전 인터럽트를 완료하려고 시도합니다.
답변2
비선점형은 이러한 핸들러가 다른 인터럽트에 의해 중단될 수 없음을 의미합니다.
비선점형 핸들러의 경우 재진입은 문제가 되지 않습니다. 처음부터 이를 중단할 수 없기 때문입니다.
커널이 수행하는 작업에 대해서는 wag의 답변을 살펴보십시오. 저는 이 주제에 대해 그가 할 수 있는 것처럼 논평할 수 없습니다.