그런데 Armv8에서는 익셉션 레벨 별로 사용되는 레지스터가 있는데 이를 스페셜 레지스터라고 합니다. 그 목록은 다음 그림과 같습니다. 
 
 
그림 2.4 Armv8(Aarch64) 아키텍처의 스페셜 레지스터 목록
 
Armv7 에서는 각 동작 모드 별로 r13_<mode>/r14_<mode>와 같이 뱅크드된 레지스터가 있듯이, Armv8은 익셉션 레벨 별로 사용되는 레지스터가 있습니다. 이를 스페셜 레지스터라고 합니다. 
 
SP_ELx 레지스터
 
이 중에서 먼저 SP_EL0을 알아봅시다. SP_EL0은 EL0(익셉션 레벨 0)에서 실행되는 프로세스의 스택 Top 주소를 가리킵니다. 그렇다면 SP_EL1은 어느 익셉션 레벨에서 사용되는 레지스터일까요? SP_EL1은 EL1(익셉션 레벨 1)에서 실행 중인 프로세스의 스택 Top 주소를 가리킵니다.
 
SP_EL1와 같이 이름에 익셉션 레벨이 보이는 스페셜 레지스터는 Armv7에서 소개한 뱅크드 레지스터와 비슷한 방식으로 동작합니다. 이번에도 이해를 돕기 위해 다음과 같은 명령어를 소개합니다.
 
sub sp, sp, #8
 
위 명령어를 실행하면 실제 어느 레지스터가 변경될까요? Armv7 아키텍처에서는 이 명령어를 실행할 때 Arm 동작 모드에 따라 변경되는 레지스터가 결정됩니다. 같은 맥락으로 Armv8 에서는 이 명령어를 실행할 때의 익셉션 레벨에 따라 레지스터가 바뀝니다. 
 
[정보]
sub, sp, sp #8 명령어를 실행할 때 SP 레지스터의 값을 0xc000d000이라고 가정하겠습니다.
 
 
만약 EL1에서 위 명령어를 실행하면 SP_EL1과 SP 레지스터의 값이 같이 바뀝니다. SP 레지스터의 값이 0xc000d000이니 이 값에서 8를 빼면 0xc000cff8이 됩니다. 
 
이번에는 'sub, sp, sp #8' 명령어를 EL2에서 실행한다고 가정합시다. 이 때는 어느 레지스터가 업데이트될까요? SP_EL2와 SP 레지스터가 바뀝니다. EL3인 경우도 마찬가지입니다. SP_EL3와 SP 레지스터가 바뀝니다.
 
이처럼 sp 레지스터를 어셈블리 명령어에서 보면 해당 명령어가 어느 익셉션 레벨에서 실행되는지 머릿 속으로 그릴 필요가 있습니다.
 
ELR_ELx 레지스터
 
그 다음으로 ELR_EL0 레지스터를 알아봅시다. ELR은 Exception Link Register의 약자로, 익셉션이 발생한 시점의 주소를 저장하는 레지스터입니다. 그렇다면 ELR_EL1은 어느 익셉션 레벨에서 사용되는 레지스터일까요? 바로 EL1(익셉션 레벨 1)에서 익셉션이 유발될 시점의 주소 정보를 저장합니다. 
 
PC 프로그램 카운터
 
마지막으로 현재 Arm 코어가 읽어 들이는 명령어의 주소를 담고 있는 프로그램 카운터(PC)를 알아보겠습니다. Armv7 에서는 PC를 범용 레지스터로 봤는데, Armv8 에서는 스페셜 레지스터로 정의합니다. PC를 임의로 바꾸면 보안상 취약점이 될 수 있어 Armv8에서는 PC를 명령어를 통해 조작할 수 없게 설계했습니다.
 

 

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

 

* 강의 영상
 

 

 

.

 

+ Recent posts