본문 바로가기
경제

[임베디드기사 실기 20부작 13편] Interrupt, IVT, ISR 그리고 DMA — CPU가 외부 사건을 처리하는 방법

by 프레스러쉬 2026. 9. 18.

[임베디드기사 실기 20부작 13편] Interrupt, IVT, ISR 그리고 DMA — CPU가 외부 사건을 처리하는 방법

임베디드 시스템은 가만히 앉아 계산만 하는 컴퓨터가 아닙니다. 센서 입력이 들어오고, 타이머가 만료되고, UART로 데이터가 도착하며, 모터 드라이버에서 Alarm이 발생합니다. 이런 외부 사건에 CPU가 즉시 반응하도록 만드는 핵심 장치가 Interrupt입니다. 이번 편에서는 Interrupt가 발생한 뒤 CPU가 어떤 순서로 움직이는지, IVT와 ISR은 무엇인지, 그리고 대량 데이터 전송에서 왜 DMA가 중요한지까지 하나의 흐름으로 연결해 보겠습니다.

1. Interrupt란 무엇인가

Interrupt는 현재 실행 중인 프로그램의 흐름을 잠시 멈추고, 더 긴급한 사건을 처리하도록 CPU의 실행 흐름을 전환하는 메커니즘입니다. 예를 들어 UART 수신, Timer 만료, GPIO Edge, ADC 변환 완료, DMA 전송 완료와 같은 사건이 발생하면 해당 하드웨어는 CPU에 Interrupt Request, 즉 IRQ를 전달할 수 있습니다.

Polling 방식에서는 CPU가 계속 주변 장치의 상태를 읽어야 하지만, Interrupt 방식에서는 사건이 발생했을 때만 CPU가 반응합니다. 그래서 CPU 시간을 더 효율적으로 사용할 수 있습니다.

2. Interrupt 처리의 전체 순서

시험에서는 Interrupt 처리 순서를 묻는 문제가 매우 전형적으로 출제됩니다. 핵심 흐름은 다음과 같이 정리할 수 있습니다.

IRQ 발생 → 현재 명령 완료 → 현재 상태 저장 → IVT 참조 → ISR 주소 확인 → ISR 실행 → 상태 복원 → 원래 프로그램 재개

이를 단계별로 쓰면 다음과 같습니다.

① 외부 장치 또는 내부 예외가 Interrupt Request를 발생시킨다.
② CPU는 현재 실행 중인 명령어를 완료한다.
③ PC, 상태 레지스터, 필요한 일반 레지스터 등 현재 Context를 Stack에 저장한다.
④ Interrupt Vector Table을 참조해 해당 Interrupt의 ISR 시작 주소를 찾는다.
⑤ ISR을 실행한다.
⑥ ISR 종료 후 저장했던 Context를 복원한다.
⑦ 중단된 위치로 돌아가 원래 프로그램 실행을 재개한다.

3. 왜 현재 상태를 먼저 저장해야 할까

Interrupt가 발생했을 때 CPU는 기존 프로그램의 실행 흐름을 갑자기 떠나야 합니다. 이때 어디까지 실행했는지 기억하지 못하면 Interrupt 처리가 끝난 뒤 원래 작업으로 돌아갈 수 없습니다.

그래서 최소한 다음 정보가 보존되어야 합니다.

PC(Program Counter): 어디로 돌아가야 하는지
Status Register / PSR: 현재 조건 플래그와 CPU 상태
General Register: ISR이 덮어쓸 가능성이 있는 작업 데이터

이 정보는 주로 Stack에 저장됩니다. 즉 Stack은 단순한 함수 호출용 메모리가 아니라 Interrupt 복귀를 위한 핵심 Context 저장소이기도 합니다.

4. IVT — Interrupt와 ISR을 연결하는 주소표

IVT(Interrupt Vector Table)는 Interrupt가 발생했을 때 CPU가 어느 ISR로 이동해야 하는지를 알려주는 테이블입니다.

쉽게 말하면 Interrupt 번호와 Handler 주소를 연결해 놓은 “주소 안내표”입니다.

예를 들어 Timer Interrupt가 15번 Vector에 연결되어 있다면 CPU는 15번 Entry를 참조하여 Timer ISR의 시작 주소로 분기합니다.

2025년 실기 기출에서도 “커널 진입점과 Interrupt 처리 루틴의 주소가 저장되어 시스템 부팅 또는 Interrupt 발생 시 참조되는 테이블”의 정답으로 IVT가 출제되었습니다.

5. ARM과 x86의 Vector Table 차이

아키텍처마다 구현은 조금 다릅니다.

항목 ARM x86
명칭 Exception Vector Table IDT
위치 지정 VBAR IDTR
Entry Branch/LDR 또는 Handler Entry Descriptor

시험에서는 세부 Register 이름보다 “Vector Table을 통해 ISR 주소를 찾는다”는 핵심 원리를 먼저 기억하는 것이 중요합니다.

6. ISR — Interrupt가 실제로 처리되는 곳

ISR(Interrupt Service Routine)은 Interrupt가 발생했을 때 실제로 실행되는 처리 함수입니다.

예를 들어 UART RX Interrupt라면 ISR에서는 다음과 같은 작업을 수행할 수 있습니다.

① UART Status Register 확인
② 수신 Register의 데이터를 Buffer에 저장
③ Interrupt Flag Clear
④ 필요 시 후속 처리 요청

여기서 중요한 원칙은 ISR은 최대한 짧게 작성해야 한다는 점입니다. ISR이 오래 실행되면 다른 Interrupt의 응답이 늦어지고 시스템의 실시간성이 나빠질 수 있습니다.

7. Linux의 Top Half와 Bottom Half

Linux는 Interrupt 처리 시간을 줄이기 위해 작업을 크게 두 부분으로 나눕니다.

Top Half는 즉시 처리해야 하는 최소 작업을 담당합니다. 장치 상태 확인, Interrupt Flag Clear, 수신 데이터 확보 등이 여기에 해당합니다.

Bottom Half는 시간이 오래 걸리는 후속 처리를 담당합니다. Linux에서는 Softirq, Tasklet, Workqueue와 같은 방법으로 지연 처리할 수 있습니다.

특히 Workqueue는 Process Context에서 실행되므로 Sleep이나 Mutex 사용이 가능합니다. 반면 Top Half, Softirq, Tasklet은 Interrupt Context이므로 Sleep이 불가능하다는 점을 구분해야 합니다.

8. Interrupt Latency와 실시간성

Interrupt Latency는 Interrupt가 발생한 시점부터 ISR이 실제로 실행되기 시작할 때까지의 지연 시간입니다.

산업용 제어기, 모션 제어, 고속 Vision Trigger, Encoder Capture처럼 시간 정확도가 중요한 시스템에서는 이 Latency를 줄이는 것이 매우 중요합니다.

Interrupt Disable 구간이 너무 길거나 우선순위가 잘못 구성되어 있거나, ISR에서 너무 많은 일을 하면 Latency가 증가합니다.

9. DMA — CPU가 데이터를 직접 옮기지 않게 하는 방법

DMA(Direct Memory Access)는 CPU가 모든 데이터 전송을 직접 처리하지 않고, DMA Controller가 I/O 장치와 Memory 사이의 데이터를 직접 옮기도록 하는 방식입니다.

예를 들어 ADC에서 10,000개의 Sample을 읽어 RAM에 저장해야 한다고 가정해 보겠습니다.

CPU 방식이라면 Sample마다 CPU가 Register를 읽고 RAM에 저장해야 합니다. 반면 DMA를 사용하면 CPU는 Source, Destination, Transfer Size를 설정한 뒤 다른 일을 할 수 있습니다. 전송이 완료되면 DMA가 Completion Interrupt를 발생시켜 CPU에 알려줍니다.

10. Interrupt와 DMA는 경쟁 관계가 아니다

초보 학습자에게 자주 생기는 오해가 있습니다. “Interrupt를 쓰면 DMA가 필요 없고, DMA를 쓰면 Interrupt가 필요 없다”는 생각입니다.

실제로는 두 기술을 함께 사용하는 경우가 많습니다.

장치 → DMA → Memory → DMA 완료 Interrupt → CPU 후속 처리

DMA는 데이터 이동 부담을 줄이고, Interrupt는 사건 발생 사실을 CPU에 알려주는 역할을 담당합니다.

11. Polling, Interrupt, DMA 비교
방식 CPU 개입 장점 주 용도
Polling 매우 많음 구현 단순 간단한 상태 확인
Interrupt 사건 발생 시 응답성 우수 이벤트 처리
DMA 설정 및 완료 시 CPU 부하 감소 대량 데이터 전송
12. 실무 장애 분석 관점

Interrupt 관련 장애는 다음 순서로 점검하면 효율적입니다.

① 장치가 실제 Interrupt Signal을 발생시키는가
② Interrupt Mask/Enable 설정은 정상인가
③ Vector Number와 Handler가 올바르게 연결돼 있는가
④ ISR이 실제 실행되는가
⑤ ISR 내 Flag Clear가 정상인가
⑥ Interrupt Storm이나 재진입이 발생하지 않는가
⑦ DMA를 사용하는 경우 Source/Destination/Length 설정은 정상인가
⑧ DMA Completion Interrupt가 발생하는가

13. 실기 예상문제

문제 1. Interrupt 발생 시 CPU의 처리 순서를 쓰시오.
모범답안: Interrupt 요청이 발생하면 CPU는 현재 명령어를 완료하고 Context를 저장한다. 이후 IVT를 참조하여 ISR 주소로 분기해 Handler를 실행하며, 처리 후 저장된 Context를 복원하여 원래 프로그램을 재개한다.

문제 2. IVT의 역할을 쓰시오.
모범답안: IVT는 Interrupt 번호와 해당 ISR의 시작 주소를 연결한 테이블로, Interrupt 발생 시 CPU가 처리 루틴의 주소를 찾기 위해 참조한다.

문제 3. DMA의 장점을 쓰시오.
모범답안: DMA는 CPU의 지속적인 개입 없이 I/O 장치와 Memory 사이에서 데이터를 직접 전송하므로 CPU 부하를 줄이고 대량 데이터 전송 효율을 높인다.

문제 4. Top Half와 Bottom Half의 차이를 설명하시오.
모범답안: Top Half는 Interrupt 직후 필요한 최소 작업을 빠르게 처리하고, Bottom Half는 시간이 오래 걸리는 후속 작업을 지연 처리한다. 이를 통해 Interrupt Latency와 시스템 응답성을 개선한다.

14. 시험 직전 30초 암기

Interrupt = 사건 발생 알림
IRQ = Interrupt Request
IVT = Interrupt 번호와 ISR 주소의 매핑 테이블
ISR = Interrupt 처리 함수
Context Save = PC / 상태 / Register 보존
Top Half = 즉시 최소 처리
Bottom Half = 지연 후속 처리
DMA = CPU 대신 장치↔Memory 데이터 전송
DMA + Interrupt = 전송은 DMA, 완료 알림은 Interrupt

15. 마무리

Interrupt를 이해할 때 가장 중요한 것은 용어 하나씩 외우는 것이 아니라 실행 흐름을 머릿속에서 그리는 것입니다.

사건 발생 → IRQ → Context Save → IVT → ISR → Context Restore → Resume

그리고 데이터 양이 많아지면 여기에 DMA가 결합됩니다.

Peripheral → DMA → RAM → Completion Interrupt → CPU

이 두 흐름을 확실히 이해하면 Interrupt, IVT, ISR, DMA 문제는 서로 떨어진 개념이 아니라 하나의 시스템 동작으로 보이기 시작합니다.

다음 편 예고

14편 — Mutex, Semaphore, Spinlock, Completion: 동시성 제어와 동기화 완전 이해

태그
#임베디드기사 #임베디드기사실기 #Interrupt #IVT #ISR #DMA #IRQ #InterruptVectorTable #DeviceDriver #LinuxKernel #TopHalf #BottomHalf #Workqueue #Softirq #Tasklet #InterruptLatency #ARM #임베디드시스템 #임베디드리눅스 #자격증공부