ARM 아키텍처 문서를 보면 가장 먼저 보이는 용어가 ARM 동작 모드입니다. ARM 아키텍처를 이해하기 위해 꼭 알아야 하는 개념이니 자주 보면서 익혔으면 합니다. ARM 동작 모드를 잘 배워야 시스템을 디자인하거나 디버깅을 할 때 유용하게 활용할 수 있습니다. 
 
User 모드를 시작으로 각각 동작 모드에 대해 소개하겠습니다.
 
User 모드
 
휴대폰에서 사용하는 브라우저, 카카오톡와 같은 애플리케이션이 구동되는 모드입니다. 라즈베리 파이에서 다음과 같은 유저 애플리케이션 코드를 빌드해 애플리케이션을 동작하는 모드입니다. 
 
#include <stdio.h>
 
int main() 
{
    printf("hello, world\n");
    return 0;
}
 
유저 모드에서 실행되는 코드는 메모리와 같은 리소스를 접근할 때 제약이 있습니다.
 
Supervisor 모드
 
User 모드에서 슈퍼바이저 콜(Supervisor Call)을 수행하면 진입되는 모드입니다. 운영체제의 커널이 동작하는 모드로 시스템 전체 메모리 공간에 접근할 수 있는 권한이 있습니다.
 
시스템 모드
 
시스템 모드에서 실행되는 코드는 PL1 레벨을 갖습니다. 시스템 전체 메모리 공간에 접근할 수 있는 권한이 있는 모드입니다.  
 
어보트 모드
 
데이터 어보트나 Prefetch 어보트와 같은 메모리 어보트(Memory Abort)가 발생할 때 진입하는 모드입니다. 운영체제에서 어보트 모드에 진입하면 어보트가 발생할 때의 정보를 로그로 출력하면서 시스템이 리셋됩니다.
 
Undefined 모드
 
ARM 코어는 ARM 어셈블리 명령어를 실행하기 위해 명령어를 디코딩하는데, ARM 코어가 해석할 수 없는(UNDEFINED) 명령어를 실행할 때 진입되는 모드입니다. 운영체제에서는 어보트 모드와 마찬가지로 시스템이 리셋됩니다. 대부분 메모리나 하드웨어 부품에 문제가 생겼을 경우 Undefined 모드로 진입합니다. 일부러 유효하지 않는 명령어를 실행해 Undefined 모드의 익셉션 벡터가 실행되도록 해 디버깅 목적으로 활용하는 경우도 있습니다.
 
IRQ 모드
 
인터럽트 요청이 발생하면 진입하는 모드입니다. IRQ 모드에서는 IRQ가 발생하기 직전의 ARM 모드를 저장한 후 인터럽트에 대한 처리를 수행합니다. 대부분 운영체제에서는 IRQ 모드로 진입하면 인터럽트에 대한 후속 처리를 수행하며 이를 ISR(Interrupt Service Routine)이라고 부릅니다.
 
FIQ 모드
 
FIQ(Fast Interrupt Request) 요청이 발생하면 진입하는 모드입니다. 일부 운영체제에서는 FIQ를 디버깅 용도로 사용합니다.
 
Hyp 모드
 
멀티 운영체제를 동작시키는 하이퍼바이저 환경에서만 진입하는 모드입니다. 일반적으로 운영체제의 커널이 동작하는 Supdervisor 모드에서 “hvc” 명령어를 실행하면 진입하는 모드입니다. 한 개의 컴퓨터에서 한 개의 운영체제로 구성된 시스템에서는 Hyp 모드를 사용하지 않습니다.
 
모니터 모드
 
보통 트러스트 존에 진입할 때 실행되는 모드로 Supervisor 모드에서 "SMC" 명령어가 실행되는 진입됩니다. 시스템에서 보완 관련 기능을 구현할 때 진입하는 모드입니다.
 
여기까지 ARMv7 아키텍처의 동작 모드에 대해 소개 했습니다.
 
ARMv7 아키텍처의 동작 모드로 진입하는 유발자는 익셉션이기 때문에 ARMv7 아키텍처의 동작 모드는 익셉션의 원리와 함께 배우는 경우가 많습니다.
 
< '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 저자>
 
* 유튜브 소개 영상

+ Recent posts