Device Driver] 인터럽트_Interrupt
※.인터럽트 처리
IRQ(Interrupt Request)번호를 부여하려 인터럽트를 관리한다.
프로세스가 IRQ에서 인터럽트가 생성된 사실을 감지하면 하던 일을 중지하고,인터럽트 문맥에서 ISR(Interrupt Service Routine)을 호출한다.
(ISR은 H/W와 직접 대화하는 중요한 코드이다.)
인터럽트는 다른 작업을 중지시키면서 실행되는 우선시되는 작업인 만큼 그에 합당하는 제한이 따른다.
ㅡ.인터럽트 문맥에서 잠드는 코드는 불가능! (임계영역을 보호하려고 뮤텍스를 사용할 수 없다.)
ㅡ.사용자 영역과 직접 자료를 교환하지 못한다.(프로세스 문맥으로 사용자 영역과 연결되어 있음)
ㅡ.다른 작업을 방해하지 않도록 빠르고 완벽한 작업을 처리해야 한다.
(Top Half 에서 빠르게 처리~! 오래걸리는 작업은 Bottom Half 로넘긴다.) – Bottom Half에는 softirq, tasklet, work queue 가 있다.
ㅡ.인터럽트 처리기를 재진입 가능하게 만들 필요는 없다.
ㅡ.우선순위가 더 높고 IRQ와 관련이 있는 처리기는 인터럽트를 걸 수 있다.
※.인터럽트 실행여부 확인
in_interrupt() 를 호출했을 때 반환하는 값을 보고 인터럽트 문맥에서 실행여부를 확인 할 수 있다.
※.현재 운영중인 인터럽트 확인
$ cat /proc/interrupts
※.Bottom Half
인터럽트 처리기는 두부분(Top/Bottom Half)으로 나뉘어진다.
Top Half는 하드웨어와 상호작용을 하기에 빠르게 작업을 수행해야 한다.
Bottom Half는 가리지않고 작업을 수행한다.
이 Bottom Half 를 수행하는 녀석은 3가지방법(softirq, tasklet, work queue)으로 구현 가능하다.
ㅡ.softirq
대표적인 sorftirq는 system call이다
인터럽트 문맥에서 동작하고, 잠들면 안되고, 선점이 불가능 하다.
(사용하려면 system call 번호를 붙여줘야 하는 번거로움이~)
ㅡ.tasklet
사장되는 분위기다.(LKML에서 tasklet 제거에 대해서 토론이 진행중이라고 한다...)
ㅡ.work queue
프로세스 문맥에서 동작하고, 잠들기를 허용하고, 선점이 가능한 녀석이다.