승코딩당당당

[리눅스] 리눅스 커널: 예외처리와 인터럽트 본문

개발/임베디드

[리눅스] 리눅스 커널: 예외처리와 인터럽트

승코딩당당당 2026. 2. 12. 17:29

 

이번 포스팅에서는 리눅스 운영체제에서의 예외처리와 인터럽트 구조, 그리고 커널 내부에서의 인터럽트 처리 방식과 타이머 동작 원리를 정리한다.

 

예외(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
      • 소프트웨어 레벨의 인터럽트 핸들러로 안정된 시점에 실행된다

 

인터럽트와 Bottom Half

  • Bottom Half의 처리
    • 우선순위가 낮은 인터럽트를 안정된 시점에 실행
    • Bottom Half의 실행
      • 커널이 시스템 콜 처리를 끝마쳤을 때
      • 커널이 예외 처리를 끝마쳤을 때
      • 커널이 do_IRQ() 함수를 끝마쳤을 때
      • 커널이 schedule() 함수를 실행할 때
    • Bottom Half의 초기화와 활성화
      • init_bh() 함수에 의해서 초기화가 이루어진다
      • remove_bh() 함수에 의해서 제거한다
      • mark_bh()에 의하여 활성화된다
  • Bottom Half 작성 시 주의 사항
    • Bottom half는 안정된 시점에서 실행되므로 “race condition”이 발생할 수 있다.
      따라서 이러한 현상이 발생하지 않도록 해야 한다.

 

리눅스의 타이머

  • 리눅스 타이머의 주요 동작
    • 시스템의 시작부터 경과한 시간을 갱신
    • 현재 날짜와 시간을 갱신
    • Asynchronous 스케줄링
      • 현재 프로세스가 얼마나 오랫동안 CPU를 점유하고 있는지를 검사하고 할당 시간이 넘으면 프로세스를 선점
    • 각종 시스템 자원 사용 통계를 갱신
    • 소프트웨어 타이머로 사용
      • 시간 간격 측정, 딜레이 동작 등
  • 타임 간격
    • 타임 간격을 주기로 인터럽트 발생
    • Centisecond (10ms) 간격

 

시스템 콜 (System Call)

  • 시스템 콜(System Call)
    • 사용자 프로그램에서 커널 자원을 사용할 수 있도록 한다
    • 디바이스 제어, 프로그램 실행, 파일 전송 등
  • POSIX API와 시스템 콜
    • 표준 libc에 정의되어 있는 C 라이브러리의 API 중 일부는 시스템 콜 호출을 위한 루틴을 제공
    • POSIX 표준 API를 사용하는 시스템 콜을 사용하는 이유
      • 저수준 프로그래밍이 불필요 → 쉬운 프로그래밍
      • 시스템 보안성 증가
      • 프로그램 호환성 증가