aarch64에서 범용 레지스터와 함께 특수 목적 레지스터들이 제공된다.
레지스터 이름 | 익셉션 레벨별 특수 목적 레지스터 | |||
EL0 | EL1 | EL2 | EL3 | |
ZR(Zero Register) | XZR / WZR | |||
PC (Program Counter) | PC | |||
SP (Stack Pointer) | SP_EL0 | SP_EL1 | SP_EL2 | SP_EL3 |
ELR (Exception Link Register) | ELR_EL1 | ELR_EL2 | ELR_EL3 | |
SPSR (Saved Process Status Register) | SPSR_EL1 | SPSR_EL2 | SPSR_EL3 |
PC (Program Counter)
PC 레지스터는 다음에 실행할 인스트럭션의 위치를 저장하는 레지스터다.
ARMv8에서 PC 레지스터는 프로그래머가 직접 접근하지 못한다. 대신 PC 로드와 상대 주소 지정 같은 인스트럭션에서 내부적으로 사용한다. 이런 제약 덕분에 복귀 예측이 쉬워지고 ABI 스펙이 간단해졌다.
ELR (Exception Link Register)
ELR 레지스터는 익셉션 복귀 시 돌아갈 실행 위치를 저장하는 레지스터다.
프로세서에 의해 현재 익셉션 레벨에 해당하는 레지스터 값이 PC에 복사된다.
복귀할 익셉션 레벨이 없는 EL0를 제외한 익셉션 레벨마다 존재하며, 이름은 ELR_ELn이다.
SPSR (Saved Process Status Register)
SPSR 레지스터는 특정 시점의 프로세서 상태를 저장하는 레지스터다.
익셉션이 발생하면 프로세서에 의해 프로세서 상태 PSTATE로부터 SPSR에 저장된다.
익셉션에서 복귀할 떄 프로세서에 의해 SPSR에서 PSTATE로 복원된다.
SPSR은 익셉션을 취할 수 없는 EL0를 제외한 익셉션 레벨마다 존재하며, 이름은 SPSR_ELn이다.
그 밖의 필드들은 PSTATE 필드와 동일하다.
M[4] (실행 상태 제어) > 익셉션이 발생했을 때의 실행 상태, aarch64일 떄 0 이다.
M[3:0] (실행 상태 제어) > 익셉션이 발생했을 때의 모드 또는 익셉션 레벨이다.
XZR, WZR (Zero Register)
ZR은 소스 레지스터로 사용되며 0이 읽히고, 목적 레지스터로 사용되면 결과 값이 버려진다.
XZR은 64비트, WZR은 32비트 크기로 사용한다.
SP, WSP (Stack Pointer)
SP는 스택의 현 위치를 가리키는 레지스터다.
EL0를 포함한 익셉션 레벨마다 존재하며, 이름은 SP_ELn이다.
WSP는 32비트 크기의 스택 포인터다.
한 가지 독특한 특징을 갖는데, EL0를 제외한 그 밖의 익셉션 레벨에서는 해당 레벨의 SP_ELn과 SP_EL0 중에서 선택적으로 스택 포인터를 사용할 수 있다는 점이다.
SPsel 레지스터의 SP 비트에 1을 설정하면 익셉션 레벨에 따른 SP_ELn을 사용하고, 0을 설정하면 익셉션 레벨과 상관없이 SP_EL0를 사용한다.
이 설정에 따라 익셉션 발생 시 이동하는 벡터(Vector) 위치도 달라진다.
t는 스레드(Thread)의 약어이며, SP0의 스택을 사용한다는 뜻이다.
h는 핸들러(Handler)의 약어이며, SPn의 스택을 사용한다는 뜻이다.
리눅스 커널은 SPsel을 설정하지 않고 필요에 따라 해당 EL의 레벨을 직접 지정하는 방식을 구현하고 있다.
'리버싱 > ARM' 카테고리의 다른 글
ABI의 레지스터 사용 규칙 (0) | 2021.02.15 |
---|---|
시스템 레지스터 (0) | 2021.02.09 |
프로세서 상태 레지스터(PSTATE) (0) | 2021.02.09 |
ARMv8 레지스터 (0) | 2021.02.09 |
실행 상태 변경 (0) | 2021.02.09 |