Exception Level
Overview
ARMv7 대비 ARMv8에 새로 도입된 개념 중 하나인 Exception Level은 레벨마다 System의 resource에 대한 특권(Privilege)를 다르게 부여하여 각 레벨에 맞는 동작을 수행
Privileged / Unprivileged mode를 구분하는 이유(a.k.a user space와 kernel space를 구분한 이유)
Privileged mode로 동작을 하게되면 시스템의 주요 설정과 메모리 등에 접근이 가능함
만약 User Application도 Privilege가 부여되어 시스템 메모리나 시스템 설정이 가능해진 상황에서 이러한 주요 resource를 잘못 사용할 경우 시스템에 critical한 error를 유발할 수 있음.
따라서 User space가 시스템 메모리에 접근하지 못하게 제약을 둠으로써, User Application으로 인한 System Error를 방지. 대신 시스템 콜을 통해 간접적으로 시스템의 resources를 사용할 수 있음.
EL0 - EL3까지 존재하며 EL0 & EL1은 필수적으로 구현해야 하며, EL2, EL3 같은 경우는 optional
Exception Level 구현을 위해서 하기 항목을 구현해야 함.
- 각 Exception Level에 해당하는 Exception Handler 구현
- 각 Exception Level별로 사용하는 스택 구성
- 구현한 Exception Handler의 Vector Table을 VBAR_ELx 레지스터에 설정
- 관련 System Register 및 MMU 설정
각 Level과 특징
Exception Level | Description |
EL0 | Unprivileged Level로서 시스템의 메모리나 설정에 직접 접근할 수 없으며 User Application이 실행되는 레벨 |
EL1 | OS Kernel이 동작하는 레벨, 인터럽트나 MMU, 캐시 등의 H/W에 직접 접근하여 설정할 수 있음. |
EL2 | 가상화를 위한 Hypervisor가 동작하는 레벨, 하나의 시스템에서 다수의 운영체제(Guest OS, VM)를 운용하기 위해 EL0, EL1보다 PL이 높음으로 EL0, EL1에 대한 resource에 접근 가능하여 이들을 관리. |
EL3 | 가장 높은 특권을 가지고 있어 레지스터, 메모리, 캐시 등 시스템의 모든 기능을 설정할 수 있음 (시스템 부팅 시 전원이 인가되어 bootloader가 실행되면서 EL3로 실행되어 시스템 레지스터나 MMU, 캐시등을 설정한 후 하위 ELx로 진입할 수 있음) 또한 Secure Monitor가 동작하는 레벨로서 Secure / Non-Secure간 전환을 담당. |
Exception Level 전환과정
EL이 전환되는 경우는 하기 4가지 경우이다.
- Memory Abort
- SVC / HVC / SMC Instruction 실행
- IRQ / FIQ 인터럽트 발생
- ERET(Exception Return)
EL이 전환되는 case를 살펴보면
EL0
- EL0에서 SVC 명령어를 호출하게 되면 Synchronous Exception이 유발되면서 EL1 진입(EL0 Synchronous Exception vector 주소인 VBAR + 0x400으로 분기). 시스템 resource 접근에 대한 제약이 있는 user영역의 프로그램이 해당 명령어를 통해 EL1으로 진입하게 되면서 간접적으로 시스템 resource를 사용하게 될 수 있는데 이를 시스템 콜이라고 함
- EL0에서 Memory Abort를 유발하는 동작을 실행하게 되면 Synchronous Exception이 유발되면서 EL1 진입. EL1으로 동작하는 커널은 memory abort를 발생시킨 프로세스를 종료 및 처리
- 인터럽트가 발생하는 경우 IRQ Exception이 유발되면서 EL1 진입. 이후 EL1 Exception Vector Table로 분기하여 IRQ Handler가 실행되어 해당 인터럽트를 처리
EL1
- 다수의 OS가 실행되고 있는 가상화 환경에서 EL1으로 동작하고 있는 Guest OS가 resource를 관리하고 있는 Hypervisor에게 서비스를 요청하기 위해 HVC 명령어를 호출하게 되면 EL2로 진입하고, EL2 Exception Vector Table (VBAR_EL2 + 0x400)로 분기되면서 Hypervisor가 동작
- Secure 관련 서비스를 요청하기 위해 SMC를 호출해 EL3로 진입하여 Non-Secure 상태에서 Secure 상태로 진입
Exception 관련 Register
Exception 진입(또는 전환)간 현재의 EL과 Exception이 발생하기 전의 EL의 정보가 필요한데 해당 정보는 PSTATE에 저장되어 있음.
PSTATE.EL[4:0]
현재 프로세서의 EL를 나타내주는 field로서 하기와 같이 인코딩 됨
Exception Level with SP | M[3:0] |
EL0t | 0b0000 |
EL1t | 0b0100 |
EL1h | 0b0101 |
EL2t | 0b1000 |
EL2h | 0b1001 |
EL3t | 0b1100 |
EL3h | 0b1101 |
Exception Level 뒤의 접미사 t는 thread의 약자로 SP0를 사용함을 나타내고, h는 host의 약자로 각 EL에 정의된 SP_ELx를 사용한다는 의미
ARM 아키텍처에서는 해당 PSTATE.EL를 직접 읽어 EL을 파악할 수 없으며 각 bit field에 해당하는 시스템 레지스터를 읽어 확인할 수 있음.
CurrentEL: PSTATE.EL[3:0] 값을 저장하는 register로서 하기와 같은 명령어를 통해 현재 EL에 대한 정보를 얻을 수 있음
MRS X0, CurrentEL
오른쪽으로 2bit shift를 통해 EL값을 구할 수 있음.
SPSR_ELx
Exception 발생 시점의 PSTATE 정보를 백업하는 용도로 사용되는 register.
예시) SPSR_EL1의 경우 EL1으로 진입하기 전의 PSTATE를 저장 함. 주로 IRQ 인터럽트 Exception이 발생하여 핸들링 코드 실행 후 이전 시점으로 복귀하기 위해 이전시점의 PSTATE를 저장하고 있는 SPSR_EL1 register 값을 활용
ELR_ELx
Exception 발생 시점에 원래 실행되고 있었던 프로그램 위치(주소 값)를 저장하는 register.
예시) ELR_EL1의 경우 EL1으로 진입하기 전에 실행되고 있던 PC 값을 저장 함. Exception 핸들링 코드 실행 후 이전 시점으로 복귀하기 위해 ELR_ELx에 값을 활용하여 복귀할 주소 값을 얻음.
또한 ESR_ELx(Exception Syndrome Register)에 Exception이 발생한 원인에 대한 encoding 값이 저장 되어 있음.
이를 통해 System Crash가 발생하였을 때, 해당 값을 활용하여 디버깅
- EC[31:26](Exception Class): exception type이 무엇인지와 System call instruction(SVC, HVC, SMC)에 의한 것인지, SError인지 등의 정보를 알 수 있음.
- IL[25](Instruction Length): instruction이 16bit or 32bit instruction인지 나타내는 field
- ISS[24:0](Instruction Specific Syndrome): Exception에 대한 encoding된 정보를 담고있으며 Exception Class에 따라 다르게 정의
ERET: 발생한 Exception에 대한 처리 이후, ERET이라는 명령어를 통해 Exception이 유발된 시점으로 복귀함.
해당 명령어를 실행하게 되면 SPSR_ELx를 PSTATE에 load하고 ELR_ELx에 저장되어 있는 주소로 복귀
'ARM Architecture > ARMv8' 카테고리의 다른 글
ARMv8 Exception (0) | 2024.01.29 |
---|---|
ARMv8 주요 register (0) | 2024.01.21 |