리버싱/ARM

aarch64 익셉션 핸들링

cyanhe_wh 2021. 2. 15. 19:37
반응형

aarch64의 가장 큰 구조적 특징은 새로운 익셉션 모델을 제공하는 것이다.

익셉션 레벨이 도입되었고, 익셉션 발생과 핸들링, 익셉션 복귀에 대한 규칙이 바뀌었다.

 

일반적으로 소프트웨어의 실행 흐름을 가로채는 동작을 인터럽트(interrupt)라고 하지만,

ARM은 익셉션이라는 용어를 사용한다.

익셉션이 발생하면 이전 실행 흐름에서 벗어나 익셉션 타입에 따른 익셉션 핸들러를 호출한다.

익셉션 핸들러익셉션을 처리하고 익셉션 발생 전의 상태에서 실행을 재개한다.

 

익셉션 타입

익셉션을 발생시키는 상태 및 시스템 이벤트

  • 서비스 호출 인스트럭션 익셉션
  • abort 익셉션
  • 리셋 익셉션
  • 인터럽트 익셉션

서비스 호출 인스트럭션 익셉션

익셉션을 발생시키는 인스트럭션들이 있다.

소프트웨어에서 좀 더 높은 특권 레벨(privileged level)에서 동작하는 서비스를 요청하기 위해 호출된다.

  • SVC (Supervisor Call) : 유저 모드 프로그램에서 OS 서비스를 요청할 때 쓰인다.
  • HVC (Hypervisor Call) : 게스트 OS에서 하이퍼바이저 서비스를 요청할 때 쓰인다.
  • SMC (Secure Monitor Call) : 일반 구역(normal world)에서 보안 구역(secure world) 서비스를 요청할 때 쓰인다.

abort 익셉션

인스트럭션 fetch가 실패할 경우 발생하는 인스트럭션 abort데이터 접근이 실패할 경우 발생하는 데이터 abort, 두가지 종류가 있다.

 

인스트럭션이 fetch될 때 문제가 발생하면 파이프라인 안에 abort 상태로 기록되어 있다가 코어가 해당 인스트럭션을 실행할 때 인스트럭션 abort 익셉션이 발생한다.

만약 파이프라인이 플러시되어 해당 인스트럭션이 실행되지 않는다면 abort 익셉션은 발생하지 않는다.

 

데이터 abort 익셉션은 데이터 로드 또는 스토어 인스트럭션 실행 결과 발생하며, 데이터의 읽기 또는 쓰기가 시도된 후에 발생하는 것으로 간주된다. MMU의 메모리 접근이 실패했을 경우에도 abort가 발생한다.

리눅스는 MMU abort를 이용해 디맨드 페이징(demand paging)을 구현한다.

 

동기식 abort는 인스트럭션 스트림의 실행 또는 시도에 의해 생성되고 리턴 주소가 abort를 초래한 인스트럭션의 세부 사항을 제공한다.

비동기 abort는 인스트럭션 실행으로 생성되지 않고 리턴 주소는 중단의 원인에 대한 세부 정보를 제공하지 않을 수 있다.

 

리셋 익셉션

코어에 리셋이 입력되면 리셋 익셉션이 발생한다.

리셋 익셉션이 발생하면 코어는 리셋 벡터로 점프하게 된다. 리셋 벡터에는 실행할 인스트럭션의 주소를 저장한다.

RVBAR_ELn 레지스터가 리셋 벡터를 기록하기 위해 사용된다.

여기서 n은 프로세서에 구현된 가장 높은 익셉션 레벨의 번호다.

 

EL2와 EL3는 옵션이기 때문에 n은 3이 아닐 수 있다. 리셋 익셉션은 가장 높은 우선순위이며 마스크될 수 없다.

리셋 익셉션은 전원을 켠 후 코어를 초기화하는 코드를 실행하는 데 사용한다.

 

인터럽트 익셉션

ARM 아키텍처의 인터럽트는 IRQ와 FIQ로 나뉘며, FIQ는 IRQ보다 우선순위가 높다.

인터럽트는 인터럽트 컨트롤러와 코어를 연결한 IRQ, FIQ 라인을 통해 물리적 신호로 전달된다.

인터럽트 컨트롤러는 연결된 각 디바이스의 인터럽트 신호를 중재하고 우선순위를 지정하며 최종적으로 직렬화된 단일 신호로 각 코어의 IRQ 또는 FIQ로 전달한다.

 

외부 하드웨어가 인터럽트 요청을 보냈을 때, 코어에서 인터럽트를 비활성화하지 않았다면 실행 중인 인스트럭션이 완료된 후 익셉션이 발생한다. 여러 데이터를 로드하는 인스트럭션을 실행하는 경우에는 실행 중간에 익셉션이 발생할 수 있다.

 

 

동기 및 비동기 익셉션

익셉션은 동기와 비동기 두 가지로 나뉜다.

반응형

'리버싱 > ARM' 카테고리의 다른 글

ABI의 레지스터 사용 규칙  (0) 2021.02.15
시스템 레지스터  (0) 2021.02.09
aarch64 특수 목적 레지스터  (0) 2021.02.09
프로세서 상태 레지스터(PSTATE)  (0) 2021.02.09
ARMv8 레지스터  (0) 2021.02.09