Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

뚝딱뚝딱 블로그

Linux - ARM AArch64 Exception Handling 본문

Linux

Linux - ARM AArch64 Exception Handling

germonado 2022. 7. 3. 17:39

Exception 발생 이벤트

  • Service 호출 instruction exception
    • SVC - USER -> OS 서비스 요청, Guest OS -> Hypervisor, Non-secure -> Secure 구역요청
    • Non-secure -> Secure 구역 서비스 요청?
      • ex) 지문인식 상황, normal 영역에서 확인할 수 없는 data 대조의 경우 secure zone으로 요청
  • Abort exception
    • Instruction fetch 실패 or Data 접근 실패시
  • Reset exception
    • 전원 켠후 core 초기화 코드 실행시 사용.
  • Interrupt exception
    • ARM 아키텍처의 interrupt는 IRQ(Interrupt Request)와 FIQ(Fast Interrupt request)로 나뉨. FIQ의 IRQ보다 우선순위가 높다. 인터럽트는 interrupt controller <-> core를 연결한 실제(physical) 인터럽트 라인 신호로 전달됨. Interrupt Controller를 통해 코어의 IRQ, FIQ로 전달되고 interrupt exception 발생.

동기 vs 비동기 Exception

동기 Exception

  • Instruction 실행, 시도 결과로 발생.
  • ESR_ELn(Exception Syndrome Register)에 Exception 발생한 instruction return 주소 기록.(ESR_ELn -> exception level에 따라서 변경됨)
  • MMU instruction, data abort, PC, SP의 정렬 위반, 동기 외부 abort, 할당/허용되지 않은 instruction 등에 의해 발생.
  • 즉 code, program 수행 중 일어나게 됨.

비동기 Exception

  • Instruction 실행과 무관하게 일어나고, return 주소가 exception 원인에 대한 정보가 아닐 수도 있다.
  • IRQ, FIQ, SError에 의해 발생.(program 실행과 무관하게 밖에서 들어온 interrupt 같은)

Exception Handling

익셉션이 발생하면, Processor는 Exception에 대응하는 약속된 위치의 handler 코드를 수행한다.

handler가 저장된 메모리 영역을 exception vector라고 함.

ARM 아키텍처에서 exception vector는 table 형태로 존재하여 exception vector table이라 부름.(역시 exception level 별로 존재)

어느 Exception vector table 엔트리로 분기하는가?

  • 같은 Exception level이라면 사용중인 stack pointer(SP0 or SPx)에 따라 달라지고
  • 낮은 Exception level이라면 발생 시 실행 state에 따라 다름(AArch64 or AArch32)
  • Exception Type에 따라(SError, FIQ, IRQ, Synchronous)별로 구분
  1. Exception이 발생하면 -> 돌아갈 복귀주소(기존 실행 Flow)를 ELR(Exception Link Register)에 저장하고, 프로세서 state를 바꾼다.
  2. PC(instruction 실행 주소)값이 해당 Exception handler vector table entry로 설정되어 jump.
  3. 해당 벡터 테이블 엔트리에서 핸들러 code 수행후, 저장해둔 복귀주소로 돌아옴

Interrupt는 어떻게 handling?

  1. Interrupt 발생 -> Interrupt exception 발생
  2. core가 AArch64 실행 상태로 진입
  3. PSTATE의 모든 exception mask가 자동으로 설정되어, interrupt가 중첩되지 않고, pending 상태로 된다.
  4. processor에 의해 register가 백업되고, interrupt handler 벡터 테이블 엔트리로 이동.
  5. 어셈블리 IRQ handler 호출됨. -> C로 구현된 handler 함수 호출!
  6. C로 구현된 handler는 interrupt 소스 확인, pending clear, 등록된 handler 호출.
  7. 이후 어셈블리 handler로 복귀, 백업해뒀던 register들 복원
  8. ERET로 익셉션 이전 상태로 돌아감.

'Linux' 카테고리의 다른 글

리눅스 스터디 #2 프로세스 관리  (1) 2024.12.01
리눅스 스터디 #1 개요  (1) 2024.12.01
Linux - Cache(ARM based)  (0) 2022.07.03
Linux - ARMv8 레지스터  (0) 2022.07.03
Linux - ARMv8 아키텍처  (0) 2022.07.03