달력

2

« 2025/2 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

'OS이야기'에 해당되는 글 86

  1. 2011.10.13 인터럽트 핸들링구현
2011. 10. 13. 18:20

인터럽트 핸들링구현 OS이야기2011. 10. 13. 18:20

디바이스는 인터럽트 컨트롤러와 연결된 버스에 전기적 신호를 보냄으로써 인터럽트를 발생키니다.
만약 인터럽트 번호가 사용가능하게 되어 있다면(특정 번호만 사용가능하도록 마스크 할 수 있다), 인터럽트 컨트롤러는 발생한ㄴ터럽트를 프로세서로 전달한다.
대부분의 아키텍쳐에서 프로세서로의 시그널 전달은 특정 핀으로 시그널을 전달함으로써 이뤄진다. 프로세서에서 인터럽트가 비활성화 되어 있지 않다면, 프로세서는 즉시 하던일을 중지하고 인터럽트  시스템을 비활성화한 다음, 미리 지정된 메모리의 특정 위치로 점프하여 그곳에 있는 코드를 실행한다.
이러한 코드는 커널에 의해 미리 지정되어 있는데 바로 이것이 인터럽트 핸들러의 시작점이다. 

커널은 각 인터럽트에 메모리 상의 고유한 시작위치로 점프한 거기게 위치한 코드를 실행한다.
이렇게 하여 커널은 IRQ번호와 어떤 인터럽트가 발생했는가를 알 수 있다.
이 지점에서 커널은 단순히 이 값들과 현재 레지스터 값들을 스택에 저장한다. 그 다음, 커널은 do_IRQ()를 호출한다.
이 다음부터의 인터럽트 핸들링 코드는 C로 작성되어 있지만 여전히 아키텍쳐에 종속적이다.

  29asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs)
  30{
  31        struct pt_regs *old_regs;
  32        old_regs = set_irq_regs(regs);
  33        irq_enter();
  34
  35#ifdef CONFIG_DEBUG_STACKOVERFLOW
  36        /* FIXME M32R */
  37#endif
  38        generic_handle_irq(irq);
  39        irq_exit();
  40        set_irq_regs(old_regs);
  41
  42        return 1;
  43}

do_IRQ()는 해당 번호에 유효한 핸들러가 등록되어 있는가를 확인하고 그 인터럽트가 활성화 되었으며 핸재 실행중이 아님을 확인한다.
만약 이 조건든ㄹ이 만족된다면 커널은 hardware_IRQ_event()를 호출하여 해당 번호에 등록된 인터럽트 핸들러를 작동시킨다.
 

'OS이야기' 카테고리의 다른 글

softirq 구현, 핸들러, 실행  (0) 2011.10.13
Bottom Half  (0) 2011.10.13
인터럽트 컨텍스트  (0) 2011.10.13
실제 인터럽트 핸들러  (0) 2011.10.13
load_balance()  (0) 2011.10.13
:
Posted by НooпeУ


Code Start Code End