Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

948
469
422439


[Arm프로세서] Armv8 익셉션 레벨이란 Armv8: Exception Level(EL)

익셉션 레벨은 무엇일까요? 먼저 익셉션 레벨을 가장 명확하게 설명하는 Arm 아키텍처 문서를 보면서 익셉션 레벨을 소개하겠습니다.

익셉션 레벨에 대한 Arm 스팩 문서 분석

다음 Arm 스팩 문서를 분석하면서 익셉션 레벨을 배워 봅시다. 

(출처: ARMv8-A_Architecture_Reference_Manual_(Issue_A.a))

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는 반드시 구현할 필요는 없다.

건조하긴 하지만 가장 명료하게 익셉션 레벨을 정의하고 있습니다.

익셉션 레벨 Arm 스팩 문서 추가 분석

위에서 소개한 스팩 문서의 내용은 명료하긴 하나 구체적으로 와 닿지는 않습니다. Arm 스팩 문서는 모든 상황과 조건을 만족하는 포괄적인 내용이 많아 보충 설명이 필요합니다. 

보통 익셉션 레벨은 ELn 혹은 ELx으로 명시하며 'EL' 왼쪽에 보이는 n이나 x는 익셉션 레벨의 단계를 뜻합니다. EL0은 익셉션 레벨0, EL1은 익셉션 레벨1이라고 합니다. 여기서 n이나 x값의 범위는 0부터 3입니다. 즉, EL0, EL1, EL2 그리고 EL3까지 존재합니다. 

[주의]
참고로 EL4는 Armv8 아키텍처에서 존재하지 않는 익셉션 레벨입니다.


n이나 x값의 범위는 0부터 3사이 인데, 이 정수 값은 PL(Privileged Level)과 비례합니다. 즉, EL0는 PL0이고 EL1는 PL1입니다. EL0는 Unprivileged Level이라고 명시하는데, PL0 혹은 Unprivileged Level은 시스템 메모리에 접근할 수 없고, 시스템 레지스터를 설정하는 Arm 어셈블리 명령어를 실행할 수 없는 권한 레벨입니다. 

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

멀티 운영체제를 탑재한 하이퍼바이저에서는 EL2는 구현해야 하고, 트러스트존을 활용해 시큐어 운영체제를 사용하는 경우에만 EL3을 구현해야 합니다. 달리 보면 EL2와 EL3는 추가 구현 옵션(option)으로 볼 수 있습니다. 

[중요]

"EL2, EL3는 반드시 구현할 필요는 없다"고 설명한 부분이 있는데, 여기서 무엇을 구현해야 한다는 의미일까요? 먼저 익셉션 레벨을 운영체제나 RTOS에서 사용하려면 ELx(익셉션 레벨) 별로 시스템 설정을 해야 합니다. 가장 대표적으로 각 익셉션 레벨 별로 익셉션 벡터 핸들러를 구현하고, 각 익셉션 레벨 별로 사용되는 스택을 설정해야 합니다. 그래야 EL1에서 EL2나 EL3로 이동할 수 있습니다.

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

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

(출처: ARMv8-A_Architecture_Reference_Manual_(Issue_A.a))

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(운영체제)에서 어떤 익셉션 레벨을 사용할 지 명시하지는 않는다. 이런 결정은 아키텍처의 범위를 범어선다. 하지만 대부분 SW에서 다음과 같이 익셉션 레벨을 사용한다.

   * EL0: 애플리케이션 
   * EL1: 운영체제 커널 
   * EL2: 하이퍼바이저
   * EL3: 시큐어 모니터 

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

[중요]

익셉션 레벨의 이해를 돕기 위해 Armv7 아키텍처의 Arm 동작 모드를 어떤 방식으로 활용하는지 함께 설명하겠습니다.

Armv7 아키텍처에서는 유저 애플리케이션은 User 모드에서 실행됐습니다. 마찬가지로 Armv8 아키텍처에서는 EL0에서 유저 애플리케이션이 구동됩니다. 이어서 Armv7 아키텍처에서는 운영체제 커널은 Supervisor 모드에서 실행됐는데, Armv8 아키텍처에서는 EL1에서 운영체제 커널이 실행됩니다.


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


표 4.1 Armv8 아키텍처의 익셉션 레벨과 기능  

어셈블리 명령어를 보면 ELR_EL1 혹은 SP_EL2와 같이 익셉션 레벨을 나타내는 레지스터를 많이 볼 수 있습니다. 이런 레지스터을 보면 위 표에서 소개한 익셉션 레벨이 머릿 속에 떠올랐으면 좋겠습니다.

#Reference Armv8: 익셉션 레벨(ELx)


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



---



핑백

덧글

댓글 입력 영역