반도체 소프트웨어

요약 5. ARMv7 동작모드 본문

CPU Architecture/ARM Architecture

요약 5. ARMv7 동작모드

반도체 소프트웨어 엔지니어 2023. 12. 30. 16:55
  1. 익셉션, 트러스트존을 비롯한 ARMv7 아키텍처의 많은 기능은 동작 모드 기반 위에서 설계되어 있기에 동작모드 이해는 중요
  2. PL(priviliege level): 특권레벨
    • 소프트웨어 실행시에 리소스(하드웨어, 메모리 등)에 접근하는 권한을 구분
    • PL0
      • 유저모드에서 애플리케이션 소프트웨어가 실행되는 모드
      • unprivileged 소프트웨어 실행
      • 몇가지 아키텍처 기능 설정 불가하기에 시스템콜로 대체해서 사용함
      • 메모리 접근 제약 존재
      • PL0에서 SVC 명령어를 실행해 익셉션(트랩)이 유발돼야 PL1으로 진입 가능
    • PL1
      • 루트 권한과 비슷한 개념
      • 유저 모드와 HYP모드를 제외한 모든 모드가 PL1에서 실행
      • 보통 OS 시스템(커널)이 PL1에서 실행
      • SVC, IRQ, FIQ, ABT, UND, SYS 모드 등이 실행됨
      • 하드웨어적으로 시스템 설정 동작 가능
      • SUBS PC LR / MOVS PC LR 과 같은 명령어를 실행해서 PL1에서 정의된 동작 모드로 스위칭
      • 변경시에는 SPSR 레지스터 모드 필드에 비트 설정
  3. 동작 모드 선택 방법
    • ARM 관점과 리눅스 관점은 다름
    • 따라서 동작모드는 프로젝트의 스펙에 맞게 동작모드를 선택하면 됨
    • 간단한 프로젝트가 아니라면, 운영체제가 필요하다면 user 모드와 svc 모드 각각 코드를 작성해야하고 예외처리를 위한 어보트 익셉션 처리 루틴도 개발해줘야함(즉 각 동작 모드의 특성을 살리면 다양한 방식으로 시스템을 설계할 수 있음)
    • 기타
      • OS는 동작 모드 잘 모름. ARM이 관리하는 거임
      • CPSR보다 SPSR 동작 제어를 더 많이함(이전 동작의 모드)
      • 결론적으로 동작모드를 관리하기 위해서 ARMv7은 CPSR, SPSR을 사용
  4. cpsr 레지스터는 PL1권한에서 실행되는 svc, irq, fiq, abort모드에서 직접 접근가능(PL0은 직접 접근 불가능)(이렇게 cpsr 레지스터의 동작모드를 읽음으로써 프로그램 실행 흐름을 다양하게 처리할 수 있음)
  5. SPSR
    • 익셉션이 유발돼 동작 모드가 변경되기 전의 CPSR 레지스터 값을 저장
      • 익셉션 처리 후 이전 모드로 복귀하기 위해 주로 사용
      • 즉 익셉션 유발되기 전 동작 모드를 SPSR로 알 수 있음
      • 동작모드에 뱅크드된 레지스터
      • 익셉션 핸들러에서는 spsr값 읽는 것이 필수
    • SPSR 활용
      • 익셉션 핸들러 구현 ex) IRQ 모드, ABT 모드
        1. 익셉션 핸들러 초반에 SPSR 값에 따라서 코드를 다르게 실행함
          • 어보트 모드에서 SPSR이 유저모드이면 익셉션 서비스 루틴 끝에 해당 프로세스를 그냥 종료
          • 어보트 모드에서 SPSR이 SVC모드이면 익셉션 서비스 루틴 끝에 커닐 패닉 발생
      • 익셉션이 유발된 이전 동작 모드로 복귀(동작 모드를 다양한 방식으로 변경)
        1. 인터럽트 처리시에 보통 사용
  6. 동작모드 변경 명령어
    • 익셉션이 발생하면 해당 익셉션에 대응하는 동작 모드로 진입하지만, 가끔 임의로 진입할 상황 존재
    • MSR CPSR_C 명령어
      • PL1 동작 모드끼리는 위 명령어로 동작 모드 변경 가능 ex) MSR CPSR_C, #Mode_IFQ:OR:I_Bit:OR:F_Bit;
    • SUBS / MOVS 명령어
      • SUBS PC, LR, #4
      • MOVS PC, LR (LR주소를 PC에 옮기기 + 동작 모드 변경을 모두 수행)
      • 실행 과정
        1. spsr_현재모드 레지스터와 변경하려는 뱅크드레지스터에 변경할 동작 모드 비트값 저장
        2. LR 레지스터에 동작모드 변경 후, 분기할 주소를 업데이트
        3. 위 명령어 실행
          • ARM 내부적 과정
          • SPSR값 읽어서 CPSR에 동작 모드 복사
          • PC에서 가리키는 주소로 분기
        4. spsr_현재모드에 명시된 동작 모드로 변경되면서 LR에 지정된 주소(ex.__irq_usr/__irq_svc 레이블)로 PC를 분기
  7. 기타
    • 리눅스 커널은 ARM기반에서 구동되는 프로그램 예시를 많이 보유함
    • 리눅스는 ARM동작 모드별로 스택을 개별적으로 저장한다.
    • 인터럽트나 abort 익셉션 발생해서 각 모드로 진입해도 결국 리눅스커널에서는 그 모드들을 svc모드로 진입해서 처리를 진행한다(간결하게 시스템을 구성)
      • 결론적으로 irq, abrt, pbrt, und 등 모드들은 익셉션 처리 핸들러 코드에서 svc모드로 전환된 후, 실제적인 익셉션 서비스 처리 루틴이 실행된다(MOVS PC, LR)
    • ARMv7 익셉션 벡터 엔트리 주소: 0xFFFF0000
    • 데이터 어보트: 페이지폴트, 널포인터 엑세스 등 으로 발생
    • __asm__: 인라인 어셈블리

 

출처: 인프런, "시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리", https://inf.run/FiFG

'CPU Architecture > ARM Architecture' 카테고리의 다른 글

요약 7. ARMv7 익셉션  (0) 2023.12.31
요약 6. ARMv8 익셉션 레벨  (0) 2023.12.31
요약 4. ARM 어셈블리 명령어  (0) 2023.12.30
요약 3. ARM 레지스터  (0) 2023.12.30
요약 2. ARM 공부 이유  (0) 2023.12.30