반도체 소프트웨어

요약 7. ARMv7 익셉션 본문

CPU Architecture/ARM Architecture

요약 7. ARMv7 익셉션

반도체 소프트웨어 엔지니어 2023. 12. 31. 14:41
  1. 익셉션이란
    • 익셉션은 프로세서가 외부에서 발생한 인터럽트나 정의되어있지 않은 명령어를 실행하려는 시도와 같은 이벤트를 처리하기 위해 프로세스의 실행을 멈추는 것
    • cpu코어에서 기계어를 정상적으로 실행하지 못하는 상황에서 이를 처리하기 위한 방식
    • 익셉션이 발생하면 익셉션의 종류별로 지정된 주소로 pc 바뀜
    • cpu 아키텍처마다 익셉션 처리 세부 동작 방식이 다름
    • ARM프로세서는 익셉션이 발생하면 익셉션을 처리하는 특정 모드로 진입
      • 익셉션을 유발한 다양한 정보를 레지스터에 업데이트
      • 익셉션 종류별로 이미 정해 놓은 주소로 분기
  2. 익셉션 벡터: 각 익셉션의 내용을 담은 주소
  3. ARM 아키텍처 관점에서 익셉션 종류
    • 메모리 어보트 타입 익셉션: 소프트웨어 입장에서 치명적인 오류가 있는 상태 ex) 널포인터 엑세스
    • IRQ 인터럽트 익셉션: 외부 I/O 디바이스(페리퍼럴)에서 인터럽트가 발생하면 유발되며 인터럽트 서비스 루틴이 실행
    • 소프트웨어 인터럽트 타입 익셉션(트랩): SVC 같은 명령어를 실행하면 유발, 이 기능을 활용해 시스템 콜을 구현
  4. 상황별 익셉션
    • 실무에서
      • 소프트웨어 에러 발생(메모리 어보트, 크래시)
      • 충분히 디버깅할 시간이 할당되지 않은 상황에서 압박을 받으면서 디버깅
    • 소프트웨어 관점에서
      • 치명적인 오류: 메모리 어보트 타입 익셉션
      • 운영체제 커널에서 지원하는 기능: IRQ(인터럽트 서비스 루틴), 소프트웨어 인터럽트(시스템 콜)
        1. irq인터럽트도 익셉션으로 분류
          • 외부 I/O 디바이스에서 인터럽트 신호 발생하면 ARM코어에서 이를 익셉션의 한 종류로 처리
          • 센서, 키보드 같은 외부 I/O디바이스 인터럽트를 통해 하드웨어 변화를 ARM 코어에 알림
        2. 소프트웨어 인터럽트와 트랩: 특정 명령어를 실행하면 익셉션이 유발되며 이를 트랩으로 명시
  5. 익셉션 동작 원리 잘 알아야하는 이유
    • 실전 프로젝트에서 문제해결능력 키우기 위해 ex) null포인터접근, 프로세스 스택 오염 등
    • 운영체제 깊게 이해하기 위해
      • rtos, 리눅스 커널은 ARM 아키텍처 기능을 활용해 동작하며 핵심 루틴은 어셈블리 코드로 구현
      • 핵심 기능이 ARM 익셉션 활용해 구현 ex) 시스템콜, IRQ(인터럽트 서브시스템), 메모리 관리, 시그널, 선점 스케줄링 등
    • 트러스트존과 하이퍼바이저 동작원리 이해하기 위해
      • 트러스트존이나 하이퍼바이저를 구성하는 소프트웨어 스택은 익셉션을 유발하는 트랩을 기반으로 구현
      • 게스트 os에서 하이퍼바이저에게 서비스를 요청할 때는 익셉션을 통해 하이퍼바이저 모드로 진입
  6. 익셉션과 관련된 주요 개념
    • 모드와 익셉션 레벨 변경
      • 익셉션 종류별로 지정된 주소(익셉션 벡터 엔트리 주소 + 오프셋)로 pc 브랜치
      • 익셉션은 동작 모드가 변경되는 유발 인자(v7) / 익셉션 레벨이 변경되는 요인(v8)
      • 프로세스 입장에서 익셉션이 발생하면 프로시저 루틴에서 벗어나기에 실행이 잠시 멈췄다고 느낌
    • 익셉션 벡터 테이블: 익셉션 벡터 정보를 모아놓은 테이블(오프셋, 종류 등)
    • 익셉션 핸들러

      • 익셉션을 핸들링(처리)하는 레이블이나 함수(어셈블리 명령어)
      • ARM 프로세서가 익셉션을 감지하면 실행되는 코드로, 이를 익셉션 핸들러라고 명시
      • 익셉션 벡터 테이블이 소프트웨어적으로 구현된 실체
      • ARM아키텍처와 커널 간 인터페이스
    • 익셉션 유발된 주소를 알려주는 레지스터 종류(익셉션 후 복귀할 주소)
      • ARMv7: R14_<mode> 레지스터
      • ARMv8: ELR_E1, ESR_EL1 레지스터
  7. 익셉션 종류(ARMv7)
    • undefined instruction 익셉션: 어셈블리어를 디코딩못할때 주로 발생, 브링업 과정에서 보통 발생, 특정 시스템 레지스터가 활성화되지 않았을 때도 발생, 비트 플립 메모리 오염 등
    • abort 익셉션
      • data abort 익셉션
      • prefetch abort 익셉션: 스택 메모리 깨져서 함수 호출 복귀못할때
    • 외부 인터럽트(IRQ/FIQ)
    • 소프트웨어 인터럽트: 소프트웨어적으로 익셉션을 발생시켜 유발된 인터럽트(SUPERVISOR CALL, 트랩)
      • 유저모드 -> 커널 모드로 스위칭
  8. 익셉션 실행 사이클

    • 유발요인
      • 메모리 어보트: mmu가 처리하지 못하는 가상 주소 등 으로 발생
      • 외부 디바이스 인터럽트
      • 소프트웨어 인터럽트
    • 익셉션 발생 후 레지스터 업데이트
      • 익셉션이 발생한 시점의 cpsr 레지스터를 변경되는 모드의 SPSR_<mode> 레지스터에 백업
      • 익셉션 마무리 후 복귀할 주소를 R14_<mode> 레지스터에 백업 -> 즉 변경될 익셉션 모드의 뱅크드 레지스터를 사용해서 익셉션 종료 후 복귀하는 것
    • 동작 모드 변경
      • ARM 코어는 CPSR레지스터 M비트를 업데이트해서 동작 모드를 변경
      • OS는 익셉션 종류별로 실행 흐름 구분해서 처리
    • 익셉션 벡터 엔트리 주소로 점프: 해당하는 익셉션 벡터 엔트리 주소로 pc 분기(벡터 베이스 주소 + 오프셋)
      • 익셉션 벡터: 개념적인 용어
      • 익셉션 벡터 엔트리: 해당 익셉션의 시작 주소
    • 익셉션 핸들러 실행: 각 익셉션마다 처리하는 핸들러(어셈블리어 모음) 실행 (각 익셉션 벡터 주소로 가면 있는 레이블, 함수를 의미함)
      • 메모리 어보트 익셉션 핸들러
        1. 유저 애플리케이션: 프로세스 종료
        2. 커널, 드라이버: 시스템 리셋
      • IRQ 익셉션 핸들러
        1. 인터럽스 서비스 루틴 실행(디바이스 드라이버 등)
        2. 외부 하드웨어 변화를 알리기 위한 인터페이스로 동작
      • 소프트웨어 인터럽트: 시스템 콜 핸들러로 분기 수행
  9. 메모리 어보트 익셉션 처리 방식

    • 익셉션 핸들러 실행시에 SPSR_abt를 통해 익셉션 유발전 상태를 읽어서, 유저프로세스를 실행시킬지 시스템 리셋을 할지를 정한다
  10. IRQ 인터럽트 익셉션 처리 흐름(관점별 인터럽트가 처리되는 실행 흐름)
    • ARM 관점에서

      • 인터럽트 타입 익셉션은 외부 I/O 디바이스에서 인터럽트가 발생하면 이를 소프트웨어적으로 처리하기 위한 인터페이스이자 운영체제 커널의 기능으로 동작
      • 익셉션 핸들러: 벡터 테이블이 소프트웨어적으로 구현된 실체
    • 인터럽트 전체 처리 관점에서

      • 외부 디바이스에서 인터럽트 발생하면 GIC가 받아서 ARM 아키텍처에 보내준다.
      • GIC: ARM사가 개발한 인터럽트 컨트롤러
    • 프로세스 관점에서: 프로세스 실행이 중단되기에 인터럽트 서비스 루틴은 빠르게 처리되도록 설계되어야함
    • 운영체제 커널이 인터럽트 처리하는 과정
      • 프로세스 실행 도중 인터럽트 발생
      • 익셉션 핸들러호출
      • 인터럽트 처리하는 서비스 루틴 실행(익셉션의 서브루틴)
      • 인터럽트가 발생한 시점으로 복귀
  11. 소프트웨어 인터럽트(supervisor call) / 소프트웨어 익셉션

    • 특정 명령어를 실행해서 익셉션을 유발(IRQ, FIQ)
    • 명령어 종류: svc, hvc, smc
    • 시스템 콜 실행 흐름(시스템콜: os 에서 사용하는 용어, 유저 공간 -> 커널공간 전환하는 작업)
    • svc명령어 실행하면 슈퍼바이저 콜(익셉션) 익셉션을 유발함
    • svc명령 실행 = 유저 모드에서 슈퍼바이저 모드로 트랩되었다
  12. 익셉션 전체 흐름 정리: 익셉션은 ARM아키텍처 범주이고 다른 모든 용어에 대해서 추상적이라고 보면 이해가 편함. 즉 인터럽트 용어는 OS에서 쓰는거고 이는 익셉션과 비슷하지만 더 상위 개념이 익셉션이면서 교집합을 가지는 개념
  13. VBAR 레지스터는 ARM 코어에서 실행되는 커널 혹은 RTOS가 부팅되는 과정에서 설정되며 이를 통해 익셉션 핸들러 시작 주소를 알 수 있음(익셉션 벡터 엔트리 주소)
  14. 오류가 발생하면, data abort 익셉션을 유발하면서 익셉션 벡터로 분기
  15. 익셉션 핸들러는 프로세스 스택 공간에서 실행된다 ex) 널포인터엑세스로 인해 data abort가 발생하면 그 프로세스의 스택에 익셉션 핸들러가 push되면서 실행되는 것
  16. undefined instruction 익셉션: ARM코어가 어셈블리어를 해석하지 못해서 발생하는 오류

    • 아래 그림에서 87dcb159 가 잘못되어진 것을 볼 수 있음
    • 트러블슈팅
      • 시스템 레지스터 등 정상적으로 시스템 설정이 되었는지
      • undefined instruction이 발생하는 패턴이 일정한지
      • 현재 실행되는 이미지가 제대로 빌드되었는지
      • 메모리(DRAM)이나 저장 장치와 같은 부품에 문제가 없는지
      • 메모리(DRAM)에 전달되는 전원에 이상이 없는지
  17. prefetch abort instruction 발생 사례(소스 코드가 없는, 명령어가 아닌 이상한 주소를 pc가 가리키고 있는 것이 문제)
     
    • 명령어를 메모리에서 읽어들이다가 실패한 경우(스택 corruption 등)
    • 스택이 깨진 상태에서는 디버깅프로그램이 스택콜 출력을 제대로 못함
  18. data abort instruction 발생 사례: mmu가 발생시킴

 

 

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