ARM 프로세서에는 특이하게 7개의 모드가 존재한다.
동작모드는 프로세서가 어떤 권한을 가지고 무슨 일을 처리하는지 나타내는 프로세서의 동작상태를 일컷는다.
이 7개의 Mode서, 각 모드가 따로 SP(Stack Point)를 갖고 있는다.
(User와 System은 갖은 Stack 사용, 즉 6개의 Stack이 사용된다.)
Mode | Description | CPSR M[4:0] |
User | User Task나 Application을 수행할때의 동작모드로 모든 동작모드중유일하게 비특권 모드이다. User Mode는 메모리, I/O장치와 같은 시스템 자원을 사용하는데 제한을 두어 사용자의 실수를 방지한다. 다른 모드(SVC)로 이동하기 위한 방법으로는 소프트웨어 인터럽트를 발생시킨다. | 10000b |
FIQ (Fast IRQ) | 2개의 인터럽트 소스중 아주 빠르게 인터럽트를 처리할 수 있도록 구성된 모드. 빠른 처리를 위해서 Exception Vector에서도 최하단에 존재하고 별도의 레지스터를 소유한다. | 10001b |
IRQ (Interrupt Request) | 일반적으로 사용되는 인터럽트로 외부 장치에서 요청되는 하드웨어적인 IRQ의 발생에 의해 ARM 코어는 IRQ모드로 전환하고 인터럽트를 처리한다. | 10010b |
SVC (Superviser) | 대부분의 시스템 자원을 자유롭게 관리할 수 있는 동작모드로 주로 커널이나 디바이스 드라이버를 처리할 때(System Call) 동작되는 모드이다. | 10011b |
Abort | 메모리에서 명령을 읽거나 데이터를 읽거나 쓸 때 오류가 발생할 때 Abort Mode로 전환하여 오류를 처리한다. | 10111b |
Undefined | 명령어를 읽어 실행하고자 하나 읽어온 명령이 디코더에 정의되어 있지 않은 명령인 경우 발생되는 오류를 처리하는 모드이다. | 11011b |
System | User 모드와 동일한 Register를 사용하고 동일한 용도로 사용된다. User 모드와의 차이점은 특권을 갖고 있다는 것이다. | 11111b |
위 표에서 우측의 5bit짜리 정보는 CPSR이라는 상태 Register내에 저장된 정보이다. CPSR은 현재 모드의 상태를 저장하고 있는데, 그중 우측 0~4bit 총 5bit는 각 모드의 정보를 담고 있다. 32bit중 나머지 bit는 N,Z,C,V로 컨디션 코드 및 기타 정보로 사용된다. (Register 부분에서 언급예정)
인터럽트나 에러 또는 프로그래머에 의하여 모드가 변경될 수 있다.
다음에는 Exception에 대해 알아 볼 것인데 Exception에 의해서 모드가 변경되기 때문에 각 모드의 특징에 대해 알고 있어야 한다.
System/User/SVC Mode가 은근히 헷갈리고 명확히 정의내리기 애매했었다.
System과 User는 같은 Stack을 이용하여 거의 비슷하나, User Mode에서는 Device등의 자원을 사용하는데 제한이 주어진다. SVC Mode는 처음 Reset되었을 때 접근하는 Mode로 시스템 자원을 자유롭게 관리가 가능하며 별도의 Stack을 이용한다.
User Mode는 OS상에 올라가는 Application으로 생각하고,
OS는 기본적으로 System Mode,
OS나 Application이 시스템 자원(I/O등)을 사용할때는 SVC모드로 바뀐후 사용한다고 보면 된다.
이때, SVC모드로 바뀌어서 시스템 자원을 사용할 권한을 획득하는 것을 System Call이라고 지칭한다. (추후 자세히)
※ 이러한 모드가 눈에 보이는 것이 아니라, 개념적이고 추상적인 부분이라 정의를 명확히 해야한다. 현재 모드를 확인하려면 CPSR의 5bit를 출력해 봐야 비로소 눈으로 확인이 가능하다 -.,-; (가끔 헷갈려서 필자도 몇번 레지스터를 출력해보았다^_^)
출 처 : http://shinluckyarchive.tistory.com/270