콘텐츠로 바로가기

Interrupts, Exceptions, and Trap Handling

외부 하드웨어 이벤트, 내부 오류, 그리고 의도된 시스템 요청이 CPU의 흐름을 어떻게 중단하고 커널의 처리 경로로 넘기는지 다루는 학습 노드입니다.

Article
M

Me

hyunyoun's Blog

operating-systems-system-mechanicsoperating-systemssystem-mechanicskernelsystem-interface-physicsinterruptsexceptionsand-trap-handling9 min read

1. Overview

인터럽트, 예외, 트랩 핸들링(Interrupts, Exceptions, and Trap Handling)은 순차적으로 실행되던 CPU의 제어 흐름이 마우스 클릭, 네트워크 패킷, 또는 0으로 나누기(Divide by Zero) 같은 이벤트를 만나 커널 공간의 처리 경로로 전환되는 방식을 다룹니다.

학습자는 하드웨어 장치에서 발생하는 **비동기 인터럽트(Asynchronous Interrupt)**와 명령어 실행 중 CPU 내부에서 발생하는 **동기 예외(Synchronous Exception, Fault/Trap)**의 차이를 이해합니다. 이어 CPU가 IDT(Interrupt Descriptor Table)를 참조해 커널 처리 함수로 이동하고, 긴 처리를 Top Half와 Bottom Half로 나누어 지연 처리(Deferred Work)하는 이유를 살핍니다.

2. Scope & Boundaries

In-Scope

  • 비동기 하드웨어 인터럽트 (Asynchronous IRQ): 키보드 타건, 타이머 틱(Timer Tick), 랜카드 패킷 수신, APIC(Advanced Programmable Interrupt Controller) 라우팅.
  • 동기 소프트웨어 예외 (Synchronous Exception): Fault (페이지 결함 복구 가능), Trap (디버깅 브레이크포인트), Abort (치명적 하드웨어 오류, 머신 체크).
  • 인터럽트 벡터 테이블 (Vector Table): IDT (Interrupt Descriptor Table), ISR (Interrupt Service Routine) 점프.
  • 분할 처리 철학 (Top/Bottom Half): Top Half (하드웨어 즉시 응답, 인터럽트 마스킹), Bottom Half (Tasklet, Workqueue, SoftIRQ 연기).

Out-of-Scope

  • 특정 칩셋의 배선과 회로 구현: 인텔 8259A PIC 칩의 핀 배열이나 ARM GIC의 하드웨어 게이트 회로망 \rightarrow 02-05-01. Microcontrollers & Bare-Metal 영역.
  • 태스크 단위의 스케줄링 이론: 인터럽트 처리가 끝나고 어떤 프로세스에게 CPU를 넘길지 정하는(CFS) 커널 스케줄러 자체 \rightarrow 03-02-03. CPU Scheduling Algorithms 영역.

Boundaries

  • Interrupt vs. System Call (03-01-02): 시스템 콜(03-01-02)이 사용자 프로그램이 커널 서비스를 명시적으로 요청하는 예측 가능한 Trap 경로라면, 하드웨어 인터럽트는 실행 중인 코드와 무관하게 외부 장치 이벤트가 CPU 제어 흐름을 커널 처리 경로로 전환시키는 비동기 경로입니다.

3. Counterexample

  • 인터럽트 내부의 무한 대기 (Blocking inside ISR): 키보드 인터럽트 함수(ISR) 안에서 while(buffer_full)처럼 버퍼 공간이 날 때까지 기다리거나 락(Lock) 대기를 수행하면 시스템 반응성이 크게 떨어집니다. 인터럽트 처리 중에는 다른 인터럽트가 제한될 수 있고, 긴 대기는 스케줄러 동작까지 지연시킬 수 있습니다. ISR은 필요한 최소 작업만 수행하고 빠르게 반환해야 합니다.
  • 오버헤드 붕괴와 폴링의 오해 (Interrupt Storm): 네트워크로 초당 많은 패킷이 들어올 때 패킷 하나마다 CPU 인터럽트를 발생시키면, [기존 작업 백업 \rightarrow ISR 점프 \rightarrow 복구] 비용이 과도하게 반복됩니다. 이런 상황에서는 인터럽트 기반 처리보다 폴링(NAPI)이나 DMA(직접 메모리 접근)를 함께 사용해 처리 비용을 줄이는 방식이 필요할 수 있습니다.

4. Prerequisites

  • CPU 레지스터와 스택 구조 (Basic): 문맥(Context)을 스택에 백업(Push)하고 ISR로 점프(Jump)하는 CPU 어셈블리 흐름을 이해해야 합니다. (02-01-02 CPU Architecture)
  • 커널 권한 링 (Basic): 인터럽트가 터지면 어떻게 유저 모드에서 커널 모드(Ring 0)로 강제 스위칭되는지 기초 개념이 필요합니다. (03-01-02 System Call Interface)

5. Learning Map

Sequence Core Cluster Objective & Description Evidence (BoK)
1 Sync vs Async Interrupts 외부 장치 이벤트와 코드 실행 중 발생하는 예외의 동기성 차이를 이해합니다. P1
2 The Vector Table (IDT) CPU가 벡터 번호(Vector)를 참조해 알맞은 커널 처리 함수로 이동하는 흐름을 살핍니다. P5
3 Context Save & Masking 중첩 인터럽트(Nested)를 제어하기 위해 문맥을 스택에 백업하고 인터럽트를 마스킹하는 이유를 이해합니다. Industry
4 Top Half vs Bottom Half ISR에서는 필요한 최소 작업만 처리하고 복잡한 계산은 Bottom Half로 넘기는 지연 처리 구조를 배웁니다. Industry

6. Learning Topics

Basic

Core Topic 01: 비동기 인터럽트와 동기 예외 (Interrupts vs Exceptions)

  • Why to Learn: CPU가 순차적으로 코드를 실행하는 중에도 외부 하드웨어 이벤트(네트워크 수신)와 내부 오류(메모리 접근 위반)에 대응할 수 있는 구조를 이해하기 위해서입니다.
  • What to Learn:
    • Concepts: 하드웨어 인터럽트(Asynchronous IRQ), 소프트웨어 예외(Synchronous Exception - Fault, Trap, Abort).
    • Skills: 페이지 폴트(Page Fault) 복구 흐름, 머신 체크(Machine Check) 패닉 분석.
    • Tools: 리눅스 커널 패닉(OOM, Null Pointer) 로그 분석.
    • Trade-offs: 하드웨어 인터럽트는 CPU 흐름을 끊고(Preemption) 반응성을 높이지만 시스템의 결정성(Determinism)을 낮출 수 있습니다. 코드가 유발한 예외(Fault)는 발생 지점이 명확하지만, 처리 결과로 프로세스 종료(Kill)가 필요할 수 있습니다.
  • How to Learn:
    • 1단계: 비동기(Interrupt): 사용자 앱이 for 루프를 실행하는 중 하드웨어 타이머가 "1밀리초 지남" 이벤트를 발생시키고 커널 스케줄러가 개입하는 흐름을 분석합니다.
    • 2단계: 동기(Exception): 사용자 앱이 10 / 0 연산을 수행하는 순간 CPU 산술유닛(ALU)이 Fault를 발생시키고 커널이 예외를 처리하는 흐름을 확인합니다.
  • Implement: 파이썬 try-except와 외부 시그널(Signal) 타이머를 모방합니다. x = 10 / 0에서 발생하는 ZeroDivisionError(동기적 Exception) 처리 로직과, 3초 뒤 백그라운드 스레드에서 os.kill()로 전달되는 KeyboardInterrupt(비동기적 Interrupt)의 실행 흐름 차이를 비교합니다.

Core Topic 02: 인터럽트 벡터 테이블 (IDT & Vector Table)

  • Why to Learn: 여러 장치(마우스, 키보드, 랜카드)가 동시에 이벤트를 발생시킬 때 CPU가 어떤 처리 함수를 실행해야 하는지 빠르게 결정하는 라우팅(Routing) 구조를 이해하기 위해서입니다.
  • What to Learn:
    • Concepts: IDT(Interrupt Descriptor Table), 인터럽트 벡터(Vector Number), ISR(Interrupt Service Routine), IRQ 라우터(APIC).
    • Skills: 어셈블리 레이블(Label) 주소 매핑, 인터럽트 핸들러 등록(Registration).
    • Tools: 리눅스 /proc/interrupts.
    • Trade-offs: 벡터 테이블 구조를 쓰면 어떤 인터럽트가 발생해도 테이블 인덱스(Vector * 8번지)로 O(1)O(1) 시간에 핸들러로 이동할 수 있습니다. 다만 256개의 테이블 슬롯 주소를 OS 부팅 시점에 정확히 설정하지 않으면 잘못된 주소로 점프해 Triple Fault가 발생할 수 있습니다.
  • How to Learn:
    • 1단계: 마우스를 움직이면 하드웨어 컨트롤러(APIC)가 CPU에 신호를 보내고 데이터 버스에 벡터 번호를 전달하는 흐름을 살핍니다.
    • 2단계: CPU가 현재 작업을 멈추고 램(RAM)의 IDT에서 해당 벡터 항목을 찾아, 그 안에 저장된 ISR 주소로 프로그램 카운터(PC)를 이동시키는 과정을 추적합니다.
  • Implement: 256칸짜리 리스트(IDT)를 파이썬 딕셔너리로 모사합니다. 각 인덱스에 특정 함수 주소(콜백)를 등록해 두고, Hardware_Signal_Emit(IRQ_Num=33) 이벤트가 발생하면 반복문이나 분기문(if-else) 없이 IDT[33]()를 직접 호출하는 O(1)O(1) 라우팅을 구현합니다.

Practical

Core Topic 03: 문맥 백업과 인터럽트 마스킹 (Context Save & Masking)

  • Why to Learn: 인터럽트를 처리하는 도중 다른 하드웨어 인터럽트가 다시 들어와 스택과 상태가 꼬이는 중첩(Nested) 문제를 제어하기 위해서입니다.
  • What to Learn:
    • Concepts: 인터럽트 마스킹(Masking), CLI(Clear Interrupt Flag), STI(Set Interrupt Flag), 문맥 백업(Context Save), NMI(Non-Maskable Interrupt).
    • Skills: 인터럽트 중첩(Nested Interrupt) 방어, 레지스터 푸시/팝(Push/Pop) 오버헤드.
    • Tools: OS 인터럽트 락(Lock) 매크로.
    • Trade-offs: ISR 진입 직후 인터럽트를 마스킹(CLI)하면 데이터 꼬임이나 스택 오버플로우 위험을 줄일 수 있습니다. 하지만 마스킹 시간이 길어지면 그동안 도착한 네트워크 패킷 처리가 지연되고, 패킷 손실이나 Latency Spike가 발생할 수 있습니다.
  • How to Learn:
    • 1단계: 사용자 앱이 쓰던 레지스터 값(EAX, EBX)을 커널 스택에 백업(Push)하고, ISR 실행 중 CPU의 인터럽트 수신 플래그(IF 플래그)를 0으로 내려 추가 인터럽트를 마스킹하는 흐름을 살핍니다.
    • 2단계: ISR 처리가 끝나면 IF 플래그를 다시 활성화(STI)하고, 스택에 저장했던 사용자 레지스터를 복원(Pop)해 사용자 앱으로 복귀하는 과정을 확인합니다. NMI(Non-Maskable Interrupt)가 이 마스킹을 우회할 수 있다는 점도 함께 다룹니다.
  • Implement: CPU_Interrupt_Enabled = True 플래그를 두고 ISR_Routine() 진입 즉시 플래그를 False로 바꿉니다. 이 상태에서 다른 스레드가 Trigger_Interrupt()를 여러 번 호출하면 return "Ignored"로 처리하고, ISR 종료 후 True로 복원되면 지연된 큐를 처리하는 로그를 출력합니다.

Advanced

Core Topic 04: 탑/바텀 하프와 지연 처리 (Top/Bottom Half & Tasklet)

  • Why to Learn: 인터럽트 처리(ISR) 시간이 길어지면 시스템 반응성이 떨어지므로, 즉시 처리해야 할 작업과 나중에 처리해도 되는 작업을 분리하는 리눅스 커널의 지연 처리 구조를 이해하기 위해서입니다.
  • What to Learn:
    • Concepts: 탑 하프(Top Half, Hard IRQ), 바텀 하프(Bottom Half, SoftIRQ/Tasklet/Workqueue), 지연된 인터럽트 처리(Deferred Processing).
    • Skills: NAPI(네트워크 폴링 혼합), 커널 스레드(Kernel Thread) 이양.
    • Tools: 리눅스 /proc/softirqs 지표 분석.
    • Trade-offs: 패킷 하나가 들어왔을 때 ISR 안에서 TCP 헤더 분석과 파일 쓰기까지 모두 처리하면 구현은 단순하지만 시스템 반응성이 떨어질 수 있습니다. 반대로 ISR에서는 버퍼 복사(1us)만 하고 나머지를 Bottom Half로 넘기면 반응성은 좋아지지만 패킷 처리 완료 시점은 늦어질 수 있습니다.
  • How to Learn:
    • 1단계: Top Half: 랜카드 인터럽트가 발생하면 하드웨어 버퍼에서 커널 램(RAM) 버퍼로 데이터를 복사하고, 추가 처리를 위한 SoftIRQ 플래그를 남긴 뒤 빠르게 반환하는 흐름을 확인합니다.
    • 2단계: Bottom Half: 인터럽트 처리가 끝난 뒤 커널이 SoftIRQ 플래그를 확인하고, 인터럽트가 허용된 상태에서 TCP 헤더 분석과 애플리케이션 전달을 수행하는 지연 처리(Deferred Work) 구조를 살핍니다.
  • Implement: Top_Half() 함수는 타임 스탬프 배열에 [Data, Time]append(1ms 소요) 하고 SoftIRQ_Queue에 신호를 남긴 뒤 반환합니다. 이후 메인 루프 스케줄러가 한가할 때(Idle) Bottom_Half_Tasklet()을 실행해 SoftIRQ_Queue에 쌓인 데이터를 하나씩 꺼내 JSON_Parsing(50ms 소요) 같은 무거운 연산을 처리합니다.

7. Terminology

Term (EN / ko, abbr) 1문장 정의 단계(기본/권장/실무/심화) 역할/맥락 관련 개념 유사/대비/함께 사용 오해 포인트 Evidence(Primary/Secondary/Industry) Flags(core)
Interrupt 주변 장치가 CPU에 특정 서비스를 즉시 요구하기 위해 보내는 물리적 전기 신호 또는 하드웨어 이벤트입니다. 기본 외부 이벤트 IRQ / ISR Exception '에러'만을 의미하지 않음 P1:CS2023 core
Exception CPU 내부에서 명령어를 실행하던 중 잘못된 연산이나 권한 위반으로 인해 스스로 발생하는 동기적 방해 이벤트입니다. 기본 내부 결함 Fault / Trap Interrupt '프로그램 오류'가 전부는 아님 P1:CS2023 core
IDT / IVT 각 인터럽트 번호에 대응하는 처리기(Handler)의 시작 주소를 담고 있는 하드웨어 참조 테이블입니다. 추천 주소 사상 Vector / Gate Jump Table 단순한 배열이 아닌 보안 관문 Industry/ARM core
ISR (인터럽트 서비스 루틴) 인터럽트 발생 시 이를 처리하기 위해 실행되는 커널 공간의 특수 목적 함수입니다. 추천 대응 코드 Handler / Context Callback 일반 함수처럼 호출 불가 P2:SWEBOK core

8. References

Primary

Secondary

  • [Understanding the Linux Kernel] Bovet & Cesati — Interrupt handling in practice.
  • [Operating Systems: Three Easy Pieces] Remzi — The trap and return mechanism.

Industry

  • [ARM: Exception and Interrupt Handling in ARMv8-A] — Industry standard implementation.
  • [Intel: Interrupt and Exception Handling (Vol. 3A)] — Comprehensive x86 reference.

9. Final Checklist

Primary

  • '인터럽트'와 '예외'의 발생 기점(내부 vs 외부)과 동기성 차이를 명확히 구분하여 설명 가능한가? (P1)
  • 인터럽트가 발생했을 때 하드웨어가 왜 현재 수행 중인 코드의 '명령어 포인터(PC)'를 가장 먼저 저장해야 하는지 설명할 수 있는가? (P1)

Secondary

  • ISR 내부에 'Print' 함수나 'Delay' 루틴을 넣었을 때 시스템 전체 타이밍이 왜 흔들리는지 설명할 수 있는가?
  • **인터럽트 마스킹(Masking)**을 통해 임계 영역(Critical Section)을 보호할 때, 이를 너무 길게 유지할 경우 발생하는 부작용을 도출할 수 있는가?

Industry

  • 실시간 데이터 수집 시스템 설계 시, 인터럽트 지연 시간(Latency)을 측정하고 이를 최소화하기 위한 'Top/Bottom Half' 분리 방안을 제안할 수 있는가? (SFIA)
  • 커널 보안 취약점 분석 시, 예외 처리기의 주소를 조작하여 권한을 탈취하는 'IDT Hooking'의 원리와 방어 기작을 기술할 수 있는가?

OS Kernel Architecture & Interface

4 / 4