ARM 아키텍처 실행 모드 학습 노트

1. 개요

ARM 아키텍처는 광범하게 사용되는 정밀 명령 집합 계산(RISC) 아키텍처로, 명령 집합을 단순화하여 프로세서 성능과 효율성을 높이는 설계 철학을 가지고 있습니다. ARM 프로세서는 다양한 실행 모드를 지원하며, 이러한 모드는 프로세서의 권한 레벨, 접근 가능한 레지스터 그룹 및 사용 가능한 명령 집합을 결정합니다.

2. ARM 아키텍처 버전 진화

아키텍처 버전 주요 특성 실행 모드 지원
ARMv1 기본 32비트 아키텍처 기본 모드
ARMv2 코프로세서 명령 추가 기본 모드
ARMv3 MMU 지원 추가 전체 모드 세트
ARMv4 Thumb 명령 집합 전체 모드 세트
ARMv5 ARMv5TE 명령 집합 전체 모드 세트
ARMv6 SIMD 명령 집합 전체 모드 세트
ARMv7 NEON 명령 집합, TrustZone 전체 모드 세트 + 보안 확장
ARMv8 64비트 아키텍처, AArch64 AArch32 모드 세트 + AArch64 예외 레벨

3. 전통적 ARM 실행 모드 (AArch32)

3.1 사용자 모드 (User Mode)

  • 권한 레벨: 최저 권한 레벨
  • 용도: 일반 애플리케이션이 실행되는 모드
  • 특징:
  • 시스템 리소스에 직접 접근 불가
  • 시스템 호출(SWI 명령)을 통해 다른 모드로 전환 필요
  • CPSR 레지스터의 모드 비트를 직접 수정할 수 없음
  • 레지스터: 기본 레지스터 그룹(R0-R14, PC, CPSR) 사용
  • 응용 시나리오:
  • 사용자 애플리케이션
  • 서드파티 소프트웨어
  • 일반 계산 작업

3.2 빠른 인터럽트 모드 (FIQ, Fast Interrupt Request)

  • 권한 레벨: 높은 권한 레벨
  • 용도: 빠른 응답이 필요한 인터럽트 처리
  • 특징:
  • 추가 전용 레지스터(R8-R14_fiq) 존재
  • 컨텍스트 전환 시간 감소
  • IRQ보다 높은 우선순위
  • 레지스터:
  • 기본 레지스터 그룹
  • 전용 레지스터: R8_fiq-R14_fiq
  • 응용 시나리오:
  • 고속 데이터 전송(DMA 작업)
  • 실시제 시스템 제어
  • 고주파 샘플링 작업

3.3 인터럽트 모드 (IRQ, Interrupt Request)

  • 권한 레벨: 높은 권한 레벨
  • 용도: 일반 인터럽트 요청 처리
  • 특징:
  • FIQ보다 더 많은 지연 발생
  • 더 복잡한 인터럽트 처리
  • FIQ에 의해 인터럽트될 수 있음
  • 레지스터:
  • 기본 레지스터 그룹
  • 전용 레지스터: R13_irq, R14_irq
  • 응용 시나리오:
  • 외장 장치 인터럽트
  • 타이머 인터럽트
  • 네트워크 인터럽트

3.4 관리자 모드 (Supervisor Mode)

  • 권한 레벨: 높은 권한 레벨
  • 용도: 운영체제 커널이 실행되는 모드
  • 특징:
  • 시스템 시작 시 기본 모드
  • 소프트웨어 인터럽트(SWI) 처리
  • 모든 시스템 리소스에 접근 가능
  • 레지스터:
  • 기본 레지스터 그룹
  • 전용 레지스터: R13_svc, R14_svc
  • 응용 시나리오:
  • 운영체제 커널
  • 시스템 호출 처리
  • 시스템 초기화

3.5 중단 모드 (Abort Mode)

  • 권한 레벨: 높은 권한 레벨
  • 용도: 메모리 접근 예외 처리
  • 특징:
  • 가상 메모리 관리와 메모리 보호에 사용
  • 페이지 오류와 접근 권한 오류 처리
  • 레지스터:
  • 기본 레지스터 그룹
  • 전용 레지스터: R13_abt, R14_abt
  • 응용 시나리오:
  • 페이지 오류 처리
  • 메모리 접근 범위 초과
  • 메모리 보호 예외

3.6 정의되지 않은 명령 모드 (Undefined Mode)

  • 권한 레벨: 높은 권한 레벨
  • 용도: 정의되지 않은 명령 처리
  • 특징:
  • 소프트웨어 에뮬레이션 확장 명령 집합에 사용
  • 불법 명령 예외 처리
  • 레지스터:
  • 기본 레지스터 그룹
  • 전용 레지스터: R13_und, R14_und
  • 응용 시나리오:
  • 명령 집합 확장
  • 소프트웨어 에뮬레이션
  • 디버깅 지원

3.7 시스템 모드 (System Mode)

  • 권한 레벨: 높은 권한 레벨
  • 용도: 운영체제의 권한이 필요한 작업 실행
  • 특징:
  • 사용자 모드와 동일한 레지스터 그룹 사용
  • 권한 있는 접근 권한 보유
  • 시스템 리소스에 직접 접근 가능
  • 레지스터: 기본 레지스터 그룹 사용 (사용자 모드와 동일)
  • 응용 시나리오:
  • 운영체제 커널 작업
  • 권한 있는 접근이 필요한 시스템 서비스
  • 커널 스레드

4. ARMv8 아키텍처 모드 (AArch64)

4.1 예외 레벨 (Exception Levels)

ARMv8는 전통적인 실행 모드를 대체하는 예외 레벨(EL) 개념을 도입했습니다:

예외 레벨 설명 전통 모드와의 대응
EL0 애플리케이션 레벨 사용자 모드
EL1 운영체제 레벨 관리자 모드
EL2 가상화 레벨 신규 추가
EL3 보안 모니터링 레벨 신규 추가

4.2 AArch64의 특징

  • 64비트 레지스터: X0-X30, 64비트 일반 레지스터
  • 예외 처리: 예외 레벨과 벡터 테이블 기반
  • 메모리 관리: 더 큰 물리 주소 공간 지원
  • 명령 집합: A64 명령 집합, 더 효율적인 64비트 연산

5. 보안 확장 모드 (TrustZone)

5.1 보안 월드 (Secure World)

  • 접근 권한: 보안 및 비보안 리소스 모두 접근 가능
  • 용도: 민감한 작업 처리
  • 응용 시나리오:
  • 보안 부팅
  • 암호학 연산
  • 보안 저장
  • 생체 인식

5.2 비보안 월드 (Non-secure World)

  • 접근 권한: 비보안 리소스만 접근 가능
  • 용도: 일반 애플리케이션 실행
  • 응용 시나리오:
  • 일반 애플리케이션
  • 운영체제
  • 서드파티 소프트웨어

6. 모드 전환 메커니즘

6.1 트리거 방식

  • 외부 인터럽트: FIQ 및 IRQ와 같은
  • 예외: 메모리 접근 오류, 정의되지 않은 명령과 같은
  • 소프트웨어 인터럽트: SWI 명령(AArch32) 또는 SVC 명령(AArch64)을 통한
  • CPSR 레지스터 직접 수정: 권한 있는 모드에서
  • 보안 모니터링 호출: SMC 명령(TrustZone)을 통한

6.2 컨텍스트 전환

  • 레지스터 저장: 전환 시 필요한 레지스터 자동 저장
  • 스택 작업: 해당 모드의 스택 포인터 사용
  • 반환 메커니즘: R14(링크 레지스터) 또는 ERET 명령(AArch64)을 통한

7. 응용 시나리오 예시

7.1 임베디드 시스템

  • 사용자 모드: 애플리케이션
  • FIQ 모드: 실시간 제어
  • IRQ 모드: 외장 장치 인터럽트
  • 관리자 모드: RTOS 커널

7.2 모바일 기기

  • 사용자 모드: 애플리케이션
  • EL1: 운영체제
  • EL2: 가상화
  • EL3: 보안 부팅
  • 보안 월드: 지문 인식, 결제

7.3 서버

  • EL0: 애플리케이션
  • EL1: 운영체제
  • EL2: 가상 머신 모니터
  • EL3: 보안 관리

8. 프로그래밍 주의사항

8.1 모드 전환

  • 빈번한 모드 전환을 피하여 오버헤드 감소
  • 시간 중요한 작업에 FIQ을 합리적으로 사용
  • 레지스터 상태의 올바른 저장 및 복원

8.2 보안 프로그래밍

  • 최소 권한 원칙 준수
  • TrustZone을 사용하여 민감한 작업 격리
  • 보안 월드와 비보안 월드 간의 부적절한 상호작용 방지

8.3 성능 최적화

  • 다른 모드에 작업을 합리적으로 할당
  • FIQ의 빠른 응답 특성 활용
  • 인터럽트 처리 프로세스 최적화

9. Cortex-M 시리즈 실행 모드

9.1 Cortex-M 아키텍처 개요

Cortex-M 시리즈는 ARM이 마이크로컨트롤러와 실시간 시스템을 위해 설계한 프로세서 아키텍처로, 전통적인 ARM 아키텍처와 비교하여 실행 모드가 더 단순화되어 있으며, 저전력 및 실시간성 요구가 높은 응용 시나리오를 위해 설계되었습니다.

9.2 Cortex-M 실행 모드

Cortex-M 시리즈 프로세서는 두 가지 기본 실행 모드를 지원합니다:

9.2.1 스레드 모드 (Thread Mode)
  • 권한 레벨: 권한 있거나 없음으로 구성 가능
  • 용도: 애플리케이션 코드 실행
  • 특징:
  • 시스템 리셋 후 기본 모드
  • CONTROL 레지스터를 통해 권한 레벨 구성 가능
  • 권한 없는 레벨에서는 특정 시스템 리소스에 접근 불가
  • 응용 시나리오:
  • 애플리케이션 메인 루프
  • 일반 작업 실행
  • 비중요 시스템 작업
9.2.2 핸들러 모드 (Handler Mode)
  • 권한 레벨: 항상 권한 있는 레벨
  • 용도: 인터럽트 및 예외 처리
  • 특징:
  • 인터럽트 또는 예외에 의해 트리거되어 진입
  • 핵심 레지스터 자동 저장
  • 인터럽트 서비스 루틴(ISR) 실행
  • 응용 시나리오:
  • 인터럽트 처리
  • 예외 처리
  • 시스템 호출

9.3 Cortex-M 모드 전환

9.3.1 스레드 모드에서 핸들러 모드로
  • 트리거 방식: 외부 인터럽트, 예외, 시스템 호출(SVC 명령)
  • 과정:
  1. 레지스터(R0-R3, R12, LR, PC, xPSR)를 스택에 자동 저장
  2. 인터럽트 서비스 루틴 주소를 PC에 로드
  3. 핸들러 모드로 진입
9.3.2 핸들러 모드에서 스레드 모드로
  • 트리거 방식: BX LR 또는 RET 명령 실행 (EXC_RETURN 값과 함께)
  • 과정:
  1. 저장된 레지스터를 스택에서 복원
  2. 인터럽트된 프로그램으로 복귀
  3. 스레드 모드의 권한 레벨 복원

9.4 Cortex-M 예시 코드

9.4.1 인터럽트 처리 예시
// Cortex-M 인터럽트 처리 함수
void EXTI0_IRQHandler(void)
{
    // 인터럽트 처리
    if (EXTI->PR & EXTI_PR_PR0) {
        // 인터럽트 플래그 지우기
        EXTI->PR |= EXTI_PR_PR0;
        // 인터럽트 처리 로직 실행
        GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    }
    // 자동으로 스레드 모드로 복귀
}
9.4.2 시스템 호출 예시
// 스레드 모드에서 시스템 호출 트리거
void app_function(void)
{
    // SVC 인터럽트 트리거하여 핸들러 모드 진입
    __svc(0x01);
    // 시스템 호출 복귀 후 계속 실행
}

// SVC 인터럽트 처리 함수
void SVC_Handler(void)
{
    // SVC 번호 가져오기
    uint8_t svc_number;
    __asm volatile (
        "TST LR, #4\n"
        "ITE EQ\n"
        "MRSEQ R0, MSP\n"
        "MRSNE R0, PSP\n"
        "LDRB %0, [R0, #24]\n"
        : "=r" (svc_number)
        :
        : "r0", "cc"
    );
    
    // SVC 번호에 따라 해당 작업 실행
    switch (svc_number) {
        case 0x01:
            // SVC 0x01 처리
            break;
        // 다른 SVC 처리...
    }
    // 자동으로 스레드 모드로 복귀
}

10. 사용 예시

10.1 AArch32 모드 전환 예시

10.1.1 소프트웨어 인터럽트 예시 (사용자 모드에서 관리자 모드로)
; 사용자 모드에서 소프트웨어 인터럽트 트리거
MOV R0, #42      ; 시스템 호출 파라미터
SWI #0x123456    ; 소프트웨어 인터럽트 트리거하여 관리자 모드 진입

; 관리자 모드에서의 인터럽트 처리
SVC_Handler:
    STMFD SP!, {R0-R12, LR}  ; 레지스터 저장
    ; 시스템 호출 처리
    CMP R0, #42
    BEQ handle_specific_call
    ; 다른 처리...
    LDMFD SP!, {R0-R12, PC}^ ; 레지스터 복원 및 사용자 모드로 복귀
10.1.2 FIQ 인터럽트 처리 예시
; FIQ 인터럽트 처리 프로그램
FIQ_Handler:
    ; FIQ 모드에는 전용 레지스터 R8-R14_fiq가 있어 저장 불필요
    ; 인터럽트 빠르게 처리
    LDR R8, =GPIO_STATUS
    LDR R9, [R8]
    ; GPIO 인터럽트 처리
    STR R0, [R8]  ; 인터럽트 플래그 지우기
    ; 직접 복귀, 레지스터 복원 불필요
    SUBS PC, LR, #4  ; 인터럽트된 프로그램으로 복귀

10.2 AArch64 모드 전환 예시

10.2.1 시스템 호출 예시 (EL0에서 EL1로)
; EL0에서 시스템 호출 트리거
MOV X0, #42      ; 시스템 호출 파라미터
SVC #0x0         ; 시스템 호출 트리거하여 EL1 진입

; EL1에서의 인터럽트 처리
SVC_Handler:
    STP X0, X1, [SP, #-16]!
    STP X2, X3, [SP, #-16]!
    ; 시스템 호출 처리
    CMP X0, #42
    BEQ handle_specific_call
    ; 다른 처리...
    LDP X2, X3, [SP], #16
    LDP X0, X1, [SP], #16
    ERET          ; EL0으로 복귀
10.2.2 예외 처리 예시
; EL1 예외 처리 프로그램
Exception_Handler:
    ; 컨텍스트 저장
    STP X0, X1, [SP, #-16]!
    STP X2, X3, [SP, #-16]!
    ; 예외 원인 확인
    MRS X0, ESR_EL1
    ; 예외 처리
    ; 컨텍스트 복원
    LDP X2, X3, [SP], #16
    LDP X0, X1, [SP], #16
    ERET          ; 예외가 발생한 위치로 복귀

10.3 TrustZone 보안 월드 전환 예시

10.3.1 보안 모니터링 호출(SMC) 예시
; 비보안 월드에서 보안 월드 호출
MOV X0, #0x123   ; 보안 서비스 ID
MOV X1, #42       ; 파라미터
SMC #0           ; 보안 모니터링 호출 트리거

; 보안 월드에서 처리
SMC_Handler:
    ; 컨텍스트 저장
    ; 보안 서비스 처리
    CMP X0, #0x123
    BEQ handle_secure_service
    ; 컨텍스트 복원
    ERET          ; 비보안 월드로 복귀

11. 결론

ARM 아키텍처의 다양한 실행 모드 설계는 시스템에 유연한 권한 레벨 관리를 제공하면서, 시스템의 안정성과 보안성을 보장하고 효율적인 인터럽트 처리 메커니즘을 제공합니다. 다양한 모드의 합리적인 사용은 ARM 프로세서의 성능과 효율성 장점을 최대한 활용할 수 있게 하며, 임베디드 장치부터 서버까지 다양한 응용 시나리오에 적합합니다.

ARM 아키텍처의 지속적인 진화, 특히 ARMv8 및 그 이상 버전의 출시와 함께 실행 모드 개념도 현대적 컴퓨팅 요구에 부응하여 발전하고 있습니다. 이러한 모드의 작동 원리와 응용 시나리오를 이해하는 것은 ARM 플랫폼의 시스템 개발과 성능 최적화에 매우 중요합니다.

본 문서의 사용 예시를 통해 개발자들은 ARM 아키텍처 실행 모드의 실제 응용 방법을 더 잘 이해하고, 개발 과정에서 더 합리적인 설계 결정을 내릴 수 있게 될 것입니다.

Cortex-M 시리즈는 ARM 아키텍처의 중요한 구성 요소로서, 단순화된 실행 모드 설계는 마이크로컨트롤러와 실시간 시스템에 효율적이고 신뢰성 있는 실행 환경을 제공하며, 저전력 및 실시간성 요구가 높은 응용 시나리오에 특히 적합합니다.

태그: ARM 아키텍처 실행모드

6월 8일 17:29에 게시됨