인터럽트를 왜 공부하냐?
->
대부분 리눅스 드라이버는 인터럽트를 통해 하드웨어 디바이스와 통신함
디바이스 드라이버 코드 분석 시, 인터럽트 처리 부분이 핵심 키
인터럽트 동작 방식을 잘 알고 있으면, 디바이스 드라이버 코드를 이해하기 쉽다
프로세스가 스택 메모리 공간에서 어떻게 실행되는지 알게 됨
아키텍처마다 인터럽트 벡터 동작이 다름 -> 벡터를 이해하면 아키텍처 동작 원리를 알게 됨
커널 핵심 동작을 이해하게 됨
- 스케줄링 선점 : 스케줄링 진입 경로 중 하나가 인터럽트
- 유저 공간에 등록한 시그널 핸들러는 인터럽트 핸들러를 실행한 다음 처리 시작
- 레이스 컨디션 발생 원인 1위는 비동기적 인터럽트 발생시, 임계 영역 코드를 건드려서 그럼
- 커널 패닉, 시스템 느려지는 성능 문제는 인터럽트 동작과 연관된 경우가 많음
키보드 - hw
키보드 어떻게 쓰는 거야 - 드라이버(설명서)
드라이버는 리눅스 커널에서 정한 규칙에 따라 프로그래머가 만듦
인터럽트란?
인터럽트 -> 전기적 신호(하드웨어 ) -> 처리 루틴 -> 다시 복귀
하드웨어 관점
인터럽트는 전기적 신호
소프트웨어 관점
하던 일 멈추고, 정해진 코드로 진입, 인터럽트 서비스 루틴 진행(인터럽트를 소프트웨어적으로 처리하는 과정)
CPU 아키텍처 관점
아키텍처마다 다름


EL0 : 유저 모드 / EL1 : 커널 모드
EL : Exception Level?

리눅스 커널 인털버트의 주요 개념
- 인터럽트 핸들러 : 인터럽트 바랭 시 이를 핸들링 하기 위한 함수

인터럽트 종류별로 인터럽트 핸들러가 있으며, 인터럽트 핸들러는 함수 형태로 존재함
커널 내부의 IRQ 서브 시스템을 통해 호출됨
핸들러 설정 예

amimouse.c - amimouse_open

80 : IRQ_AMIGA_VERTB 인터럽트가 일어났을 때, amimouse_interrupt 핸들러를 호출해라
- IRQ_AMIGA_VERTB : 인터럽트 종류
- mimouse_interrupt가 핸들러
인터럽트 컨텍스트
- 프로세스 컨텍스트와 달리 사용자 프로세스의 리소스나 상태를 직접 관리하지 x. 대신, 시스템 수준의 긴급 작업 처리에 집중함
인터럽트 컨텍스트는 언제 활성화가 될까?
1.프로세스 실행중
2.인터럽트 벡터 실행
3.커널 인터럽트 내부 함수 호출
4.인터럽트 종류별로 인터럽트 핸들러 호출 -> 인터럽트 컨텍스트 시작
5.인터럽트 핸들러의 서브루틴 실행 시작
6.인터럽트 핸들러의 서브루틴 실행 마무리 -> 인터럽트 컨텍스트 마무리
if in_interrupt() == true?
- 4~6구간에 있다는 뜻
요약
- 인터럽트가 발생하면 실행하던 코드 멈추고 인터럽트 벡터로 이동 -> 인터럽트 처리 수행
- 인터럽트 종류별로 지정한 인터럽트 핸들러가 실행됨
인터럽트 디스크립터란?

커널 내부의 IRQ 서브시스템에서 인터럽트 종류별로 지정된 인터럽트 핸들러를 호출하려면 먼저 인터럽트 디스크립터에 접근해야 함
인터럽트 디스크립터는 인터럽트 핸들러의 주소 정보를 갖고 있는데 이를 통해 핸들러 호출
인터럽트 디스크립터는 아래에 정의


리눅스 커널에서 인터럽트 처리
1.인터럽트 발생
- 프로세스는 실행 도중 인터럽트 벡터로 이동
- 벡터에서 인터럽트 처리 -> 다시 프로세스 실행을 위해 실행중인 레지스터 세트를 스택에 저장 -> 이후 IRQ 서브 시스템을 구성하는 함수들 호출
IRQ서브 시스템?
- 리눅스 커널 내에서 인터럽트를 관리하는 전체 시스템으로 인터럽트의 식별, 분류, 우선순위 결정, 핸들러 할당 및 호출 등의 작업 담당
2.인터럽트 핸들러 호출
- 커널 내부에서는 발생한 인터럽트에 대응하는 인터럽트 디스크립터를 참고하여 핸들러 호출
3.인터럽트 핸들러 실행
- 인터럽트 핸들러에서 하드웨어를 직접 제어하고 유저 공간에 이 변화를 알림

'커널' 카테고리의 다른 글
| 20. 라즈베리파이 - 익셉션 (0) | 2025.07.16 |
|---|---|
| 19. 라즈베리파이 - 인터럽트 컨텍스트 (0) | 2025.07.16 |
| 17. 라즈베리파이 - 프로세스(current) (0) | 2025.07.14 |
| 16. 라즈베리파이 - thread_info 구조체 초기화 코드 (0) | 2025.07.13 |
| 15. 라즈베리파이 - thread_info 구조체_preempt_count 필드 (0) | 2025.07.13 |