Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

8179
1390
307630


[Arm프로세서] Armv8: VBAR_ELx 기준으로 익셉션 벡터 테이블 분석 정리 Armv8: 익셉션(Exception)

이전 포스트까지 EL1에 존재하는 VBAR_EL1와 EL1에 있는 VBAR_EL2 기준으로 익셉션 벡터 테이블에 대해 알아봤습니다. 이제 원점으로 돌아가서 이번 절의 앞 부분에 소개한, Armv8 스팩 문서에 있는 익셉션 벡터 테이블을 보면서 배운 내용을 정리해봅시다.

VBAR_EL1 기준으로 바라본 익셉션 벡터 테이블

먼저 VBAR_EL1 기준으로 익셉션 벡터 테이블을 분석해봅시다.
 

표 9.18 Armv8 아키텍처의 익셉센 벡터 테이블(출처: DDI0487Fc_armv8_arm.pdf)

표의 왼쪽 행의 2번째 열에 보이는 'Current Exception level'은 운영체제의 커널이 구동하는 EL1을 의미하며, EL1에서 익셉션이 유발되면 익셉션 벡터 베이스 주소에 아래와 같은 오프셋을 더한 익셉션 벡터로 프로그램 카운터를 브랜치합니다.

   ❑ Synchronous 익셉션: 0x200
   ❑ IRQ 인터럽트 익셉션: 0x280
   ❑ FIQ 인터럽트 익셉션: 0x300
   ❑ SError 익셉션: 0x380

이어서 왼쪽 행의 3번째 열에 있는 'Lower Exception level ... using Aarch64'은 유저 애플리케이션(64비트로 빌드돼 동작)이 실행되는 EL0을 뜻합니다. EL0에서 익셉션이 유발되면 EL1으로 진입하며, 익셉션 벡터 베이스 주소에 다음과 같은 오프셋을 더한 익셉션 벡터를 프로그램 카운터에 넣어줍니다. 

   ❑ Synchronous 익셉션: 0x400
   ❑ IRQ 인터럽트 익셉션: 0x480
   ❑ FIQ 인터럽트 익셉션: 0x500
   ❑ SError 익셉션: 0x580

이번에는 왼쪽 행의 4번째 열에 있는 'Lower Exception level ... using Aarch32'은 유저 애플리케이션(32비트로 빌드돼 동작)이 실행되는 EL0을 뜻합니다. EL0에서 익셉션이 유발되면 익셉션 벡터 베이스 주소에 아래와 같은 같은 오프셋을 더한 익셉션 벡터로 프로그램 카운터를 브랜치합니다. 

   ❑ Synchronous 익셉션: 0x600
   ❑ IRQ 인터럽트 익셉션: 0x680
   ❑ FIQ 인터럽트 익셉션: 0x700
   ❑ SError 익셉션: 0x780
 
VBAR_EL2 기준으로 바라본 익셉션 벡터 테이블

이번에는 하이버파이저가 구동되는 VBAR_EL2 기준으로 익셉션 벡터 테이블을 분석해봅시다.

표의 왼쪽 행의 2번째 열에 보이는 'Current Exception level'은 하이퍼바이저가 구동하는 EL2을 의미하며, EL2에서 익셉션이 유발되면 익셉션 벡터 베이스 주소에 아래와 같은 오프셋을 더한 익셉션 벡터로 프로그램 카운터를 브랜치합니다.

   ❑ Synchronous 익셉션: 0x200
   ❑ IRQ 인터럽트 익셉션: 0x280
   ❑ FIQ 인터럽트 익셉션: 0x300
   ❑ SError 익셉션: 0x380

이어서 왼쪽 행의 3번째 열에 있는 'Lower Exception level ... using Aarch64'은 운영체제의 커널(64비트로 빌드돼 동작)이 실행되는 EL1을 뜻합니다. 일반적인 상황에서 EL1에서 'hvc' 명령어를 실행하면 EL2로 진입하며 익셉션 벡터 베이스 주소에 다음과 같은 같은 오프셋을 더해 익셉션 벡터를 계산합니다.

   ❑ Synchronous 익셉션: 0x400
   ❑ IRQ 인터럽트 익셉션: 0x480
   ❑ FIQ 인터럽트 익셉션: 0x500
   ❑ SError 익셉션: 0x580

[정보]
Armv8 아키텍처에서 제공하는 HCR(하이퍼바이저 컨트롤 레지스터)를 설정하면, 운영체제 커널이 구동되는 EL1에서 wfi, wfe와 같은 명령어를 실행해도 EL2로 진입할 수 있습니다. 가상화 시스템에서는 이를 Guest Exit이라고 합니다. 자세한 내용은 15장 하이퍼바이저에서 다룹니다.

왼쪽 행의 4번째 열에 있는 'Lower Exception level ... using Aarch32'은 운영체제의 커널(64비트로 빌드돼 동작)이 실행되는 EL1을 뜻합니다. EL0에서 익셉션이 유발되면 익셉션 벡터 베이스 주소에 다음과 같은 오프셋을 더한 익셉션 벡터를 프로그램 카운터에 넣어 줍니다. 

   ❑ Synchronous 익셉션: 0x600
   ❑ IRQ 인터럽트 익셉션: 0x680
   ❑ FIQ 인터럽트 익셉션: 0x700
   ❑ SError 익셉션: 0x780

여기까지 익셉션 레벨 별로 정의된 익셉션 벡터 테이블을 분석해 봤습니다.

정리

여기까지 Armv8 아키텍처의 익셉션 벡터 테이블을 살펴봤습니다. Armv8의 익셉션 벡터 테이블을 이루는 주요 개념을 제대로 이해한 다음에, 'Armv8 익셉션 벡터 테이블을 보면 마치 매직 아이와 같다'라는 느낌을 받을 수 있습니다. Armv8의 익셉션 벡터 테이블은 VBAR_EL1와 VBAR_EL2 처리되는 익셉션을 하나의 테이블로 설명하다보니 이런 생각이 드는 것 같습니다.

Armv8 아키텍처가 소개되기 전까지, Armv7 아키텍처는 저전력 위주의 소형 임베디드 제품에 주로 탑재됐습니다. 그런데 Armv8 아키텍처는 기존의 임베디드 제품을 지원하는 심플한 구조에서, 클라우드나 가상화 시스템과 같은 고성능 컴퓨터에 적용될 수 있는 아키텍처로 발전했습니다. 이 과정에서 가장 많이 바뀐 부분이 익셉션입니다. 

Reference: ARMv8 아키텍처 - 익셉션(Exception)

Armv8 익셉션의 종류와 분류 체계 
익셉션의 전체 실행 흐름  

Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자
* 2021년 대한민국 학술원 선정 우수도서



---
.

핑백

덧글

댓글 입력 영역