커널

20. 라즈베리파이 - 익셉션

corin13 2025. 7. 16. 21:12

인터럽트 컨텍스트에서 스케줄링을 호출하면 -> 시간이 오래 걸림

  • 인터럽트 컨텍스트 상태에서 사용할 있는 함수가 제한적이며 스케줄링을 지원하는 커널 함수를 호출하면 커널 패닉 혹은 WARN 함수를 호출하여 에러 로그 출력
  • , 인터럽트 컨텍스트에서 스케줄링을 호출하는 것은 커널 패닉 조건 하나

 

core.c 열기

 

__schedule : 스케줄링 호출

6622, schedule_debug 따라가기

 

schedule_debug : 노란 박스 부분을 타면 스케줄링 하는데 버그가 발생한

  • 조건인 5918줄은 in_interrupt 함수와 비슷 -> 인터럽트 컨텍스트면 true 반환

 

__schedule_bug 코드

  • 버그라는 printk 메시지를 띄우고 죽는다

 

인터럽트 핸들러는 언제 호출될까

  • 인터럽트가 발생할 호출
  • 인터럽트 발생 실행 중인 코드를 멈추고 실행 정보를 저장\
  • 인터럽트 처리 발식은 CPU 아키텍처에 의존적 -> ARMv7 ARMv8 익셉션에 대해 공부

 

---------

익셉션 : 예외

  • 소프트웨어에서는 예외 처리라는 용어로 자주 사용
  • 작성한 코드가 문제가 있을 , 이를 처리하기 위한 루틴
  • JAVA 등의 언어에서는 언어 차원에서 지원해

 

  • 익셉션은 CPU 아키텍처마다 지원하는 기능
  • x86, MIPS, RICS_V, Arm 같은 CPU 아키텍처의 핵심 기능

 

CPU 아키텍처 관점에서도 소프트웨어 관점과 비슷

아키텍처는 설계자가 만든 기계어를 실행하지만 기계어를 제대로 실행하지 못하는 경우가 있음

1.메모리 주소에서 기계어를 가져오지 못한다, 전원 부족 (HW 관점)

2.CPU 기계어를 해석할 없다

  • 다른 컴파일러로 컴파일하거나 일반 데이터를 CPU 명령으로 해석하려 하는

3.접근할 없는 메모리 주소에 접근하려 한다(SW 관점)

  • 보호 구여 접근
  • 잘못된 메모리 접근

 

이러한 예외 처리를 하는 방식을 exception이라

exception 발생 -> exception 종류 별로 지정된 주소로 프로그램 카운터가 바뀜

-------

ARM 아키텍처 관점에서의 익셉션

익셉션 발생 -> 특정 모드 진입 -> 익셉션을 유발한 다양한 정보를 레지스터에 업데이트 -> 이미 정해 놓은 주소로 분기(벡터)

 

모드에 따라 접근 있는 환경이 달라짐

모드는 대부분 하드웨어적으로 자동으로 이뤄진다

하지만 특정 API 통해 바꿀 있음

 

Arm 스펙 문서에서의 익셉션

익셉션은 프로세서가 '외부에서 발생한 인터럽트나 정의돼 있찌 않은 명령어를 실행하려는 시도' 같은 이벤트을 처리하기 위해 프로세스의 실행을 멈추게 한다

 -> Arm 아키텍처에서는 익셉션이 인터럽트를 포함함

 

커널 관점에서 익셉션

  • 치명적인 오류 : (메모리 어보트 타입 익셉션) 메모리 주소 유효하지 않음, 접근 권한 없음, 잘못된 명령어
  • 운영체제 커널에서 지원하는 기능 : IRQ(인터럽트 서비스 루틴), 소프트웨어 인터럽트(시스템 )

 

메모리 어보트 타입 익셉션

  • 매우 치명적인 오류
  • 대부분의 원인을 소프트웨어 결함 -> 개발자 잘못
  • 커널 로그, 메모리 덤프 분석을 통해 찾음
  • 종종 하드웨어 부품 결함인 경우도 있음 -> 해다 부품 찾아 교체

 

IRQ 타입 익셉션

  • IRQ 인터럽트로 익셉션으로 분류
  • 외부 I/O 디바이스에서 신호 발생하면, Arm 코어에서 이를 익셉션의 종류로 처리
  • 발생 -> 서비스 루틴

 

소프트웨어 인터럽트 타입 익셉션

  • 특정 명령어 실행시 익셉션 유발(Trap)
  • 예를 들어 SVC 명령어를 실행하면 익셉션이 유발, 유저모드 -> 커널모드로 바뀜
  • HVC명령어, 익셉션 유발 -> 하이퍼바이저 모드
  • Armv7 기준으로 유저 -> svc 명령 실행 슈퍼바이저 모드로 진입

 

메모리 어보트 타입 익셉션과 인터럽트 타입 익셉션은 같은 익셉션 단어를 쓰지만 논리적으로는 많이 다름 -> 하지만 이미 지정된 주소로 프로그램 카운터 변경은 같다

 

익셉션과 연관된 운영체제 기능

  • 선점 스케줄링, IRQ(인터럽트 서브 시스템)
  • 시스템콜, 시그널

핵심 코드는 어셈블리어로 되어 있음

 

ArmV7 : 유저 모드에서 SVC 명령어를 실행하면 슈퍼바이저 모드 진행

ArmV8 : 유저 모드인 EL0에서 SVC 명령어 실행시 EL1으로 진입

 

벡터 테이블

  • ArmV8은 반복되는 부분이 있는데 익셉션 레벨에 따라서 벡터 테이블이 달라짐