Exception
CPU 아키텍처 관점에서 기계어를 정상적으로 처리하지 못한 상황을 의미하며 이를 처리하기 위해 모든 CPU Architecture에서는 대개 Exception이 유발되면 해당 Exception 종류에 해당하는 특정 주소로 분기
ARM의 경우 Exception을 "외부에서 발생한 인터럽트나 정의되지 않은 명령어를 실행하려는 시도와 같은 이벤트를 처리하기 위해 실행되고 있는 프로세스를 멈추게하는 것"으로 정의하고 있으며,
Exception을 처리하기 위해 다양한 정보들을 register에 업데이트 하고, 해당 Exception 종류에 해당하는 특정 주소로 분기하는 과정을 수행함.
Exception Type
ARMv8의 익셉션 종류는 대략 하기와 같이 분류 됨
- Synchronous Exception: exception 발생 시, 어떠한 특정 instruction에 의해 발생되어 어떤 address로부터 exception이 발생했는지 알고있어 ELR(Exception Link Register)를 통해 예외처리 후 return할 수 있는 exception.
- SWI: SVC나 HVC등 특정 명령어를 실행하면 Software Interrupt 익셉션이 발생하여 trap되는데 이를 통해 모드가 전환됨(e.g. EL1에서 SMC 호출 시 EL3로 전환되는데 이와 같은 상황을 trap된다고 표현)
- Memory Abort: S/W 관점에서 치명적인 오류가 발생하여 system crash가 발생하는 상황
- Instruction Abort: 실행할수 없는 instruction일 경우
- Data Abort: 0x0, Null pointer 접근 시 해당 virtual address에 해당하는 physical address가 page table에 존재하지 않기 때문에 발생
- Alignment Abort: 잘못된 stack align 주소에 접근하는 경우
- Debugging exception: debugger의 break point 등 debugger와 관련된 exception
- Asynchronous Exception: 반대로 특정 instruction을 수행할 때 생기는 것이 아니며 무엇이 exception을 발생시켰는지에 대한 정보가 없는 exception
- IRQ / FIQ: 인터럽트도 익셉션의 한 종류로 분류되어, 인터럽트가 발생하면 IRQ 익셉션이 발생하고 해당 IRQ에 해당하는 handler가 동작
- SError: 외부 Memory Data abort
Exception Vector Table
위와 같은 종류의 Exception이 발생하게 되면 해당 Exception에 해당하는 지정된 주소로 분기하게 되는데 이때 이 주소를 Exception Vector라고 하며 이를 정의해놓은 table을 Exception Vector Table이라고 한다.
EL1, EL2, EL3마다 각각 exception vector table을 가지고 있으며 exception vector에 대한 addr는 VBAR_ELn의해 설정
Vector table의 각 항목(vector) 길이는 0x80이며(즉 offset), vector 항목은 다음과 같음
- Synchronous
- IRQ
- FIQ
- SError
위와 같은 set으로 exception level과 aarch32 / 64에 따라 어떤 set을 사용할 것인지 달라짐
Address | Exception Type | Description |
VBAR_ELn + 0x000 | Synchronous | Current EL with SP0 |
+ 0x080 | IRQ | |
+ 0x100 | FIQ | |
+ 0x180 | SError | |
+ 0x200 | Synchronous | Current EL with SPx |
+ 0x280 | IRQ | |
+ 0x300 | FIQ | |
+ 0x380 | SError | |
+ 0x400 | Synchronous | Lower EL using AArch64 |
+ 0x480 | IRQ | |
+ 0x500 | FIQ | |
+ 0x580 | SError | |
+ 0x600 | Synchronous | Lower EL using AArch32 |
+ 0x680 | IRQ | |
+ 0x700 | FIQ | |
+ 0x780 | SError |
300x250
'ARM Architecture > ARMv8' 카테고리의 다른 글
ARMv8 Exception Level (0) | 2024.01.21 |
---|---|
ARMv8 주요 register (0) | 2024.01.21 |