ArmV8 익셉션의 특징
1.계층 구조로 정의
- 상위 카테고리
- 하위 카테고리
2.익셉션이 유발된 익셉션 레벨별로 익셉션 벡터가 존재
- 익셉션 레벨(EL)을 기준으로 익셉션을 처리하는데, 레벨 별로 벡터주소가 존재

3.벡터 주소는 0x80 바이트 단위로 정렬

- 0x80바이트 공간 만큼 익셉션 처리 명령어 입력 가능
4.Arch32 하위 호환성을 고려한 익셉션 정의
- 32비트 어플리케이션의 호환성을 지원함
-------
ArmV8 익셉션의 종류와 분류 체계

- Synchronous 명령어 실행하다가 발생
- ASynchronous 외부에서 접근
동기식
어셈블리어 명령어를 실행하다 유발
- 메모리 어보트를 유발하는 명령어(크래시 유발)
- SVC(슈퍼바이저 콜) 명령어
세부 원인
- Instruction Abort
- Data Abor
- 스택과 프로그램 카운터 정렬 오류
- 소프트웨어적 인터럽트를 유발하는 서비스 콜(SVCs, SMCs, HVCs) // SMC : System Monitor Call
익셉션 레벨 분류
- EL0 : 사용자 공간(애플리케이션 레벨)
- EL1 : 운영체제 커널
- EL2 : 하이퍼바이저
- EL3 : 보안 모니터 레벨

SMC란?
ARM 아키텍처는 시스템을 두 가지 영역으로 분리
- Secure World와 Nomal World
- Non-secure World로 구분
이는 민감 데이터나 기능을 보안 세계 내에서만 처리할 수 있게 하여 보다 강력한 보안 수준 제공
SMC 호출은 이러한 두 세계 간 인터페이스 역할 수행
일반 세계 -> 보안 세계의 기능이나 데이터에 접근
SMC -> 보안 세계에 있는 Secure Monitor에 요청을 보냄. 이때 SM는 요청을 받아 처리한 뒤 결과를 일반 세계로 반환
-----
비동기식
어셈블리어 명령어 실행 과정에서 유발 x. IRQ, FIQ, SError에 의해 유발됨
IRQ : 외부 I/O 인터럽트
FIQ : ArmV7과 ArmV8 모두에서 제공하는 FIQ는 시스템의 빠른 인터럽트 응답 기능 제공, ARMv8에서는 보안 옵션을 제공
SError : 외부 메모리 버스에서 어보트 감지시 유발
------
익셉션 신드롬 레지스터(ESR_ELx)
신드롬 : 증상, 상태
arm 프로세서는 익셉션 유발 시 이 레지스터를 통해 알려줌
Synchronous 익셉션, SError 익셉션 발생 시 [31:26] 비트에 원인을 기록
IRQ/FIQ 익셉션은 이 레지스터가 업데이트되지 않음
----
익셉션 클래스
익셉션 세부 원인에 대해 정의
총 37개, 크게 5개 카테고리로 구성
- 메모리 어보트
- 트랩 명령어(SVC, HVC ,SMC)
- MCR, MCRR 트랩 명령어
- 브레이크 포인트
- 기타
메모리 어보트
ex. SError "0b101111" SERROR 인터럽트 유발 <- [31:26] 6개 비트가 기록됨
익셉션 시 익셉션 신드롬 레지스터에 기록 -> [31:26] 비트에 기록한다
기록되는 값을 정해둔 게 익셉션 틀래스인데, 구체적인 값이 위 예시와 같은 비트임
======
Armv8 익셉션을 구성하는 주요 개념

위 그림에서 익셉션 레벨 변경 부분만 차이가 있음
----유발 요인----
Data Abort(잘못된 메모리 접근)
- 특정 메모리에 접근했는데 주소가 없거나 접근 권한이 없는 경우
Prefetch Abort(실행할 명령어를 불러오는 과정에서 오류)
Undefined Instruction(인식할 수 없는 명령어)
- 컴파일러가 다른 경우 등
외부 인터럽트(하드웨어, 비동기적)
- IRQ, FIQ
소프트웨어 인터럽트
- SVC 명령
- EL0에서 SVC 실행 시 자동으로 EL1로 진입
- 단, svc 전용 익셉션이 유발되지 않고, 동기식 익셉션이 유발됨
거의 흡사하나 소프트웨어 인터럽트만 약간의 차이가 있음
------
레지스터 업데이트 - 특정 익셉션 레벨에서만 접근할 수 있는 레지스터를 변경
- 익셉션 발생한 시점의 프로세서 상태를 나타내는 PSTATE를 SPSP_ELx 레지스터에 저장
- 복귀한 주소를 ELR_ELx 레지스터에 저장
------
익셉션 벡터 테이블
- 익셉션 벡터가 Armv7에서는 하나지만, Armv8에서는 익셉션 레벨 별로 존재함
-----
익셉션 핸들러
익셉션 벡터 주소로 프로그램 카운터를 분기, 해당 주소에 명령어 실행
- Synchronous : 시스템 리셋/시스템 콜 실행
- IRQ 익셉션 : 인터럽트를 처리하는 서비스 루틴 실행
- SError : 시스템 리셋
'커널' 카테고리의 다른 글
| 24. 라즈베리파이 - ArmV8 익셉션 타입별 실행 흐름 (0) | 2025.07.17 |
|---|---|
| 23. 라즈베리파이 - ArmV8 익셉션 벡터 테이블 (0) | 2025.07.17 |
| 21. 라즈베리파이 - ArmV7 익셉션 (0) | 2025.07.17 |
| 20. 라즈베리파이 - 익셉션 (0) | 2025.07.16 |
| 19. 라즈베리파이 - 인터럽트 컨텍스트 (0) | 2025.07.16 |