커널

18. 라즈베리파이 - 인터럽트

corin13 2025. 7. 14. 22:31

인터럽트를 공부하냐?

->

대부분 리눅스 드라이버는 인터럽트를 통해 하드웨어 디바이스와 통신함

디바이스 드라이버 코드 분석 , 인터럽트 처리 부분이 핵심

인터럽트 동작 방식을 알고 있으면, 디바이스 드라이버 코드를 이해하기 쉽다

프로세스가 스택 메모리 공간에서 어떻게 실행되는지 알게

아키텍처마다 인터럽트 벡터 동작이 다름 -> 벡터를 이해하면 아키텍처 동작 원리를 알게

 

커널 핵심 동작을 이해하게

  • 스케줄링 선점 : 스케줄링 진입 경로 하나가 인터럽트
  • 유저 공간에 등록한 시그널 핸들러는 인터럽트 핸들러를 실행한 다음 처리 시작
  • 레이스 컨디션 발생 원인 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.인터럽트 핸들러 실행

  • 인터럽트 핸들러에서 하드웨어를 직접 제어하고 유저 공간에 변화를 알림