4. 인터럽트 핸들러
Linux의 인터럽트 핸들러는 매우 독특합니다. 인터럽트 핸들러는 위쪽 부분과 아래쪽 부분으로 나뉩니다. 상하반이 있는 이유는 전적으로 인터럽트 처리의 효율성 때문이다.
상단의 기능은 "등록중단" 입니다. 인터럽트가 발생하면 장치 드라이버에 있는 인터럽트 루틴의 하위 절반을 장치 실행 큐의 하위 절반에 매달고 나면 괜찮습니다. 즉, 새 인터럽트가 도착할 때까지 기다리는 것입니다. 이런 식으로 상위 절반은 빠르게 실행될 것이며, 그는 그녀가 담당하는 장비로 인해 발생하는 더 많은 방해를 받아들일 수 있습니다. 윗부분이 더 빠른 이유는 인터럽트를 완전히 마스킹하기 때문이다. 실행이 끝나지 않으면 다른 인터럽트는 제때에 처리되지 못하고 인터럽트 핸들러가 실행될 때까지만 기다릴 수 있다. 따라서 장치에서 발생하는 인터럽트를 최대한 많이 서비스하고 처리하려면 인터럽트 핸들러가 빨라야 합니다.
그러나 일부 인터럽트 이벤트의 처리는 더 복잡하므로 인터럽트 핸들러는 작업을 완료하는 데 조금 더 시간을 소비해야 합니다. 그런데 복잡한 처리를 단시간에 완료해야 하는 모순을 어떻게 해결할 수 있을까? 이때 리눅스는 하반부라는 개념을 도입했다. 아래쪽 절반과 위쪽 절반의 가장 큰 차이점은 아래쪽 절반은 중단 가능하고 위쪽 절반은 중단 불가능하다는 것입니다.
하위 절반은 인터럽트 핸들러가 수행하는 거의 모든 작업을 수행합니다. 왜냐하면 상위 절반은 하위 절반을 자신이 담당하는 장치의 인터럽트 처리 대기열에 대기만 하고 아무 것도 신경 쓰지 않기 때문입니다. 하위 절반은 일반적으로 장치를 관찰하여 인터럽트를 생성하는 이벤트 정보를 얻고, 이 정보(보통 장치의 레지스터를 읽어 얻은 정보)를 기반으로 해당 처리를 수행하는 역할을 담당합니다. 후반이 어떻게 해야할지 모를 때가 있으면 유명한 타조 알고리즘을 사용하여 문제를 해결합니다. 직설적으로 말하면 이벤트를 무시합니다.
하반부는 인터럽트 가능하므로, 동작 중 다른 기기가 중단되면 해당 기기의 상단 실행이 끝날 때까지 하단이 일시적으로 중단될 수 있습니다. 그러나 한 가지 주의해야 할 점은 장치 인터럽트 핸들러가 실행 중인 경우 상위 절반 또는 하위 절반을 실행 중인지 관계없이 인터럽트 핸들러가 처리되지 않는 한 장치에서 새로운 인터럽트가 생성된다는 것입니다. 이 기간은 인터럽트가 무시됩니다. 인터럽트 핸들러는 재진입이 불가능하므로 동일한 인터럽트 핸들러를 병렬로 실행할 수 없습니다.
리눅스 커널 2.0 이전에는 인터럽트가 빠른 인터럽트와 느린 인터럽트로 구분되었습니다. (여기서는 의사 인터럽트에 대해서는 다루지 않겠습니다.) 빠른 인터럽트의 하위 절반도 인터럽트 불가능하므로 더 빠르게 실행됩니다. 그러나 하드웨어 수준이 계속 높아짐에 따라 빠른 인터럽트와 느린 인터럽트의 실행 속도에는 차이가 없습니다. 따라서 인터럽트 루틴 트랜잭션 처리의 효율성을 높이기 위해 Linux 커널 2.0부터 모든 인터럽트 핸들러가 포함됩니다. 느린 인터럽트의 형태 --하반부는 인터럽트될 수 있습니다.
그러나 후반부에는 특정 코드 부분을 중단할 수 없는 경우 중단을 마스크할 수도 있습니다. cti, sti 또는 save_flag, Restore_flag를 사용하여 아이디어를 실현할 수 있습니다. 사용법과 차이점은 본 글에서 지정한 참고서의 인터럽트 처리 부분을 참고하시기 바랍니다.
자세한 내용은 이 글에 명시된 참고서를 참조하시기 바랍니다. 여기서는 자세한 내용을 소개하는 것이 목적이 아닙니다.
5. 인터럽트 플래그 비트 설정
인터럽트를 처리할 때 인터럽트 컨트롤러는 보낸 마지막 인터럽트가 처리될 때까지 원래 인터럽트를 보낸 장치를 차단합니다. 따라서 인터럽트를 보낸 장치가 인터럽트 처리 중에 다른 인터럽트를 보내면 해당 인터럽트는 영원히 손실됩니다.
이런 현상이 발생하는 이유는 인터럽트 컨트롤러가 인터럽트 정보를 버퍼링할 수 없기 때문입니다. 따라서 현재 인터럽트가 처리되기 전에 새로운 인터럽트가 도착하면 반드시 새로운 인터럽트를 잃게 됩니다. 그러나 이 결함은 메인 프로세서(CPU)에 "set Interrupt Flag"(sti)를 설정하면 해결될 수 있습니다. 왜냐하면 메인 프로세서에는 인터럽트를 버퍼링하는 기능이 있기 때문입니다. "인터럽트 플래그 비트 설정"을 사용하면 sti 함수를 사용하여 인터럽트가 처리된 후 이전에 마스크된 인터럽트를 서비스할 수 있습니다.
위 내용은 Linux 장치 드라이버 인터럽트에 대한 심층 분석입니다(1)(2). 자세한 내용은 PHP 중국어 웹사이트(www.php.cn)를 참고하세요!