IRQ
하드웨어 장치가 CPU에 인터럽트를 요청하기 위해 보내는 신호(번호)로, 각 장치를 식별하는 고유한 인터럽트 요청 라인입니다.
핵심 개념
| 항목 | 내용 |
| 정식 명칭 | Interrupt Request |
| 역할 | 장치가 "처리할 이벤트가 있다"고 CPU에 알리는 신호 |
| 할당 방식 | 장치마다 고유 IRQ 번호 부여 |
| 전달 경로 | 장치 → IRQ 라인 → 인터럽트 컨트롤러 → CPU |
IRQ vs 벡터 번호
두 번호는 다른 개념이며, 인터럽트 컨트롤러가 IRQ를 벡터 번호로 변환합니다.
| 항목 | IRQ 번호 | 벡터 번호 |
| 부여 주체 | 하드웨어/OS | CPU 아키텍처 |
| 용도 | 장치 식별 | 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 Trigger | Level Trigger (공유 시 필수) |
[IRQ 전용]
IRQ11 → NIC ISR 실행
[IRQ 공유]
IRQ11 → NIC ISR: "내 장치야?" → Yes → 처리
→ 사운드 ISR: "내 장치야?" → No → 무시
→ USB ISR: "내 장치야?" → No → 무시
Edge Trigger vs Level Trigger
| 항목 | Edge Trigger | Level Trigger |
| 감지 방식 | 신호가 Low→High로 변하는 순간 | 신호가 High인 동안 계속 |
| 장점 | 단순, 빠름 | IRQ 공유 가능, 인터럽트 유실 없음 |
| 단점 | IRQ 공유 어려움, 유실 가능 | 처리 안 하면 계속 인터럽트 발생 |
| 사용 | 레거시 PIC | PCI, APIC |
[Edge Trigger]
신호: ___/‾‾‾‾\___
↑ 이 순간만 감지
[Level Trigger]
신호: ___/‾‾‾‾‾‾‾\___
↑───────↑ High인 동안 계속 감지
현대 시스템: MSI/MSI-X
현대 PCIe 장치는 물리적 IRQ 핀 대신 MSI(Message Signaled Interrupts)를 사용합니다.
| 항목 | 전통적 IRQ | MSI/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)