Notice
Recent Posts
Recent Comments
Link
승코딩당당당
[리눅스] 리눅스 커널: 예외처리와 인터럽트 본문
이번 포스팅에서는 리눅스 운영체제에서의 예외처리와 인터럽트 구조, 그리고 커널 내부에서의 인터럽트 처리 방식과 타이머 동작 원리를 정리한다.
예외(Exception)와 인터럽트(Interrupt)의 개념적 차이부터 시작해,
인터럽트 벡터, 인터럽트 제어기, 인터럽트 핸들러 구조(Top Half / Bottom Half)까지 단계적으로 살펴본다.
또한 리눅스 커널이 타이머 인터럽트를 통해 수행하는 작업과
시스템 콜(System Call)이 사용자 공간과 커널 공간을 연결하는 방식에 대해서도 함께 정리한다.
본 글을 통해 아래 내용을 한 번에 이해하는 것을 목표로 한다.
- 인터럽트 기반 I/O 처리의 흐름
- 커널 내부 처리 구조
- 시스템 콜과 POSIX API의 관계
예외처리와 인터럽트
- 예외처리(Exception)
- 비정상적인 상황, 프로그래밍 오류 등
- 인터럽트(Interrupt)
- 추가적으로 발생되는 타이머(Interval Timer) 인터럽트, 키보드를 누를 때와 같이 입출력 장치에서 정상적인 처리를 요청
- 예외처리와 인터럽트 벡터(Vector)
- 예외 처리나 인터럽트가 발생하면 처리해야 할 프로그램(인터럽트 핸들러: Interrupt Handler)이 저장되어 있는 위치
- 예외처리나 인터럽트는 사용자의 프로그램에 의해서 발생할 수도 있으나 대부분은 하드웨어적인 요인으로 발생
- 보통 Abort, IRQ와 같은 하드웨어 핀을 가진다
인터럽트(Interrupt)
- I/O 자원 관리
- 폴링(Polling), 인터럽트(Interrupt), DMA(Direct Memory Access)
- 인터럽트는 I/O 자원을 관리하는 방법 중에서 가장 효과적이며 멀티프로세스 지원을 위한 필수 요건
- 인터럽트 제어기
- 여러 입출력 장치에서 발생되는 인터럽트를 관리
- 인터럽트 펜딩 레지스터에 발생된 인터럽트 정보를 저장
인터럽트 처리
- 인터럽트 발생
- 입출력 장치에서 CPU에게 처리할 준비가 완료되었거나 처리가 완료되었음을 알린다
- 인터럽트 핸들러
- 발생된 인터럽트를 처리한다
- 대부분 발생된 인터럽트 정보는 인터럽트 제어기의 펜딩 레지스터에 있고, 인터럽트 처리 전에 해당 펜딩 비트를 클리어한다
- 하드웨어 인터럽트 처리 루틴은 되도록 짧게 한다
- 인터럽트 핸들러의 분리
- Top half
- 하드웨어 레벨의 인터럽트 핸들러
- do_IRQ() 함수에서 처리
- Bottom half
- 소프트웨어 레벨의 인터럽트 핸들러로 안정된 시점에 실행된다
- Top half
인터럽트와 Bottom Half
- Bottom Half의 처리
- 우선순위가 낮은 인터럽트를 안정된 시점에 실행
- Bottom Half의 실행
- 커널이 시스템 콜 처리를 끝마쳤을 때
- 커널이 예외 처리를 끝마쳤을 때
- 커널이 do_IRQ() 함수를 끝마쳤을 때
- 커널이 schedule() 함수를 실행할 때
- Bottom Half의 초기화와 활성화
- init_bh() 함수에 의해서 초기화가 이루어진다
- remove_bh() 함수에 의해서 제거한다
- mark_bh()에 의하여 활성화된다
- Bottom Half 작성 시 주의 사항
- Bottom half는 안정된 시점에서 실행되므로 “race condition”이 발생할 수 있다.
따라서 이러한 현상이 발생하지 않도록 해야 한다.
- Bottom half는 안정된 시점에서 실행되므로 “race condition”이 발생할 수 있다.
리눅스의 타이머
- 리눅스 타이머의 주요 동작
- 시스템의 시작부터 경과한 시간을 갱신
- 현재 날짜와 시간을 갱신
- Asynchronous 스케줄링
- 현재 프로세스가 얼마나 오랫동안 CPU를 점유하고 있는지를 검사하고 할당 시간이 넘으면 프로세스를 선점
- 각종 시스템 자원 사용 통계를 갱신
- 소프트웨어 타이머로 사용
- 시간 간격 측정, 딜레이 동작 등
- 타임 간격
- 타임 간격을 주기로 인터럽트 발생
- Centisecond (10ms) 간격
시스템 콜 (System Call)
- 시스템 콜(System Call)
- 사용자 프로그램에서 커널 자원을 사용할 수 있도록 한다
- 디바이스 제어, 프로그램 실행, 파일 전송 등
- POSIX API와 시스템 콜
- 표준 libc에 정의되어 있는 C 라이브러리의 API 중 일부는 시스템 콜 호출을 위한 루틴을 제공
- POSIX 표준 API를 사용하는 시스템 콜을 사용하는 이유
- 저수준 프로그래밍이 불필요 → 쉬운 프로그래밍
- 시스템 보안성 증가
- 프로그램 호환성 증가
'개발 > 임베디드' 카테고리의 다른 글
| [리눅스] 라즈베리파이 커널 모듈로 LED 제어하기 (0) | 2026.02.13 |
|---|---|
| [리눅스] 디바이스 드라이버의 이해 (0) | 2026.02.12 |
| [리눅스] 리눅스 커널: 메모리 (0) | 2026.02.12 |
| [리눅스] 리눅스 기초 정리 (파일, 디렉터리, 셸) (0) | 2026.02.11 |
| [STM32] PWM을 이용하여 LED 밝기 제어 (0) | 2026.02.09 |