Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

11105
637
415734


[Arm프로세서] Armv8: 익셉션 링크 레지스터(ESR: Exception Link Register) Armv8: Exception Level(EL)

Arm 코어는 익셉션을 유발할 때 익셉션이 유발되는 시점의 주소를 익셉션 링크 레지스터(Exception Link Register)에 저장합니다. 익셉션 링크 레지스터는 ELR으로 명시하며, 각 익셉션 레벨 별로 존재하는 Special-purpose 레지스터입니다. 보통 ELR은 ELR_EL1, ELR_EL2으로 표기합니다.

먼저 Armv8 아키텍처의 문서를 보면서 ELR_ELx 레지스터에 대해서 알아봅시다.

(출처: DDI0487Fc_armv8_arm.pdf)
C5.2.4 ELR_EL1, Exception Link Register (EL1)

The ELR_EL1 characteristics are:
When taking an exception to EL1, holds the address to return to.

위 스팩 문서의 내용은 다음과 같이 설명할 수 있습니다.

   “ELR_EL1 레지스터는 EL1로 익셉션이 유발될 때의 주소 정보를 담고 있는데, 
    익셉션을 처리한 다음에 복귀할 주소를 저장한다.”

[중요]
많은 개발자는 익셉션은 메모리 어보트를 유발하는 명령어를 실행할 때 유발되며, 크래시가 유발돼 시스템이 리셋된다라고 알고 있습니다. 하지만 Armv8 아키텍처는 인터럽트를 익셉션의 한 종류로 처리하며, 이를 'IRQ Interrupt' 익셉션이라고 명시합니다.

인터럽트가 발생하면 프로세스 입장에서는 실행하던 어셈블리 명령어를 멈추고 익셉션 벡터로 프로그램 카운터를 점프합니다. 이후 인터럽트에 대한 핸들링을 한 후 인터럽트가 발생한 코드로 다시 복귀해야 합니다. 이 때 어떤 명령어를 실행해야 할까요? 바로 ELR_EL1 레지스터를 활용하면 됩니다. ELR_EL1 레지스터는 익셉션을 처리한 후 복귀할 주소가 저장돼 있으므로, 인터럽트를 처리한 다음에 ERET 명령어를 실행하면 ELR_EL1 레지스터에 저장된 주소로 프로그램 카운터가 브랜치됩니다. 


ELR_EL1 레지스터는 익셉션이 유발되는 시점의 주소 정보를 담고 있으므로, 디버깅을 할 때 자주 참고하는 시스템 레지스터이니 잘 알아 둡시다. 

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


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



---





핑백

덧글

댓글 입력 영역