6. 인터럽트 핸들러의 비재진입
이전 섹션에서 인터럽트를 마스크해야 하는 경우가 있다고 언급했는데, 이 인터럽트를 마스크해야 하는 이유는 무엇입니까? 이는 동일한 인터럽트 루틴을 병렬화하는 것이 기술적으로 불가능하기 때문이 아니라 관리 고려 사항 때문입니다. 인터럽트 처리 중에 동일한 IRQ의 새로운 인터럽트를 차단해야 하는 이유는 인터럽트 핸들러가 재진입이 아니기 때문에 동일한 인터럽트 핸들러가 병렬로 실행될 수 없기 때문입니다. 여기서는 예를 들어 인터럽트 핸들러를 병렬화할 수 있으면 드라이버 잠금이 발생할 가능성이 있음을 알 수 있습니다. 드라이버가 잠겨 있으면 운영 체제가 반드시 충돌하지는 않지만 잠긴 드라이버가 지원하는 장치는 더 이상 사용할 수 없습니다. 장치 드라이버가 죽으면 장치도 죽습니다.
PS1을 트리거하는 이벤트로 인해 A1이 인터럽트를 생성하고 B1이 R1의 기존 데이터를 읽은 다음 코드 C1이 R2에 데이터를 씁니다. PS2를 트리거하는 이벤트로 인해 A2는 인터럽트를 생성하고 B2는 R1의 데이터를 삭제한 다음 C2는 R2의 데이터를 읽습니다.
PS1이 먼저 생성되고 A1과 B1 사이에서 실행될 때 PS2가 생성되면 A2는 인터럽트를 생성하고 PS2를 인터럽트합니다(작업 대기열의 끝에 매달림). R1이 삭제되었습니다. PS2가 C2로 실행되면 C1이 아직 R2에 데이터를 쓰지 않았기 때문에 C2는 여기서 일시 중지되고 PS2는 데이터를 읽을 수 있을 때 신호에 의해 깨어날 때까지 코드 C2에서 절전 모드로 유지됩니다. 이는 PS1의 B2가 원래 읽으려고 했던 R1의 데이터가 PS2의 B2에 의해 삭제되었기 때문입니다. 따라서 PS1 페이지는 읽을 데이터가 있을 때 신호에 의해 깨어날 때까지 B1에서 절전 모드로 유지됩니다. 이렇게 하면 PS1과 PS2를 깨우는 이벤트가 절대 발생하지 않으므로 PS1과 PS2가 잠깁니다.
디바이스 드라이버는 디바이스 레지스터를 처리해야 하기 때문에 디바이스 레지스터가 전역 변수이기 때문에 재진입 코드를 작성하기가 어렵습니다. 따라서 가장 간단한 방법은 동일한 장치의 인터럽트 핸들러의 병렬성을 금지하는 것입니다. 즉, 해당 장치의 인터럽트 핸들러는 재진입이 불가능합니다.
한 가지 분명한 점은 Linux 커널 버전 2.0에서는 모든 상위 절반이 중단되지 않는다는 것입니다(상위 절반의 작업은 원자적임). 서로 다른 장치 섹션의 하위 절반이 서로를 중단할 수 있습니다. 특정 하단 절반은 그 자체로 중단될 수 없습니다(즉, 동일한 하단 절반은 병렬로 연결될 수 없습니다).
인터럽트 핸들러는 비재진입이 필요하므로 프로그래머는 재진입 코드 작성에 대해 걱정할 필요가 없습니다. 내 경험에 따르면 재진입 장치 드라이버를 작성하는 것은 가능하지만 재진입 인터럽트 핸들러를 작성하는 것은 매우 드물고 거의 불가능합니다.
7. 경쟁 조건 발생 방지
경합 조건이 발생하면 교착 상태가 발생할 수 있으며, 심한 경우 전체 시스템이 잠길 수 있다는 사실은 모두가 알고 있습니다. 따라서 경쟁 조건을 피하십시오. 여기서는 많이 말하지 않겠지만 모두들 한 가지만 주의하면 됩니다. 인터럽트로 인해 발생하는 대부분의 경쟁 조건은 인터럽트가 절전 모드로 전환되는 커널 프로세스에 의해 발생합니다. 따라서 인터럽트를 구현할 때 프로세스가 휴면 상태가 되도록 주의해야 합니다. 필요한 경우 cli, sti 또는 save_flag, Restore_flag를 사용할 수 있습니다. 구체적인 내용은 이 기사에 명시된 참고서를 참조하세요.
8. 구현
드라이버의 인터럽트 루틴을 구현하는 방법은 독자의 몫입니다. 짧은 루틴의 소스 코드를 주의 깊게 읽고 드라이버 인터럽트 루틴 작성 규칙을 이해한다면 자신만의 인터럽트 루틴을 작성할 수 있습니다. 개념이 정확하고 코드가 올바른 규칙에 따라 작성된다면 의미가 있습니다. 저는 항상 개념이 먼저이고 얼마나 많은 코드를 작성할 수 있는지는 그 다음이라고 강조합니다. 올바르게 생각하려면 올바른 개념이 있어야 합니다.
(T114)
위 내용은 Linux 장치 드라이버 인터럽트에 대한 심층 분석입니다(1)(3). 자세한 내용은 PHP 중국어 웹사이트(www. .php.cn)!