반응형

전반부 처리와 후반부 처리

  • 빠른 실행 속도와 대량 작업 실행이라는 인터럽트의 2가지 목표는 서로 충돌하는 점이다.
  • 이 목표를 달성하기 위해 인터럽트 처리는 두 부분으로 나눠져 있다.
    (전반부 처리 top half 와 후반부 처리 bottom half)
  • 전반부 처리(top half)는 인터럽트를 받은 즉시 실행되며 인터럽트 수신확인이나 하드웨어 재설정 처리시한이 중요한 작업만 처리
  • 나중에 할 수 있는 일들은 후반부 처리(bottom half)로 지연 시킨다.

인터럽트 핸들러 등록

  • 인터럽트 핸들러는 하드웨어를 관리하는 드라이버가 담당한다
  • 드라이버는 <linux/interrupt.h> 파일에 정의된 request_irq() 함수를 이용하여 인터럽트를 활성화시키고 인터럽트 핸들러를 등록
  • 첫번째 irq 인자를 통해 할당할 인터럽트를 저장하다. 기본장치의 경우 번호가 할당되어 있지만 다른 장비들은 탐색 작업이나 프로그램에 따라 동적으로 할당된다.
  • 두번째 handler 인자는 인터럽트를 처리할 실제 인터럽트 핸드러를 가르키는 함수 포인트이다
  • typedef irqreturn_t (*irq_handler_t)(int, void *); 

  • 세번째 flag 인자는 0또는 <linux/interrupt.h>에 정의된 플래그를 조합한 비트마스크 값을 사용한다.
  1. IRQF_DISABLED
  2. IRQF_SAMPLE_RANDOM
  3. IRQF_TIMER
  4. IRQF_SHARED
  • 네번째 name 인자는 인터럽트를 사용하는 장비의 ASCII 형식 이름이다
  • 다섯번째 dev 인자는 인터럽트를 공유할 때 사용한다. 인터럽트 핸들러를 해제할 때 dev에 고유한 쿠키값을 지정함으로써 해당 인터럽트 라인에서 원하는 인터럽트 핸들러만을 제거 할 수 있다.
  • 성공하면 request_irq()는 0을 리턴하고 오류가 발생할 때는 0이 아닌값을 사용한다.
  • request_irq()는 휴면상태를 허용하기 때문에 인터럽트 컨텍스트에 있을 때나 코드 실행이 중단되는 상황에서는 호출 불가하다

 

반응형
반응형

커널은 각 장치와 통신을 해야 H/W를 관리할 수 있다. 일반적으로 H/W와 통신속도는 프로세서 속도보다 훨씬 느려서 느린 H/W가 응답할 때까지 커널이 요청을 보내고 기다리는 방식은 이상적이지 않다. H/W의 응답 속도는 매우 느리므로 커널은 다른 작업을 수행하다가 H/W가 실제로 작업을 마친 다음에 이를 처리 할 수 있다.

 

프로세스가 하드웨어를 관리하는 방법 중 하나는 Polling(폴링)이 있다. 커널이 주기적으로 시스템 하드웨어의 상태를 확인하고 그 상태에 따라 처리하는 것이다 . 더 좋은 방법은 커널 처리가 필요한 수간에 하드웨어가 커널 신호를 보낼 수 있는 체계를 두는 것이다. 이런 체계를 Interrupt(인터럽트)라고 한다.

 

인터럽트

  • 하드웨어는 인터럽트를 이용해 프로세서에 신호를 보낼 수 있다.
  • 하드웨어는 프로세스 클럭(Clock)과 상관없이 비동기적으로 인터럽트를 발생시키므로 인터럽트는 아무때나 발생할 수 있다.
  • 따라서 인터럽트 처리로 인해 커널은 언제라도 방해 받을 수 있다.
  • 각 인터럽트 별로 고유한 값을 할당할 수 있으며 장비에 따라 다른 인터럽트를 할당 할 수 있다.
  • 때문에 키보드에서 키보드와 하드디스크에서 발생한 인터럽트는 다르다.
  • 인터럽트 값을 인터럽트 요청(IRQ, interrupt request)라인이라고 하고 각 IRQ 라인에는 번호가 붙어 있다.
  • 요점은 장치별로 특정 인터럽트가 지정되어 있으며, 커널이 이 정보를 가지고 있다는 것이다.

예외(exception)

  • 인터럽트와 달리 예외는 프로세서 클럭과 동기되어 발생
  • 예외는 프로세서 클럭과 동기화 되어 발생한다. 또한 예외는 동기화된 인터럽트라고 부르는 경우가 많다.

인터럽트 핸들러

  • 인터럽트 핸들러(Interrupt handler) , 인터럽트 서비스 루틴 (ISR, Interrupt Service Routine) : 인터럽트를 처리하기 위해 커널이 실행하는 함수
  • 인터럽트를 발생 시키거나 각 장치별로 인터럽트 핸들러가 있다.
  • 리눅스의 인터럽트 핸들러는 일반적인 C함수이며 표준적인 방식으로 커널이 핸들러에 정보를 전달할 수 있게 정해진 함수 원형을 사용해야 한다는 점만 제외하면 보통함수와 다르지 않다.
  • 인터럽트 함수의 특징은 인터럽트가 발생했을 때 커널이 호출한다는 점과 인터럽트 컨텍스트 (interrupt context)라는 특별한 컨텍스트에서 실행된다는 점
  • 인터럽트는 언제라도 발생할 수 있으므로 인터럽트 핸들러도 언제든지 실행될 수 있다. 중단된 코드를 최대한 빨리 다시 실행하려면 핸들러의 실행 속도가 빨라야 한다.
  • 따라서 하드웨어 입장에서는 운영체제가 지체없이 처리하는 것이 중요하지만, 시스템의 다른 부분 입장에서는 인터럽트 핸들러의 실행시간이 가능한 짧은 것이 중요하다.

 

 

반응형

+ Recent posts