IRQ

하드웨어 장치가 CPU에 인터럽트를 요청하기 위해 보내는 신호(번호)로, 각 장치를 식별하는 고유한 인터럽트 요청 라인입니다.

핵심 개념

항목내용
정식 명칭Interrupt Request
역할장치가 "처리할 이벤트가 있다"고 CPU에 알리는 신호
할당 방식장치마다 고유 IRQ 번호 부여
전달 경로장치 → IRQ 라인 → 인터럽트 컨트롤러 → CPU

IRQ vs 벡터 번호

두 번호는 다른 개념이며, 인터럽트 컨트롤러가 IRQ를 벡터 번호로 변환합니다.

항목IRQ 번호벡터 번호
부여 주체하드웨어/OSCPU 아키텍처
용도장치 식별IDT에서 핸들러 조회
범위0~15 (PIC), 수백 개 (APIC)0~255
관계IRQ + 오프셋 = 벡터 번호-
IRQ 번호 → 벡터 번호 변환 (PIC 기준, 오프셋 32)

IRQ 0  → 벡터 32  (타이머)
IRQ 1  → 벡터 33  (키보드)
IRQ 14 → 벡터 46  (디스크)

변환 공식: 벡터 번호 = IRQ 번호 + 32
(벡터 0~31은 CPU 예외용으로 예약)

전통적 IRQ 할당 (PIC 8259A)

마스터 PIC (IRQ 0~7)           슬레이브 PIC (IRQ 8~15)
┌──────┬────────────────┐    ┌──────┬─────────────────┐
│ IRQ  │ 장치            │    │ IRQ  │ 장치             │
├──────┼────────────────┤    ├──────┼─────────────────┤
│  0   │ 시스템 타이머    │    │  8   │ RTC (실시간 시계) │
│  1   │ 키보드          │    │  9   │ (가용/ACPI)      │
│  2   │ 슬레이브 PIC 연결│    │ 10   │ (가용)           │
│  3   │ COM2 (직렬포트)  │    │ 11   │ NIC (네트워크)   │
│  4   │ COM1 (직렬포트)  │    │ 12   │ PS/2 마우스      │
│  5   │ LPT2 / 사운드   │    │ 13   │ FPU (수학보조)   │
│  6   │ 플로피 디스크    │    │ 14   │ Primary IDE     │
│  7   │ LPT1 (프린터)   │    │ 15   │ Secondary IDE   │
└──────┴────────────────┘    └──────┴─────────────────┘

IRQ 동작 흐름

키보드 'A' 입력
    │
    ▼
키보드 컨트롤러가 IRQ1 라인에 신호 발생
    │
    ▼
인터럽트 컨트롤러 (PIC/APIC)
    ├── IRQ1 수신
    ├── 마스킹 확인 (비활성화 여부)
    ├── 우선순위 확인 (현재 처리 중인 IRQ보다 높은지)
    └── CPU에 INTR 신호 + 벡터 번호(33) 전달
    │
    ▼
CPU
    ├── 현재 명령어 완료
    ├── IF 플래그 확인
    ├── 상태 저장
    └── IDT[33] → 키보드 ISR 실행
    │
    ▼
ISR 완료 → EOI 전송 → 인터럽트 컨트롤러가 IRQ1 다시 수신 가능

IRQ 공유

PIC 시대에는 IRQ가 15개뿐이라 여러 장치가 하나의 IRQ를 공유해야 했습니다.

항목IRQ 전용IRQ 공유
장치 수IRQ당 1개IRQ당 여러 개
처리 방식해당 ISR 바로 실행등록된 모든 ISR을 순회하며 확인
성능빠름ISR 체인 순회 오버헤드
트리거Edge TriggerLevel Trigger (공유 시 필수)
[IRQ 전용]
IRQ11 → NIC ISR 실행

[IRQ 공유]
IRQ11 → NIC ISR: "내 장치야?" → Yes → 처리
      → 사운드 ISR: "내 장치야?" → No → 무시
      → USB ISR: "내 장치야?" → No → 무시

Edge Trigger vs Level Trigger

항목Edge TriggerLevel Trigger
감지 방식신호가 Low→High로 변하는 순간신호가 High인 동안 계속
장점단순, 빠름IRQ 공유 가능, 인터럽트 유실 없음
단점IRQ 공유 어려움, 유실 가능처리 안 하면 계속 인터럽트 발생
사용레거시 PICPCI, APIC
[Edge Trigger]
신호: ___/‾‾‾‾\___
         ↑ 이 순간만 감지

[Level Trigger]
신호: ___/‾‾‾‾‾‾‾\___
         ↑───────↑ High인 동안 계속 감지

현대 시스템: MSI/MSI-X

현대 PCIe 장치는 물리적 IRQ 핀 대신 MSI(Message Signaled Interrupts)를 사용합니다.

항목전통적 IRQMSI/MSI-X
전달 방식물리적 핀 신호메모리 쓰기 메시지
IRQ 공유필요 (핀 부족)불필요 (장치별 고유 벡터)
벡터 수MSI: 최대 32, MSI-X: 최대 2048-
성능IRQ 공유 시 오버헤드빠르고 정확
[전통적 IRQ]
장치 ──물리적 핀──→ I/O APIC → Local APIC → CPU
                    (IRQ 공유 가능)

[MSI]
장치 ──메모리 쓰기──→ Local APIC → CPU
                    (장치별 고유 벡터, 공유 불필요)

Linux에서 IRQ 확인

# /proc/interrupts로 IRQ 할당 현황 확인
$ cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3
  0:         38          0          0          0   IO-APIC   0-edge      timer
  1:          2          0          0          3   IO-APIC   1-edge      i8042 (키보드)
  8:          1          0          0          0   IO-APIC   8-edge      rtc0
 14:          0          0          0          0   IO-APIC  14-edge      ata_piix
 19:       1205        302        198        287   IO-APIC  19-level     eth0 (NIC)

CSLOG에서 보기