Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

11105
637
415734


[Arm프로세서] Armv8 익셉션 레벨: ERET 명령어 Armv8: Exception Level(EL)

익셉션이 유발된 다음에는 익셉션이 유발된 시점의 주소로 복귀해야 하는 상황이 있습니다. 예를 들어 'IRQ interrupt' 익셉션이 발생한 다음에 'IRQ interrupt' 익셉션이 발생한 코드로 복귀를 해야 합니다. 이 때 ERET 명령어를 실행하면 Arm 코어 내부에서 다음과 같은 동작을 수행합니다.

   * SPSR_EL1를 PSTATE에 로딩
   * ELR_EL1에 저장된 주소로 복귀

그렇다면 익셉션이 유발된 다음에 ERET 명령어를 사용해 익셉션이 유발된 시점으로는 왜 복귀해야 할까요? 
가장 대표적인 케이스는 다음 그림과 같습니다.

 
그림 4.4 유저 애플리케이션이 실행되는 EL0에서 ERET 명령어를 실행하는 흐름

먼저 그림에서 ①로 표시된 부분은 유저 애플리케이션이 실행되는 EL0에서 어떤 프로그램 코드가 실행되는 동작입니다. 그런데 인터럽트가 발생하면 실행 흐름이 EL1으로 바뀌는데 ②에서 표시된 부분이 이 동작을 나타냅니다. ②에서 표시된 부분의 세부 동작은 다음과 같이 분류될 수 있습니다.

   * 익셉션 레벨이 EL1로 변경
   * ELR_EL1 레지스터에 복귀할 주소(①로 표시된 부분) 및 SPSR_EL1 레지스터 업데이트
   * EL0 ‘IRQ Interrupt’ 익셉션에 해당되는 익셉션 벡터 핸들러로 분기
   * 인터럽트 핸들러 호출

이어서 ③으로 표시된 부분은 ERET 명령어를 실행해 익셉션이 유발되기 전의 익셉션 레벨로 복귀하는 동작을 나타냅니다. ERET 명령어를 실행하면 SPSR_EL1 레지스터의 값이 PSTATE로 백업되면서, ELR_EL1에 저장된 주소로 분기합니다. 이 과정에서 'IRQ Interrupt' 익셉션이 유발된 시점의 EL0으로 복귀합니다.

이어서 ERET 명령어가 사용되는 다른 예를 소개합니다.

 

그림 4.5 EL1에서 ERET 명령어를 실행하는 흐름

먼저 그림에서 ①로 표시된 부분은 운영체제의 커널이 구동되는 EL1에서 어떤 실행되는 동작입니다. 그런데 인터럽트가 발생하면 실행 흐름이 ②에서 표시된 부분과 같이 바뀝니다. ②에서 표시된 부분의 세부 동작은 다음과 같이 분류될 수 있습니다.

   * ELR_EL1 레지스터에 복귀할 주소(①로 표시된 부분) 및 SPSR_EL1 레지스터 업데이트
   * EL1 ‘IRQ Interrupt’ 익셉션에 해당되는 익셉션 벡터 핸들러로 분기
   * 인터럽트 핸들러 호출

이어서 ③으로 표시된 부분은 ERET 명령어를 실행해 인터럽트가 유발되기 전의 커널 코드로 복귀하는 동작을 나타냅니다. EL1에서 익셉션이 발생한 시점의 명령어가 있는 주소로 복귀하는 것입니다.

인터럽트가 발생하면 인터럽트가 발생한 시점의 명령어가 실행된 주소로 복귀해야 합니다. 이 상황에서 ERET 명령어를 사용합니다. ERET 명령어를 실행하면 Arm 아키텍처 내부에서 다음과 같이 동작한다는 점을 기억합시다.

   * SPSR_EL1의 값을 PSTATE에 로딩
   * ELR_EL1에 저장된 주소로 복귀

이어서 슈퍼바이저 콜로 EL1에 진입하는 방식을 알아봅시다.

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


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



---




핑백

덧글

댓글 입력 영역