익셉션 레벨은 ‘익셉션’과 ‘레벨’의 합성어로 익셉션의 레벨로 해석할 수 있습니다. 그런데 ‘익셉션 레벨’은 ‘익셉션의 레벨’과는 조금 다른 의미를 지니는 용어입니다. 먼저 익셉션 레벨을 소개합니다.

다음과 같은 Arm 스펙 문서의 내용을 보면서 익셉션 레벨에 대해 알아봅시다.

출처: Arm Architecture Reference Manual Armv8, for A-profile architecture https://developer.arm.com/documentation/ddi0487/gb 
D1.1 Exception levels

The ARMv8-A architecture defines a set of Exception levels, EL0 to EL3, where:
• If ELn is the Exception level, increased values of n indicate increased software
   execution privilege.
  • Execution at EL0 is called unprivileged execution.
  • EL2 provides support for virtualization of Non-secure operation.
• EL3 provides support for switching between two Security states, Secure state 
  and Non-secure state.

An implementation might not include all of the Exception levels. All implementations must include EL0 and EL1. EL2 and EL3 are optional.

스펙 문서의 내용은 다음과 같이 정리할 수 있습니다.

 

   
ARMv8-A 아키텍처는 EL0에서 EL3까지 익셉션 레벨을 다음과 같이 정의한다.

 ELn을 익셉션 레벨이라 하며, n은 PL(Privilege Level)을 뜻한다.
 EL0는 Unprivileged Execution이다.
 EL2는 논 시큐어 동작에서 가상화를 지원하기 위한 익셉션 레벨이다.
 EL3는 논 시큐어 상태와 시큐어 상태를 전환하는 시큐어 모니터가 실행되는 익셉션 레벨이다.
 (운영체제나 RTOS를 구현할 때) 모든 익셉션 레벨을 구현해야 할 필요는 없다. EL0와 EL1은 필수 구현 사항이고, EL2, EL3는 옵션으로 반드시 구현할 필요는 없다.

 



앞에서 소개한 스펙 문서의 내용은 명료하게 익셉션 레벨을 설명합니다. 하지만 입문자는 위 내용을 읽고 익셉션 레벨을 바로 이해하기 어렵습니다. 이제부터 익셉션 레벨에 대해 더 자세히 알아봅시다.

 

익셉션 레벨 추가 분석


앞에서도 다룬 바 있지만 복습하는 차원에서 설명하자면 먼저 EL은 익셉션 레벨(Exception Level)의 약자입니다. 사실 익셉션 레벨은 ELn 혹은 ELx로 명시하며, 'EL'의 접미사로 있는 n이나 x는 익셉션 레벨의 단계를 뜻합니다. 여기서 n이나 x 값의 범위는 0 ~ 3입니다.

EL0는 익셉션 레벨 0, EL1은 익셉션 레벨 1이라고 부르며 익셉션 레벨은 EL0, EL1, EL2, 그리고 EL3까지 존재합니다.   

n이나 x 값의 범위는 0과 3 사이인데, 이 정숫값은 PL(Privilege Level)과 비례합니다. EL0는 PL0이고 EL1은 PL1입니다. EL0는 비특권 레벨(Unprivileged Level) 혹은 PL0로 실행되는 익셉션 레벨입니다. PL0 혹은 비특권 레벨에서는 시스템 메모리에 직접 접근할 수 없고, MMU나 인터럽트와 같은 시스템 설정은 할 수 없는 권한을 지닌 익셉션 레벨입니다. 

또한 스펙 문서에서 "EL0와 EL1은 필수 구현 사항이고, EL2, EL3는 반드시 구현할 필요는 없다"라고 명시한 부분이 있습니다. 일반적으로 하나의 운영체제만 실행되는 시스템에서는 유저 애플리케이션이 구동되는 EL0와 운영체제 커널이 구동되는 EL1만 구현하면 됩니다.

게스트 OS 혹은 가상 머신을 실행하는 하이퍼바이저에서는 EL2는 구현해야 하고, 트러스트존을 활용해 시큐어 운영체제(Secure OS)를 사용하는 경우에만 EL3를 구현해야 합니다.

 


[정보] 트러스트존과 시큐어 운영체제
트러스트존은 CPU 내에 신뢰할 수 있는 실행 영역을 확보하기 위한 보안 아키텍처입니다. 시큐어 운영체제는 트러스트존에서 정의된 시큐어 월드에서 실행되는 보안 소프트웨어입니다. 자세한 내용은 15장 ‘트러스트존’을 참고하세요.
달리 보면 EL2와 EL3는 추가로 구현되는 옵션으로 볼 수 있습니다. 그런데 "EL2, EL3는 반드시 구현할 필요는 없다"라는 내용을 읽으면 다음과 같은 의문이 생깁니다.

 


여기서 EL2와 EL3를 구현해야 한다는 것은 무엇을 의미할까?

먼저 익셉션 레벨을 운영체제나 RTOS에서 사용하려면 ELx(익셉션 레벨)별로 시스템 설정을 해야 합니다. 이를 위해 기본적으로 다음과 같은 기능을 구현해야 합니다.

 각 익셉션 레벨별로 익셉션 핸들러를 구현
 각 익셉션 레벨별로 사용되는 스택을 설정
 익셉션 핸들러의 베이스 주소를 VBAR_ELx 레지스터를 통해 설정
 관련 시스템 레지스터 및 MMU 설정

이 같은 기본 기능을 구현해야 EL1에서 EL2나 EL3로 실행 흐름이 이어집니다.

운영체제에서는 익셉션 레벨이 어떻게 활용될까?

이어서 익셉션 레벨이 운영체제에서 어떻게 활용되는지 다음 Arm 스펙 문서를 보면서 알아 봅시다.

 



출처: Arm Architecture Reference Manual Armv8, for A-profile architecture https://developer.arm.com/documentation/ddi0487/gb 
D1.1.1 Typical Exception level usage model

The architecture does not specify what software uses which Exception level. Such choices are outside the scope of the architecture. However, the following is a common usage model for the Exception levels:

 EL0: Applications.
 EL1: OS kernel and associated functions that are typically described as privileged.
 EL2: Hypervisor.
 EL3: Secure monitor.

 



스펙 문서의 내용은 다음과 같이 요약할 수 있습니다.


Arm 아키텍처는 SW(운영체제)에서 어떤 익셉션 레벨을 사용할지 명시하지는 않는다. 이런 결정은 아키텍처의 범위를 범어선다. 하지만 대부분의 소프트웨어는 다음과 같은 익셉션 레벨에서 실행된다. 

 EL0: 유저 애플리케이션 
 EL1: 운영체제 커널(특권 권한으로 실행되는 함수) 
 EL2: 하이퍼바이저
 EL3: 시큐어 모니터 

 



두 개 이상의 게스트 OS를 실행하는 하이퍼바이저를 구현하지 않는 경우 EL2는 필수로 구현할 필요가 없습니다. 여기서 시큐어 모니터는 Armv8 아키텍처에서 도입된 실행 영역으로 EL3에서 실행됩니다. 시큐어 모니터는 논 시큐어 월드와 시큐어 월드 사이를 이동하기 위한 용도(Gatekeeping)로 도입된 실행 영역으로, 트러스트존 기능을 활성화해 보안 환경을 구축하려는 시스템에서만 사용됩니다.

EL2와 EL3는 필수 구현 항목은 아니므로 일단 ‘EL0에서는 유저 애플리케이션이 실행되고, EL1에서는 운영체제 커널이 실행된다’라는 정도로 기억해 둡시다. 

 

[중요] 익셉션 레벨와 Armv7의 동작 모드

익셉션 레벨에 대한 이해를 돕기 위해 Armv7 아키텍처의 동작 모드를 어떤 방식으로 활용하는지 함께 알아봅시다.

Armv7 아키텍처에서 유저 애플리케이션은 유저 모드에서 실행됩니다. 마찬가지로 Armv8 아키텍처에서는 EL0에서 유저 애플리케이션이 구동됩니다. 또한 Armv7 아키텍처에서 운영체제 커널은 슈퍼바이저 모드, Armv8 아키텍처에서는 EL1에서 운영체제 커널이 실행됩니다.

 

 


익셉션 레벨과 기능 정리

다음 표를 보면서 익셉션 레벨에 대해 배운 내용을 정리합시다.

 


 
어셈블리 명령어를 보면 ELR_EL1 혹은 SP_EL2와 같이 레지스터의 접미사가 많이 보입니다. 익셉션 레벨과 같이 정의된 이 같은 레지스터를 보면 위 표에서 소개한 익셉션 레벨이 떠올랐으면 좋겠습니다.

 

 

< '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 저자>
 
 

+ Recent posts