반도체 소프트웨어

요약 6. ARMv8 익셉션 레벨 본문

CPU Architecture/ARM Architecture

요약 6. ARMv8 익셉션 레벨

반도체 소프트웨어 엔지니어 2023. 12. 31. 14:28
  1. 익셉션 레벨 개요

    • ARMv8의 기능(익셉션, 하이퍼바이저, 트러스트존)이 Exception Level기반으로 동작하기에 이해는 반드시 필요
    • Eln: 익셉션 레벨
      • n: PL을 의미
      • 익셉션 레벨과 특권 레벨과 거의 같은 개념 ex) EL1은 PL1 권한이 있는 익셉션 레벨
    • OS, RTOS를 구현할때 모든 익셉션 레벨을 구현해야할 필요는 없다.
      • EL0, EL1은 필수 구현 사항이고 EL2, EL3는 옵션이다.
      • EL2, EL3를 구현한다는 의미
        1. 각 익셉션 레벨별로 익셉션 핸들러를 구현
        2. 각 익셉션 레벨별로 사용되는 스택을 설정
        3. 익셉션 핸들러의 베이스 주소를 VBAR_ELx 레지스터를 통해 설정
        4. 관련 시스템 레지스터 및 MMU 설정
  2. 익셉션 레벨 종류

    • EL0: 유저모드
    • EL1: 커널모드
    • EL2
      • 게스트 OS끼리 스위칭
      • 게스트 OS의 시스템 리소스에 접근 가능
      • 하이퍼바이저 실행됨
    • EL3
      • 가장 높은 권한
      • 모든 시스템 설정 가능하며 모든 레지스터에 접근 가능
      • 부팅 과정에서 EL3로 설정
      • 트러스트존에서 많이 사용
  3. 익셉션 관련 레지스터
    • PSTATE
    • CurrentEL

      • MRS X0, CurrentEL로 익셉션 레벨을 읽으며, 브링업 코드에서 반드시 체크함
      • SPSR_ELx: 익셉션이 유발된 시점의 익셉션 레벨과 프로세서 속성 정보 저장
        1. PSTATE 정보 백업용도
        2. SPSR_EL1: EL1으로 익셉션이 유발되기 전의 PSTATE
        3. 주로 IRQ인터럽트 익셉션이 유발된 후 처리되는 인터럽트 서비스 루틴에서 SPSR_ELx를 활용해 인터럽트가 발생한 시점의 익셉션 레벨로 복귀
      • ELR_Elx: ELR_EL1: EL1으로 익셉션이 유발된 다음에 복귀할 주소를 저장
  4. 낮은 익셉션 레벨로 복귀하는 과정
    • SPSR_ELx 레지스터 설정(더 낮은 익셉션 레벨값을 저장)
    • ELR_ELx 레지스터 설정(더 낮은 익셉션에서 실행할 주소를 저장)
    • ERET 실행 ex) EL2에서 EL2으로 가기 위해서는 SPSR_EL2와 ELR_EL2에 익셉션 레벨값과 복귀 후 실행할 주소를 저장한 뒤에 ERET 명령어 실행
      • ARM 코어 내부에서 SPSR_ELx를 PSTATE에 로딩하고 ELR_ELx에 저장된 주소로 복귀
      • 잘못된 레벨로 복귀할 경우 Unknown Reason으로 익셉션
      • 익셉션 관련 설정 어셈블리 코드들이 있는 문서: Bare-metal Boot Code for ARMv8-A processors
  5. 익셉션 레벨 변경 명령어
    • SVC(슈퍼바이저 콜)
      • EL0에서 EL1으로 익셉션 레벨이 변경
      • EL0 Synchronous 익셉션 벡터 주소(VBAR + 0x400)로 프로그램 카운터 브랜치
      • ARM 관점에서는 익셉션 유발
      • OS 관점에서는 시스템 콜 유발
        1. ARMv7: R7 레지스터에  시스템콜 번호 저장
        2. ARMv8: X8 레지스터에 시스템콜 번호 저장
    • HVC(하이퍼바이저 콜)
      • EL1에서 EL2로 익셉션 레벨이 변경
      • 하이퍼바이저에 존재하는 익셉션 벡터 테이블 기준(VBAR_EL2)으로 EL1 Synchronous 익셉션 벡터 주소(VBAR + 0x400)으로 프로그램 카운터 브랜치
    • SMC(시큐어 모니터 콜)
      • EL1에서 EL3로 익셉션 레벨이 변경
      • EL3 시큐어 모니터 익셉션 벡터 테이블 기준(VBAR_EL3)으로 EL1 Synchronous 익셉션 벡터 주소(VBAR + 0x400)으로 프로그램 카운터 브랜치
      • 논시큐어와 시큐어 레벨을 전환
      • ERET으로 EL3에서 다시 EL1으로 복귀 가능(wfe, wfi 명령어로도 복귀 가능)
  6. 기타
    • 익셉션 = 트랩
    • h(핸들러모드): 익셉션 레벨별로 스택포인터를 각각 설정하는 모드
    • CurrentEL의 3,4번 비트가 익셉션 레벨 값
    • PSTATE의 M비트는 익셉션 레벨 값을 저장
    • 현재 익셉션 레벨도 뱅크드 레지스터이다 ex) SP가 바뀌면 SP_EL2도 같이 바뀐다(뱅크드하는건 ARM 코어 내부적으로 처리함)
    • ARMv8은 SP_ELx, ELR_ELx, SPSR_ELx 가 뱅크드됨

 

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

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

요약 8. ARMv8 익셉션  (0) 2023.12.31
요약 7. ARMv7 익셉션  (0) 2023.12.31
요약 5. ARMv7 동작모드  (0) 2023.12.30
요약 4. ARM 어셈블리 명령어  (0) 2023.12.30
요약 3. ARM 레지스터  (0) 2023.12.30