인터럽트 컨트롤러
CPU 외부의 하드웨어 장치들이 보내는 인터럽트 요청(IRQ)을 수집하고, 우선순위를 판단하여 CPU에 전달하는 중재 역할의 하드웨어입니다.
왜 필요한가?
CPU의 인터럽트 핀은 제한적인데, 인터럽트를 발생시키는 장치는 다수입니다. 여러 장치가 동시에 인터럽트를 보낼 수 있으므로, 이를 정리·우선순위 판단·전달하는 중재자가 필요합니다.
인터럽트 컨트롤러가 없다면?
[인터럽트 컨트롤러 없이]
키보드 ──→ CPU 핀1
디스크 ──→ CPU 핀2 ← CPU 핀 수가 부족하고
NIC ──→ CPU 핀3 동시 요청 시 처리 불가
타이머 ──→ CPU 핀4
마우스 ──→ ??? ← 핀이 모자람
[인터럽트 컨트롤러 있을 때]
키보드 ─┐
디스크 ─┤ INTR
NIC ─┼→ 인터럽트 컨트롤러 ─────→ CPU (핀 1개로 충분)
타이머 ─┤ (우선순위 판단)
마우스 ─┘
핵심 역할
| 역할 | 설명 |
| IRQ 수집 | 여러 장치의 인터럽트 요청을 한곳에서 수신 |
| 우선순위 판단 | 동시에 여러 IRQ 발생 시 어떤 것을 먼저 전달할지 결정 |
| CPU 전달 | INTR 핀을 통해 CPU에 인터럽트 발생 알림 |
| 벡터 번호 전달 | CPU가 IDT에서 핸들러를 찾을 수 있도록 벡터 번호 제공 |
| 마스킹 | 특정 IRQ를 일시적으로 비활성화 |
| EOI 처리 | ISR 완료 후 End of Interrupt 신호를 받아 다음 인터럽트 허용 |
PIC (8259A) — 레거시
| 항목 | 내용 |
| 정식 명칭 | Programmable Interrupt Controller |
| 지원 IRQ | 마스터 8개 + 슬레이브 8개 = 15개 (IRQ2는 캐스케이드용) |
| 멀티코어 | 미지원 (단일 CPU에만 전달) |
| 우선순위 | 고정 (IRQ 번호가 낮을수록 높음) |
[PIC 8259A 캐스케이드 구조]
마스터 PIC 슬레이브 PIC
┌───────────────┐ ┌───────────────┐
IRQ0 ──→ │ 0: 타이머 │ │ 8: RTC │ ←── IRQ8
IRQ1 ──→ │ 1: 키보드 │ │ 9: (가용) │ ←── IRQ9
│ 2: ←캐스케이드──│────────────│ │
IRQ3 ──→ │ 3: COM2 │ │10: (가용) │ ←── IRQ10
IRQ4 ──→ │ 4: COM1 │ │11: NIC │ ←── IRQ11
IRQ5 ──→ │ 5: LPT2 │ │12: PS/2 마우스 │ ←── IRQ12
IRQ6 ──→ │ 6: 플로피 │ │13: FPU │ ←── IRQ13
IRQ7 ──→ │ 7: LPT1 │ │14: Primary IDE│ ←── IRQ14
└───────┬───────┘ │15: Secondary │ ←── IRQ15
│ INTR └───────────────┘
▼
CPU
APIC — 현대 시스템
| 항목 | 내용 |
| 정식 명칭 | Advanced Programmable Interrupt Controller |
| 구성 | I/O APIC (장치 → 수신) + Local APIC (코어별 1개) |
| 지원 IRQ | 수백 개 이상 |
| 멀티코어 | 지원 (특정 코어에 인터럽트 라우팅 가능) |
| 우선순위 | 프로그래밍 가능 |
[APIC 구조]
하드웨어 장치 I/O APIC Local APIC (코어별)
┌─────────┐ ┌──────────────┐ ┌──────────────────┐
│ 키보드 │──IRQ──→ │ │ │ Local APIC (코어0)│
│ 디스크 │──IRQ──→ │ I/O APIC │─────→│ Local APIC (코어1)│
│ NIC │──IRQ──→ │ (라우팅 테이블│ │ Local APIC (코어2)│
│ 타이머 │──IRQ──→ │ 기반 분배) │─────→│ Local APIC (코어3)│
└─────────┘ └──────────────┘ └──────────────────┘
│
각 코어의 CPU가
ISR 실행
I/O APIC vs Local APIC
| 항목 | I/O APIC | Local APIC |
| 위치 | 칩셋 (사우스브리지) | 각 CPU 코어 내부 |
| 개수 | 시스템에 1~2개 | 코어당 1개 |
| 역할 | 외부 장치 IRQ 수신 → 적절한 코어로 라우팅 | 코어에 인터럽트 전달, IPI 송수신 |
| 관리 대상 | 외부 하드웨어 인터럽트 | 타이머, IPI, 에러 인터럽트 |
PIC vs APIC 비교
| 항목 | PIC (8259A) | APIC |
| IRQ 수 | 15개 | 수백 개 이상 |
| 멀티코어 지원 | 불가 | 가능 (코어별 분배) |
| 우선순위 | 고정 | 프로그래밍 가능 |
| 인터럽트 분배 | 단일 CPU만 | 라우팅 테이블 기반 분배 |
| IPI 지원 | 불가 | 가능 (코어 간 통신) |
| 사용 환경 | 레거시/단일 코어 | 현대 멀티코어 시스템 |
MSI (Message Signaled Interrupts)
현대 PCIe 장치는 물리적 IRQ 핀 대신 메모리 쓰기 방식으로 인터럽트를 전달합니다.
| 항목 | 전통적 IRQ | MSI/MSI-X |
| 전달 방식 | 물리적 핀 신호 | 메모리 주소에 데이터 쓰기 |
| IRQ 공유 | 여러 장치가 IRQ 공유 가능 | 장치별 고유 벡터 |
| I/O APIC 필요 | 필요 | 불필요 (직접 Local APIC에 전달) |
| 성능 | IRQ 공유 시 오버헤드 | 빠름, 정확한 벡터 전달 |
[전통적 IRQ]
장치 ──IRQ 핀──→ I/O APIC → Local APIC → CPU
[MSI]
장치 ──메모리 쓰기──→ Local APIC → CPU (I/O APIC 우회)
인터럽트 처리 흐름에서의 위치
장치 이벤트 발생
│
▼
인터럽트 컨트롤러 ← 여기서 중재
│
├── 우선순위 판단
├── 마스킹 확인
└── CPU(코어) 선택 (APIC)
│
▼
CPU: INTR 수신 → IDT 조회 → ISR 실행
│
▼
ISR 완료 → EOI 전송 → 인터럽트 컨트롤러가 다음 인터럽트 허용