본문 바로가기

시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리/1장: Arm 프로세서 소개

[ARM프로세서] 익셉션(Exception) 소개

ARM 프로세서는 익셉션을 지원하며 운영체제의 ARM 프로세서가 지원하는 익셉션을 활용해 세부 기능을 구현합니다. 익셉션의 타입에 대해 알아보고 익셉션의 세부 동작에 대해 살펴보겠습니다.
 
ARMv7과 ARMv8 아키텍처 별로 익셉션 벡터 테이블의 종류가 상이하지만, 익셉션이 동작하는 방식은 유사하므로 ARMv7 아키텍처 기준으로 익셉션에 대해 소개합니다. 
 
익셉션의 종류
 
익셉션의 세부 동작에 대해 설명드리기 전에 먼저 익셉션의 타입에 대해 알아봅시다. 다음은 ARM의 익셉션의 종류입니다.
 
표 1.3 익셉션의 타입과 종류
 
먼저 메모리 어보트 타입으로 분류되는 익셉션에 대해 살펴봅시다. 다음은 메모리 어보트 타입으로 분류되는 익셉션입니다.
 
   ❑ Undefined Instruction: ARM 코어가 어셈블리 명령어를 디코딩을 할 때 해석할 수 없는 경우 발생하는 익셉션으로 대부분 메모리가 오염(Memory Corruption)됐을 때 발생
   ❑ Prefetch Abort: ARM 코어가 제대로 명령어를 패치하지 못할 경우 발생하는 익셉션
   ❑ Data Abort: 접근하는 메모리 주소가 유효하지 않아 엑세스할 수 없어 발생하는 익셉션
 
메모리 어보트 타입으로 분류되는 익셉션은 대부분 널 포인터에 엑세스하거나 유효하지 않은 함수에 접근하다가 발생합니다.
 
두 번째 타입의 익셉션은 IRQ/FIQ 익셉션입니다. 각각 익셉션의 특징은 다음과 같습니다.
 
   ❑ IRQ: 하드웨어적인 인터럽트가 발생하면 ARM 코어는 IRQ 익셉션 발생
   ❑ FIQ: 하드웨어적으로 FIQ(Fast Interrupt Request)인터럽트가 발생하면 FIQ 익셉션 발생
 
외부 장치에서 인터럽트라는 전기 신호를 보낼 때 인터럽트 익셉션이 발생합니다. 메모리 어보트나 IRQ/FIQ 타입 익센션은 하드웨어적으로 ARM 프로세서가 유발합니다. 즉, 일부러 ARM 어셈블리 명령어를 실행해 메모리 어보트나 IRQ/FIQ 타입 익셉션을 유발할 수 없습니다.
 
마지막 타입으로는 소프트웨어 타입 익셉션입니다. 
 
   ❑ SVC: User 공간에서 "svc"라는 명령어를 실행할 때 익셉션을 유발
   ❑ HVC: "hvc" 명령어를 실행하면 하이퍼바이저 모드로 진입
 
ARM 어셈블리 명령어를 실행하면 인터럽트가 발생하는 것입니다. 리눅스에서 유저 공간에서 svc 명령어를 실행하면 소프트웨어 인터럽트가 발생하며 이를 활용해 시스템 콜을 구현합니다.
 
익셉션 벡터 테이블
 
익셉션의 동작 원리를 파악하려면 익셉션 벡터와 이를 구성하는 익셉션 벡터 테이블을 이해할 필요가 있습니다. 그렇다면 익셉션 벡터와 익셉션이란 무엇일까요? 익셉션이 발생하면 ARM 프로세서는 익셉션의 종류별로 지정된 주소로 프로그램 카운터를 변경하는데, 익셉션의 종류별로 지정된 주소를 익셉션 벡터라고 합니다. 
 
익셉션을 ARM 프로세서가 감지하면 ARM 프로세서는 무엇을 할까요? 크게 다음과 같은 동작을 수행합니다.
 
   ❑ 프로세서의 동작 모드를 저장(SPSR 레지스터)
   ❑ 익셉션의 종류 별로 지정된 주소로 프로그램 카운터를 변경
 
그렇다면 ARM 프로세서는 익셉션이 발생했다는 사실을 감지한 다음에 지정된 주소로 프로그램 카운터를 어떻게 변경할까요? 다음 순서로 동작합니다.
 
   ❑ 익셉션 벡터 테이블의 시작 주소를 찾는다.
   ❑ 익셉션 벡터 테이블의 시작 주소에서 떨어진 주소로 프로그램 카운터를 변경한다.
 
ARM 프로세서가 익셉션을 처리할 때 참고하는 중요한 정보는 익셉션 벡터 테이블의 시작 주소입니다. 익셉션 벡터 테이블는 익셉션이 발생했을 때 ARM 프로세서가 프로그램 카운터를 익셉션의 종류 별로 지정된 주소로 변경할 수 있는 정보를 담고 있습니다. 익셉션 벡터는 익셉션이 발생하면 익셉션의 종류 별로 프로그램 카운터가 변경되는 주소인데, 익셉션 벡터 테이블은 익셉션 벡터들의 정보를 담고 있습니다.
다음 표에 각 익셉션의 종류별로 지정된 익셉션 벡터의 주소 정보는 익셉션 벡터 테이블에 명시돼 있습니다. 
 
표 1.4 ARMv7 아키텍처의 익셉션 벡터 테이블
 
표 1.4의 오른쪽 행은 오프셋을 의미하는데, 익셉션 벡터 테이블의 시작 주소 기준으로 떨어진 주소를 의미합니다. ARM 프로세서 관점에서 익셉션 벡터 테이블의 시작 주소는 시스템 레지스터인 VBAR(Vector Base Address Register)를 통해 변경할 수 있는데, 리눅스에서는 보통 0xFFFF_0000 주소로 설정합니다.
 
만약 데이터 어보트(Data Abort) 익셉션이 발생하면 익셉션 벡터 테이블의 시작 주소 기준으로 0x10 주소로 프로그램 카운터를 변경합니다. 만약 인터럽트 익셉션이 발생하면 익셉션 벡터 테이블의 시작 주소 기준으로 0x18 주소로 프로그램 카운터를 변경합니다. 여기서 프로그램 카운터를 변경하는 주인공은 ARM 프로세서입니다.
 
익셉션 벡터 테이블은 리눅스 운영체제에서 어떻게 구현됐을까
 
ARM 프로세서 입장에서 익셉션이 발생하면 다음과 같은 동작만을 수행합니다. 
 
   ❑ 익셉션 벡터 테이블이 시작 주소를 참고해 익셉션의 종류 별로 지정된 주소를 프로그램
     카운터로 변경한다. 
 
이 부분을 공부하면 자연히 다음과 같은 의문점이 생깁니다.
 
   ❑ 익셉션의 종류 별로 뭔가 소프트웨어적인 처리를 해야 하지 않을까?
 
데이터 어보트라는 익셉션이 발생하면 데이터 어보트가 발생했다는 정보를 출력하거나 일을 해야 할 것 같습니다. 또한 인터럽트라는 익셉션이 발생하면 인터럽트가 발생했다는 사실을 운영체제에 알리거나 뭔가 다른 처리를 해야 할 것 같습니다. 이렇게 익셉션의 종류별로 후속 처리를 하는 코드는 운영체제의 소프트웨어 개발자가 구현하며, 익셉션 벡터에 코드를 배치시킵니다. 
 
다음은 리눅스 운영체제에서 구현된 익셉션 벡터 테이블의 코드입니다.
 
01 NSR:FFFF0000|EA0003FF    b       0xFFFF1004       ; vector_rst 
02 NSR:FFFF0004|EA000465    b       0xFFFF11A0       ; vector_und
03 NSR:FFFF0008|E59FFFF0    ldr     pc,0xFFFF1000
04 NSR:FFFF000C|EA000443    b       0xFFFF1120       ; vector_pabt
05 NSR:FFFF0010|EA000422    b       0xFFFF10A0       ; vector_dabt
06 NSR:FFFF0014|EA000481    b       0xFFFF1220       ; vector_addrexcptn
07 NSR:FFFF0018|EA000400    b       0xFFFF1020       ; vector_irq
08 NSR:FFFF001C|EA000487    b       0xFFFF1240       ; vector_fiq
 
01번째 줄에 보이는 0xFFFF0000는 익셉션 벡터 테이블의 시작 주소인데, ARM 아키텍처에서 명시된 익셉션 벡터 테이블에 지정된 오프셋에 따라 코드가 구현됐습니다. 
 
01~08번째 줄은 모두 지정된 레이블로 브랜치를 하는 코드로 구성돼 있습니다. 
 
예를 들어, 데이터 어보트라는 익셉션이 발생하면 ARM 프로세서는 프로그램 카운터를 0xFFFF0010가 변경하는데, 0xFFFF0010 주소에는 vector_dabt 레이블로 브랜치하는 "b 0xFFFF10A0 ; vector_dabt"  명령어가 보입니다. 
 
마찬가지로 인터럽트 익셉션이 발생하면 ARM 프로세서는 프로그램 카운터를 0xFFFF0018가 변경하며 0xFFFF0018 주소를 실행하면 vector_irq 레이블로 브랜치합니다.
 
이처럼 익셉션 벡터의 구현부는 ARM 프로세서와 운영체제의 교차점이라고 볼 수 있습니다. ARM 프로세서에서 익셉션이 동작하는 원리와 운영체제의 기능을 알아야 익셉션에 대한 코드를 구현할 수 있습니다.
 
---
"이 포스팅이 유익하다고 생각되시면 공감 혹은 댓글로 응원해주시면 감사하겠습니다. "혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!"
 
​Thanks,
Guillermo Austin Kim(austindh.kim@gmail.com)
---
< '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 저자>
 
 
* 유튜브 소개 영상