1. ARM Exception
ARM chipset에는 기본적으로 7가지 exception이 존재한다. ARM Exception Table은 아래와 같다.
위의 Exception들은 ARM 에서 chipset 설계 및 개발 시 미리 만들어둔 것으로 기본적으로 C에서 Try-catch문을 통해 Exceiption발생 시 처리하는 것과 같이 미리정의된 위의 7개의 Exception 상황 발생 시 handler로 jump해서 처리하도록 구현된 것이다.
위의 7개는 모두 ARM에서 미리정의가 필요한 만큼 system에서 치명적인 예외들로 이 중에서도 더 치명적인인지 아닌지 여부에 따라 우선순위가 결정된다.
예를 들어 가장 치명적인 Reset Exception발생 시 0x0000 0000 주로소 바로 이동되며 우선순위가 가장 높다.
참고로 ARM은 high, low 두 가지 모드가 존재하며 위 ARM Exception Table은 Low모드 기준으로 high모드인 경우 vector address값이 다르다.
또한 위 Reset Exception의 경우 system reset이 필요한 예외가 발생했을 때 처리하는것도 맞지만 기본적으로 ARM chipset에 처음 power on이되었을 때 실행하는 default handler이다.(Low기준으로 ARM에 전원이 들어오면 가장 처음하는 작업이 0x0000 0000주소를 읽는것이라고 생각하면 된다)
때문에 부팅을 위한 boot code등을 실행하기 위해서는 reset handler 즉 SVC모드를 이용해서 작업할 수 있다.
추가로 secure boot를 진행하느냐에 따라서도 처음 boot 과정(접근 주소 등)이 바뀌게 되는데 secure boot는 나중에 Firmware OS개발 후 추가 개발진행 시에 알아보면 좋을 것 같다.
2. ARM Mode
ARM은 7가지의 모드를 가지고 있으며 각각의 모드에 대한 이해가 필요하다.
먼저 모드를 결정하는 레지스터는 CPSR register이며 해당 register bit값을 바탕으로 현재 어떤 모드로 운용되고있는지 판단한다.
- User
가장 기본적인 운용모드로 보통 User Code, Kernel Code로 나뉘었을때 User Code동작을위한 모드이다. non-privileged모드로 스스로 모드를 바꿀 수없고 system exception, interrupt등의 상황을 바탕으로 다른 모드로 변경이 가능하다. system code를 지키기위해 사용자의 실수를 감안할 수 있는 흔히 일반 사용자가 접하게되는 모드이다.
- FIQ
빠른 인터럽트 처리를 위한 모드로 별도 register를 보유하고 빠르게 인터럽트 동작을 처리하낟.
- IRQ
일반 인터럽트 처리 모드이다.
- SVC
SVC모드는 reset exception을 처리하는 등 system과 device driver 접근등을 처리할 때 사용하는 모드이다.
device driver를 처리하기 때문에 마우스, 키보드 등 다양한 hw를 제어하기 위해서는 SVC모드로의 진입이 필요하다.
- Abort
존재하지 않는 메모리 등을 접근할 때 Abort Exception이 발생하고 이를 처리하기 위한 모드이다.
- Undefined
디코드에 정의되지 않은 명령을 처리하라고 했을 때 해당 오류를 처리하기위한 모드이다.
- System
흔히 User code, Kernel Code로 나뉘었을 때 Kernel Code를 의미하는 모드로 User와 동일한 레지스터를 사용하고 system call로 user mode에서 kerenl로 들어왔을 때 모드로 볼 수 있다. user와의 차이는 privileged mode라는 점이다.
- ref
'OS > Firmware Project' 카테고리의 다른 글
[OS] Firmware Project (5) - 입출력 (0) | 2021.06.28 |
---|---|
Firmware Project (4) - Memory Set (0) | 2021.06.20 |
[OS] Firmware Project (3) - ELF & SYS_ID (0) | 2021.06.13 |
[OS] Firmware Project (1) - 개발환경 & 배경 (0) | 2021.06.13 |
[OS] Firmware Project를 시작하기 전에... (0) | 2021.06.11 |