Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

11105
637
415734


[ARM프로세서] 익셉션 벡터 테이블 소개 Arm: Exception Overview

이번 포스팅에서는 ARMv7과 ARMv8 아키텍처의 익셉션 벡터 테이블을 차례로 소개합니다.

ARMv7 익셉션 벡터 테이블

"표 7.2"는 ARMv7 익셉션 벡터 테이블입니다. 우선 표를 읽고 해석해 봅시다.


표 7.2 ARMv7 익셉션 벡터 테이블

표의 가장 왼쪽 윗 부분에 "익셉션 벡터 베이스 주소"가 보이는데, 이는 익셉션 벡터의 기준이 되는 주소를 뜻합니다.

익셉션 벡터 베이스 주소는 0x0이나 0xffff_0000으로 지정할 수 있는데, 리눅스와 같은 범용 운영체제에서는 0xffff_0000에 익셉션 벡터 베이스 주소를 지정합니다.

이어서 "+0x04"~"+0x1C"로 표기된 부분은 익셉션 벡터 베이스 주소 기준의 오프셋 주소를 나타냅니다.

이해를 돕기 위해 한 가지 예를 들겠습니다. 익셉션 벡터 베이스 주소가 0xffff_0000이면, "+0x04"는 0xffff_0004, "+0x1C"는 0xffff_000C가 되는 것입니다.

가장 오른쪽에 보이는 "익셉션의 종류"라는 열을 보겠습니다. 이는 익셉션의 종류를 뜻합니다.
만약 익셉션 벡터 베이스 주소가 0xffff_0000이라면, 익셉션의 종류별로 다음과 같이 처리됩니다.

   ❑ ARM 프로세서가 "Undefined Instruction" 익셉션을 감지하면, 
     0xffff_0004 주소로 프로그램 카운터를 브랜치한다.

만약 "IRQ interrupt" 익셉션이 발생하면 어떻게 처리될까요? 다음과 같이 설명할 수 있습니다.

   ❑ ARM 프로세서가 "IRQ interrupt" 익셉션을 감지하면, 0xffff_0008 주소로 프로그램 카운터를 브랜치한다.

익셉션 벡터 테이블을 보면 이와 같이 해석하면 됩니다.

그런데 익셉션 벡터 테이블을 보면 "익셉션 벡터 테이블은 ARM 프로세서에서 명시된 스팩인데, 이와 관련된 코드는 어디에 구현돼 있을까"란 의문이 생깁니다. 이 질문에 답을 하려면 익셉션 벡터와 관련된 코드가 무엇인지 알아야 하는데, 이를 익셉션 벡터 핸들러라고 합니다. 익셉션 벡터 핸들러는 어셈블리 명령어로 구성돼 있는데 익셉션 벡터 주소에서 호출됩니다. 

ARMv8 익셉션 벡터 테이블

이어서 ARMv8 아키텍처의 익셉션 벡터 테이블을 분석하겠습니다. 다음은 ARMv8 아키텍처의 익셉션 벡터 테이블입니다.


표 7.3 ARMv8 익셉션 벡터 테이블

익셉션 테이블을 보니 ARMv7 아키텍처와는 달라 보입니다. 그럼 ARMv7의 익셉션 벡터 테이블과 차이점은 무엇일까요? 

첫 번째, ARMv8의 익셉션 벡터 테이블은 익셉션이 발생한 익셉션 레벨 기준으로 주소가 정의돼 있습니다. 이 내용은 테이블의 가장 왼쪽 행에서 확인할 수 있습니다. 

두 번째, ARMv8의 익셉션 벡터 테이블을 구성하는 익셉션 벡터들은 +0x080 주소 기준으로 위치해 있다는 점입니다. 세 번째로 익셉션의 타입과 종류가 ARMv7의 아키텍처와는 다릅니다.

이처럼 ARMv8의 익셉션 벡터 테이블은 조금 복잡해 보이는데, 그 이유는 하위 호환성을 지원하고 하이퍼바이저와 같은 가상 환경을 지원해야 하기 때문입니다.

ARMv8 아키텍처의 익셉션 벡터 테이블의 구성 방식과 세세한 동작 원리는 나중에 다룰 예정입니다.



Reference: ARM 프로세서 익셉션 소개

익셉션이란? 
익셉션의 주요 개념  
    ❑ 익셉션의 타입 소개
익셉션과 같이 배워야 하는 운영체제 지식


Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자



핑백

덧글

댓글 입력 영역