반도체 소프트웨어

요약 8. ARMv8 익셉션 본문

CPU Architecture/ARM Architecture

요약 8. ARMv8 익셉션

반도체 소프트웨어 엔지니어 2023. 12. 31. 14:52
  1. 익셉션: ARM코어가 명령어를 처리하다가 예외 사항이 발생할때 이를 처리하는 방식 (익셉션을 통해서 실행 흐름을 바꾼다고 볼 수도있다, 모드 전환)
  2. 익셉션이 발생하면 익셉션 종류별로 지정된 익셉션 벡터로 프로그램 카운터가 분기
  3. 익셉션 벡터 주소가 0x80바이트 단위로 정렬되므로 ARMv7과는 다르게, 익셉션 벡터 주소에서 익셉션을 처리할 수 있는 여러 명령어를 실행
  4. 익셉션 종류를 계층구조로 변환

    • Synchronous 와 asynchronous로 큰 카테고리를 분류하고, 하위 카테고리로 익셉션 유발 인자를 익셉션 클래스로 정의
    • 익셉션 분류 체계
      • synchronous 타입: 공통적으로 어셈블리 명령어 실행과정에서 발생
      • asynchronous 타입: 외부 인터럽트, 외부 메모리 데이터 어보트가 원인
    • ESR_ELx를 통해 익셉션 유발 인자를 읽을 수 있음
  5. 익셉션 잘 알아야하는 이유
    • 디버깅 능력 키우기 위해: 실전 프로젝트, 크래시, 메모리 어보트가 발생했을때 ARM 아키텍처가 어떻게 처리하고 어떤 레지스터로 정보를 알려주는지 파악하면 더 효율적으로 디버깅 가능
    • 트러스트존을 이해하기 위해
      • 트러스트존: CPU내부 보안 수준이 높은 보안 애플리케이션이 실행될 수 있는 실행 영역을 확보
      • 월드를 스위칭할때 익셉션이 유발되므로, 이해하기 위해서 필요
    • 가상화 시스템을 이해하기 위해
    • 운영체제 커널의 핵심 기능을 이해하기 위해
      • 시스템콜, 인터럽트 서비스 루틴, 페이지폴트
      • ARM의 익셉션 기능을 활용해서 만들어졌기에
    • 익셉션 벡터 테이블

      • SP_EL0 : 사실상 사용안함
      • SP_ELx, x > 0: Current Exception Level에서 익셉션 발생했을 때 OFFSET
      • 그 하위: Lower Exception Level에서 익셉션 발생했을 때 OFFSET
  6. synchronous 익셉션 실행 흐름
    • Data Abort 처리 흐름

      • MMU에서 가상주소 -> 물리주소 변환시에 오류 발생시 익셉션을 ARM 코어에게 유발시킴
      • Data Abort 익셉션 핸들러 루틴
        1. ESR_ELx 레지스터의 [31:26]비트를 읽어서 세부 유발 인자 확인
        2. EL0(유저 애플리케이션): 유저 프로세스 종료
        3. EL1(커널 드라이버): 디버깅 정보 출력 후 시스템 종료
    • SVC 처리 흐름

      • SVC 익셉션 핸들러 루틴
        1. 레지스터로부터 시스템 콜 번호 획득
        2. 시스템 콜 번호에 해당하는 시스템 콜 루틴 실행
    • IRQ, FIQ 처리 흐름

      • 비동기적으로 유발됨
      • 다른 익셉션과 달리 기존 프로세스로 복귀해야하므로 인터럽트 루틴이 신속하게 처리되어야한다.
      • 익셉션이 유발된 레벨별로 정의된 오프셋을 적용한 주소로 PC가 분기
        1. EL1에서 IRQ 인터럽트 익셉션 발생: VBAR_EL1 + 0x280
        2. EL0(Aarch64)에서 IRQ익셉션 발생: VBAR_EL1 + 0x480
        3. EL0(Aarch32)에서 IRQ익셉션 발생: VBAR_EL1 + 0x680 (VBAR_EL0 레지스터는 없음, 왜냐하면 익셉션 핸들러로 분기하는 시점은 최소 EL1은 되어야하기에)
      • IRQ 인터럽트의 익셉션 핸들러 동작
        1. 인터럽트 발생한 시점의 레지스터 세트를 프로세스 스택에 푸시
        2. 인터럽트 서비스 루틴 실행해 인터럽트 핸들링 코드 실행
        3. 인터럽트 핸들러 함수 호출
    • SError 익셉션
      • 프로세스 흐름중(synchronous)에 발생하지 않고 비동기적(asynchronous)으로 외부 메모리에서 어보트가 발생하면 SError 익셉션 유발
      • 가상 주소 영역: ARM 코어가 사용하는, 바라보는 주소(MMU: 가상 주소 -> 물리주소로 변환)
      • 캐시(물리주소)에 접근하는 하드웨어 필터에서 메모리 어보트 발생 가능
      • SError 발생 원인은 칩셋 업체마다 구현이 다를 수 있도록 설계됨
  7. 익셉션 전체 처리 흐름

    • 다양한 페리페럴 인터럽트를 ARM 코어가 직접 받는 것이 아닌 GIC를 통해서 건네받는다
    • 그 다음에 익셉션 벡터(주소)를 통해 ARM 코어와 커널이 인터페이스하여 커널이 구현한 IRQ subsystem에 속하는 인터럽트 핸들러를 실행시켜 익셉션을 처리한다.
    • IRQ subsystem: ARM 아키텍처와 무관하게 실행되는 소프트웨어 레이어
      • 커널을 구성하는 기능 중 하나
      • 디바이스 드라이버 및 커널 서브시스템으로 핸들러 코드가 구현됨
    • GIC 쓰는게 편함
      • 커널 드라이버에 GIC 소스 다 구현됨
      • ARM이 기본적으로 GIC 초기화 코드 구현해놓음
  8. 익셉션 벡터 테이블 분석

    • ARM은 커널, RTOS, XEN, 베어메탈 OS 등 다양한 시스템이 동작할 수 있도록 설계됨
    • 익셉션 벡터 테이블

      • CURRENT LEVEL
      • LOWER LEVEL
      • (위 두개를 잘 인지해야 익셉션 벡터 테이블을 제대로 해석할 수 있음) / (해석 당시에 CURRENT_LEVEL을 결정하고 테이블 봐야함)
    • SP_ELx: 각 익셉션 레벨별로 지정된 스택 포인터 주소
      • SP_EL0: 업계에서 사용 잘안함(리눅스, 하이퍼바이저에서 지원 안함)
      • SP_Elx: 리눅스, 하이퍼바이저에서 지원함
    • VBAR_Elx

      • 익셉션 레벨마다 익셉션 핸들러를 독립적으로 설계 및 구현
      • EL1 익셉션 벡터 엔트리 주소(EL1에 존재하는 익셉션 벡터 베이스 주소)
      • 위 그림에서 익셉션 핸들러 위치를 잘 보자
  9. 익셉션 핸들러 코드 리뷰

    • 어셈블리 명령어가 익셉션 핸들러 코드 부분, el1_irq가 분기하는 레이블이며 이 안에 인터럽트 서비스 루틴 코드가 있음
    • EL마다 각각 SP를 설정해서 사용
  10. 메모리 어보트 익셉션 발생시 프로세스 관점(커널)에서 동작 방식 설명
  11. 익셉션 핸들러 실행 메모리 공간
    • 결론적으로 익셉션 핸들러는 익셉션이 발생한 프로세스의 스택 공간에서 실행되는 것(커널 프로세스의 스택 공간)
    • 유저공간에서는 익셉션 핸들러가 실행되지 않음

 

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

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

요약 10. AAPCS ARMv7  (0) 2024.01.03
요약 9. GIC - 인터럽트 컨트롤러  (0) 2024.01.02
요약 7. ARMv7 익셉션  (0) 2023.12.31
요약 6. ARMv8 익셉션 레벨  (0) 2023.12.31
요약 5. ARMv7 동작모드  (0) 2023.12.30