본문 바로가기

Embedded/Device Driver

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
        프로세스 문맥에서 동작하고, 잠들기를 허용하고, 선점이 가능한 녀석이다.

'Embedded > Device Driver' 카테고리의 다른 글

linux/Documentation/driver-model/driver  (0) 2011.05.10
udev  (1) 2011.05.03
Kernel Timer 사용하기  (0) 2011.04.30
Device Driver] Kernel Facilities  (0) 2011.04.30
Device Driver] 커널 메시지 출력  (0) 2011.04.25