Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

1148
469
422441


[Arm프로세서] Armv7: 익셉션 벡터 테이블이란 Armv7: 익셉션(Exception)

익셉션이 발생하면 ARM 프로세서는 익셉션 별로 지정된 주소로 프로그램 카운터를 브랜치합니다. 익셉션 별로 지정된 주소를 익셉션 벡터라고 하는데, 익셉션 벡터는 8개의 연속된 4바이트 단위의 주소로 구성돼 있습니다. 이 8개의 익셉션 벡터를 익셉션 벡터 테이블이라고 합니다. 

먼저 다음 표를 보면서 익셉션 벡터 테이블을 배워 봅시다.
 
표 8.4 익셉션 벡터 테이블

표의 왼쪽 행은 익셉션 벡터 베이스 주소 기준의 오프셋인데, 오른쪽 행을 보면 오프셋 별에 대응되는 익셉션의 종류가 보입니다. 이로써, 익셉션 벡터의 주소는 익셉션의 종류에 따라 다르다는 점을 확인할 수 있습니다. 

가장 왼쪽 행의 윗 부분은 '익셉션 벡터 테이블의 베이스' 주소인데, 먼저 이 내용부터 알아봅시다. ARM 프로세서는 익셉션의 종류 별로 지정된 주소로 프로그램 카운터를 브랜치하기 위해 먼저 익셉션 벡터 테이블의 베이스 주소를 찾습니다.

익셉션 벡터의 베이스 주소는 VBAR(Vector Base Address Register) 레지스터를 통해 설정하며, 0x0과 0xffff_0000로 지정할 수 있습니다. 익셉션 벡터의 베이스 주소는 다음과 같이 분류될 수 있습니다.

   * 노멀 벡터: 0x0
   * 하이 벡터: 0xffff_0000

이어서 왼쪽 열은 0x0~0x1C의 주소가 보이는데, 이는 익셉션 벡터 테이블의 베이스 주소 기준의 오프셋을 나타냅니다.

익셉션 벡터의 주소는 "익셉션 벡터 베이스 주소"에서 익셉션 종류 별로 명시된 오프셋 주소를 더해 계산합니다. 만약 "익셉션 벡터 베이스 주소"가 0xffff0000인데, '데이터 어보트'란 익셉션이 발생하면 ARM 프로세서는 프로그램 카운터를 다음 공식에 따라 0xffff0010 주소로 브랜치합니다.

   * “0xffff0000 + 0x10 = 익셉션 벡터 베이스 주소 + 데이터 어보트의 오프셋 주소” 

만약 "IRQ" 익셉션이 발생하면 ARM 프로세서는 어떤 주소로 프로그램 카운터를 브랜치할까요? 다음 공식에 따라 0xffff_0018 주소로 브랜치됩니다.

    “0xffff0000 + 0x18 = 익셉션 벡터 베이스 주소 + IRQ 익셉션의 오프셋 주소” 

이 방식으로 ARM 프로세서는 익셉션이 발생하면 익셉션 종류 별로 지정된 주소로 프로그램 카운터를 브랜치합니다.

이번에는 다음 그림을 보면서 익셉션의 타입별로 브랜치되는 익셉션 벡터 주소를 알아봅시다.

 

그림 8.13 익셉션의 타입 별로 브랜치되는 익셉션 벡터 주소

그림의 가장 윗 부분은 Undefined Instruction, 프리페치 어보트, 데이터 어보트와 같은 메모리 어보트 타입 익셉션을 나타냅니다. 익셉션의 종류에 따라 익셉션 벡터 베이스 주소에 다음과 같은 오프셋을 더해 프로그램 카운터를 브랜치합니다.

   * Undefined Instruction: +0x04(0xffff_0004)
   * 프리페치 어보트: +0x0C(0xffff_000C)
   * 데이터 어보트:  +0x10(0xffff_0010)

괄호에 표기된 주소는 익셉션 벡터 베이스 주소가 0xffff_0000일 때 브랜치되는 주소입니다.

그림의 가운데 부분은 인터럽트 타입 익셉션을 나타냅니다. 익셉션의 종류에 따라 익셉션 벡터 베이스 주소에 다음과 같은 오프셋을 더해 프로그램 카운터를 브랜치합니다.

   * IRQ 인터럽트: +0x18(0xffff_0018)
   * FIQ 인터럽트: +0x1C(0xffff_001C)

마지막으로, 가장 아랫부분을 보겠습니다. 소프트웨어 인터럽트를 유발할 때 브랜치되는 주소를 나타내는데, 아래와 같이 프로그램 카운터가 브랜치됩니다.

  * 소프트웨어 인터럽트: +0x08(0xffff_0008)

여기까지 ARM 코어가 익셉션을 유발할 때의 동작 원리를 알 수 있는 익셉션 벡터 테이블에 대해 알아봤습니다.

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









덧글

댓글 입력 영역