-
Exception : 외부 요청이나, 오류와 관련된 사건 (인터럽트 포함)
-
Exception 을 통해 하드웨어적으로 정해진 특별한 reaction 이 발생한다.
-
여기서 reaction 은 exception 이 발생하면 진행하던 동작을 멈추고 exception 의 종류에 해당하는 모드에 진입하고, exception 이 물려있는 주소로 pc를 점프한 후 exception 에 대한 처리를 하는 것.
- SVC : 전원을 인가하거나 reset 을 시키면 SVC 모드로 진입하고 PC를 0x00 으로 점프시킨다.
- IRQ/FIQ : Interrupt 발생하면 IRQ/FIQ 모드 진입 후 PC 를 0x1C 또는 0x18로 점프
- ABT : Data Abort 시 0x10, Prefetch Abort 시 0x0C
- UND : undef exception 발생 시 0x04 로 점프
![](https://velog.velcdn.com/images/junslee0912/post/ac172c5d-c014-4295-ba05-c5972b6b609a/image.png)
-
Exception Vector 란 Exception 발생 시 그 Exception 에 해당하는 미리 정해진 address 로 점프하는데 이 address 를 Exception Vector 라 한다. 그리고 Excpetion Vector 를 모두 모아둔 테이블을 Exception Vector Table 이라 한다.
-
각 mode 별 CPSR 의 모드 비트 값이다.
![](https://velog.velcdn.com/images/junslee0912/post/4b982b14-ca13-47b5-a122-3b63d704ef19/image.png)
-
각 모드 별로 어떤 Exception 이 발생했을 때 해당 모드로 진입하는지 알아보자.
- SVC : Power on / Reset
- IRQ : Hardware 적인 interrupt 발생 시
- FIQ : Interrupt 중 Fast Interrupt 발생 시
- ABT : Access 하려는 메모리 주소가 access 불가능한 주소이거나, instruction fetch 하려는데 못해온 경우. MPU 사용 시에는 Access Protection 이 걸려있는 주소를 함부로 접근하려 할 때
- UND : Instruction 을 decode 했는데 해석이 불가능한 모르는 명령어일 경우. 보통 Memory Corruption 이 발생하여 instruction을 망쳐놨을 때.
-
SVC -> IRQ 모드 변경 과정을 살펴보자.
- SVC 에서 실행 중이던 CPSR 값을 SPSR_IRQ 에 저장하자.
- CPSR 모드 비트를 IRQ로 변경. SP(R13) 도 R13_IRQ 로 변경
- IRQ disable, ARM mode on
- R14(LR)_IRQ에 현재 SVC 모드에서 실행중이던 PC 값을 저장
- R15(PC) 에 Exception Vector (IRQ는 0x18) 저장
- R0~R12 를 R13(SP)_IRQ 가 가리키는 값에 저장
- R14(LR)_IRQ 에 저장된 값을 보정. (-4)