인터럽트 컨텍스트에서 스케줄링을 호출하면 안 됨 -> 시간이 오래 걸림
- 인터럽트 컨텍스트 상태에서 사용할 수 있는 함수가 제한적이며 스케줄링을 지원하는 커널 함수를 호출하면 커널 패닉 혹은 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은 반복되는 부분이 있는데 익셉션 레벨에 따라서 벡터 테이블이 달라짐

'커널' 카테고리의 다른 글
| 22. 라즈베리파이 - ArmV8 익셉션 (0) | 2025.07.17 |
|---|---|
| 21. 라즈베리파이 - ArmV7 익셉션 (0) | 2025.07.17 |
| 19. 라즈베리파이 - 인터럽트 컨텍스트 (0) | 2025.07.16 |
| 18. 라즈베리파이 - 인터럽트 (0) | 2025.07.14 |
| 17. 라즈베리파이 - 프로세스(current) (0) | 2025.07.14 |