인터럽트 처리 이해 기본 (basic understanding interrupt handling )
인터럽트 시리즈
- 인터럽트 처리 이해 기본 (basic understanding interrupt handling )
- 인터럽트 방식 비교 - Legacy, MSI, MSI-X
- 리눅스 커널 인터럽트 흐름 (Interrupt Flow)
하드웨어 인터럽트 컨트롤러(이하 컨트롤러)로부터 소프트웨어 인터럽트 핸들러에 이르기까지에 대한 논리적인 과정을 그림으로 표현하였다.
(The logical process from the hardware interrupt controller to the software interrupt handler is illustrated in the above diagram.)
IRQ는 전통적으로는 물리적인 전기선으로 이해될 수 있으며, 인터럽트 소스 (예: 키보드, 마우스, 스토리지, 네트워크 카드 등) 로부터 CPU에 이르는 길로 이해하면 된다. 현대적으로는 IRQ는 논리적인 라인으로 인터럽트를 CPU에 전달하는 역할을 한다.
1. IRR은 Interrupt Request Register로서 1-bit register이다. 즉 각 인터럽트가 현재 있는지/없는지만 인식하는데, 이는 이미 쌓인 인터럽트에 대한 중복된 인터럽트 핸들링이 발생하지 않을 것임을 의미한다.
2. IRR에 쌓인 인터럽트들은 우선순위(priority)를 가지며, 우선순위가 높은 인터럽트가 먼저 선택된다. 선택된 인터럽트는 mask 된다 (Mask register에 mask되었다고 표시된다). Mask 된다는 것의 의미는 disable 된다는 것이고, 해당 인터럽트가 컨트롤러에 의해 다시 선택되는 것을 방지한다. 즉, 처리중인 인터럽트를 또 처리하려고 하지 않는다.
3. 우선순위가 높아 선택된 인터럽트 신호는 CPU에게 보내진다. MSI, MSI-X 처럼 message based interrupt 일 수도 있고, legacy interrupt (물리적인 IRQ 라인을 통해 인터럽트 전달) 일 수도 있다.
4. 인터럽트를 받은 CPU는 해당 IRQ 번호에 맞는 interrupt service routine (ISR) 주소를 interrupt vector table (IVT) 에서 찾는다. CPU는 ISR 주소로 분기하여 ISR을 실행한다.
5. ISR은 인터럽트 핸들러이다. 인터럽트 핸들러에서는 먼저 해당 CPU core에 대한 IRQ를 disable 하여 (local_irq_disable()) 해당 CPU core에 대한 인터럽트 처리를 막는다 (인터럽트 처리중 다른 인터럽트를 막는다.). 그 후, 해당 IRQ에 대한 인터럽트를 핸들링한다. 핸들링 후 IRQ를 enable하여 해당 CPU core에게 인터럽트가 들어올 수 있도록 한다.
6. 마지막으로 CPU는 IRET (인터럽트 반환 명령어)를 실행하여 이전 실행 상태(context)로 복귀한다. 이 순간, 인터럽트 컨트롤러 내에서 해당 인터럽트 라인에 대한 mask가 풀려, 다시 인터럽트를 받을 수 있게 된다.

댓글
댓글 쓰기