리눅스 인터럽트 예제

Postato il 2 Ago 2019 in Senza categoria

이 비트는 인터럽트를 장치 간에 공유할 수 있음을 나타냅니다. 공유의 개념은 이 장의 후반부 “인터럽트 공유”에 설명되어 있습니다. x86 아키텍처의 시스템 호출(한 가지 유형의 예외)은 커널에 트랩되어 특수 시스템 호출 처리기를 실행하게 하는 소프트웨어 인터럽트를 발행하여 구현됩니다. 인터럽트는 하드웨어(소프트웨어가 아닌) 문제 인터럽트를 제외하고 비슷한 방식으로 작동합니다. 리눅스는 스핀 록의 다른 유형, 이 경우에 대 한 판독기-작가 스핀 록 이라고. 이러한 잠금에는 rwlock_t 유형이 있으며 RW_LOCK_UNLOCKED로 초기화해야 합니다. 스레드 수에 관계없이 동시에 읽기 위해 잠금을 보유할 수 있습니다. 그러나 작성자가 함께 오면 단독 액세스 권한을 얻을 때까지 기다립니다. 프로세서가 인터럽트 요청을 받으면 어떻게 됩니까? 첫째, CPU는 인터럽트 플래그를 재설정하여 인터럽트를 자동으로 비활성화합니다. 인터럽트 처리가 완료되면 다시 활성화됩니다. 동시에 CPU는 중단 된 코드의 실행을 다시 시작할 수 있도록 하는 방식으로 사용자 모드에서 커널 모드로 CPU를 전환하는 데 필요한 최소한의 작업을 합니다.

CPU는 Linux 커널로 채워진 특수 CPU 제어 구조와 상의하여 컨트롤이 전달되는 코드 주소를 찾습니다. 이 주소는 Linux 커널의 일부인 인터럽트 처리기의 첫 번째 명령어의 주소입니다. 장치 드라이버에서 인터럽트를 사용하는 간단한 예입니다. 이것은 단지 기본입니다. 하드웨어를 사용해 볼 수도 있습니다. 나는 이것이 당신을 도움이 되기를 바랍니다. 리눅스 커널의 이전 버전은 `빠른`과 `느린`인터럽트를 구별하기 위해 큰 고통을했다. 빠른 인터럽트는 매우 빠르게 처리할 수 있는 반면 느린 인터럽트를 처리하는 데 는 훨씬 더 오랜 시간이 걸렸습니다. 느린 인터럽트는 프로세서가 처리되는 동안 인터럽트를 다시 사용할 가치가 있다고 충분히 요구할 수 있습니다.

그렇지 않으면 빠른 주의가 필요한 작업이 너무 오래 지연될 수 있습니다. 인터럽트 컨텍스트는 인터럽트 처리기가 다른 코드를 인터럽트하기 때문에 시간이 중요합니다. 마지막으로 SPARC 및 M68k 구현에서는 disable_irq 및 enable_irq 기호를 함수가 아닌 포인터로 정의합니다. 이 트릭을 사용하면 커널이 실행 중인 실제 플랫폼에 따라 부팅 시 포인터를 할당할 수 있습니다. 이 함수를 사용하는 C 언어 의미 체계는 이 트릭이 사용되는지 여부에 관계없이 모든 Linux 시스템에서 동일하므로 조건부 코딩의 지루한 코딩을 방지하는 데 도움이 됩니다. Linux 커널은 인터럽트 번호를 검색하기 위한 하위 수준 기능을 제공합니다. 비공유 인터럽트에만 작동하지만 공유 인터럽트 모드에서 작업할 수 있는 대부분의 하드웨어는 구성된 인터럽트 번호를 찾는 더 나은 방법을 제공합니다. 이 시설은 (또한 프로빙 기계를 설명합니다)에 선언된 두 개의 함수로 구성됩니다: Linux(다른 많은 시스템과 함께)는 인터럽트 처리기를 두 개의 절반으로 분할하여 이 문제를 해결합니다.

소위 상단 절반은 실제로 인터럽트에 응답하는 루틴입니다 – request_irq로 등록한 루틴입니다. 아래쪽 절반은 더 안전한 시간에 나중에 실행되도록 상위 절반으로 예약되는 루틴입니다. 2.4 커널에서 하위 절반이라는 용어를 사용하는 것은 인터럽트 처리기의 후반부 또는 이 하반기를 구현하는 데 사용되는 메커니즘 중 하나 또는 둘 다를 의미할 수 있다는 점에서 약간 혼란스러울 수 있습니다. 우리가 아래쪽 절반을 참조 할 때 우리는 일반적으로 아래쪽 절반에 대해 말하고있다; 이전 Linux 하단 절반 구현은 약어 BH와 명시적으로 참조됩니다. Linux에서 인터럽트를 가져오고 해제하는 요청은 requests_irq() 및 free_irq() 함수를 사용하여 수행됩니다: 인텔 프로세서는 IDT(인터럽트 설명자 테이블)를 사용하여 인터럽트를 처리합니다. IDT는 벡터와 8바이트에 해당하는 각 항목과 함께 256개의 항목으로 구성됩니다. 모든 항목은 인터럽트 처리 함수에 대한 포인터입니다.