포스트

임베디드 스터디 - 인터럽트 서비스

임베디드 스터디 - 인터럽트 서비스

request_irq() / free_irq()

  • 드라이버가 커널에 인터럽트 핸들러를 등록/해제하는 함수
1
2
3
4
5
6
7
// module_init()에서 호출
request_irq(irq_num, handler, flags, "uart_driver", dev);
//           │        │        │
//      IRQ 번호   핸들러 함수  동작 플래그

// module_exit()에서 호출
free_irq(irq_num, dev);
  • free_irq()를 호출하지 않으면 모듈 언로드 후 IRQ 발생 시 댕글링 포인터 → 커널 패닉

ISR 작성 규칙

  • ISR(Interrupt Service Routine)은 인터럽트 컨텍스트에서 실행됨
  • ISR이 실행되는 동안 같은 CPU의 다른 인터럽트가 지연됨

ISR 안에서 절대 금지

1
2
3
4
5
6
① sleep / blocking 함수 사용 금지
   → mutex, msleep, wait_queue 등 사용 불가
   → 메모리 할당 시 반드시 GFP_ATOMIC 사용

② 무거운 연산 금지
   → 데이터 파싱, 프로토콜 처리 등은 하반부로 위임

상하반부 분리 (Top/Bottom Half)

1
2
3
4
5
6
인터럽트 발생
        ↓
상반부 (ISR) — 최소한의 작업만
: 레지스터 읽기, 플래그 저장
        ↓
하반부 — 무거운 작업 위임

하반부 메커니즘 선택 기준

1
2
3
후처리에 sleep이 필요한가?
├── NO  → tasklet  (인터럽트 컨텍스트, GFP_ATOMIC만 사용 가능)
└── YES → work_queue  (커널 스레드, blocking 작업 가능)
 실행 컨텍스트sleep 가능적합한 작업
tasklet인터럽트 컨텍스트빠른 데이터 복사
work_queue커널 스레드파일 I/O, kmalloc
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.