AArch64 레지스터

AArch64 아키텍처는 64비트 ARM 아키텍처로, 다양한 용도로 사용되는 여러 레지스터를 제공한다. 이 레지스터들은 다양한 목적으로 사용되며, 프로세서 상태, 데이터, 벡터 연산 등 다양한 기능을 지원한다. 이 글에서는 AArch64 레지스터에 대해 알아본다.

General-purpose registers (R0R30)

대부분의 AArch64 명령어는 레지스터에서 작동하는데, 31개의 General-purpose(범용) 레지스터를 제공한다. 각 레지스터는 64bit X 레지스터(X0..X30) 또는 32bit W 레지스터(W0..W30)로 사용할 수 있다. 아래 레지스터 다이어그램은 W0X0의 하위 32bit 이고, W1X1의 하위 32bit 임을 보여준다.

데이터 처리 명령의 경우 X 또는 W를 선택하면 작업 크기가 결정되는데, X 레지스터를 사용하면 64bit 연산이 되고, W 레지스터를 사용하면 32bit 연산이 된다. 아래 예제는 32bit 정수 덧셈 연산이다.

ADD W0, W1, W2

아래 예제는 64bit 정수 덧셈 연산이다.

ADD X0, X1, X2

Link Register(LR)

보통 X30은 링크 레지스터로 사용되며 LR 이라고도 한다.

SIMD & floating-point registers

부동 소수점 및 벡터 연산에 사용되는 별도의 32개 레지스터 세트가 있는데, 이러한 레지스터는 128bit 이지만 범용 레지스터와 마찬가지로 여러 가지 방법으로 액세스 할 수 있다. Bx는 8bit, Hx는 16bit, Qx는 128bit 이다.

레지스터에 사용하는 이름에 따라 계산 크기가 정해 진다. 아래 예는 32bit 부동 소수점 추가를 수행한다.

FADD S0, S1, S2

아래 예는 64bit 실수형 덧셈을 수행한다.

FADD D0, D1, D2

이러한 레지스터는 V 레지스터라고도 한다. V 형식을 사용하면 레지스터가 벡터로 처리된다. 즉, 단일 값이 아닌 여러 개의 독립적인 값을 포함하는 것처럼 처리된다. 아래 예는 벡터 부동소수점 덧셈을 수행한다.

FADD V0.2D, V1.2D, V2.2D

이 예에서는 벡터 정수 덧셈을 수행하는 것을 보여준다.

ADD V0.2D, V1.2D, V2.2D

뒷부분에서 벡터 명령에 대해 더 자세히 살펴보도록 한다.

Spectial registers

  • 보통 X30은 Link Register로 사용된다.
  • 보통 X31은 0x0값으로 되어 있는 Zero Register로 사용된다.

Zero Register(XZR, WZR)

제로 레지스터인 ZXR WZR은 항상 0을 읽고, 쓰기를 무시한다. XZR은 64비트, WZR은 32비트 크기로 사용한다.

Size32bit64bit
NameWZRXZR

Program Counter(PC)

AArch64에서 PC는 현재 명령의 주소를 담고 있다. AArch64에서 PC 는 범용 레지스터가 아니기 때문에 소프트웨어에서 직접 접근할 수 없다. 다만, PC는 다음과 같이 ADR 명령어를 이용하여 읽을 수 있다.

ADR Xd, .

ADR 명령어는 현재 위치를 기준으로 계산된 라벨의 주소를 반환한다. (‘.’)은 여기를 의미하므로 표시된 명령어는 자신의 주소를 반환한다. 이는 PC를 읽는 것과 같다.

Stack Pointer(SP)

load/store 에 대한 base address(기본 주소)로 스택 포인터(SP)를 사용할 수 있다. 제한된 데이터 처리 명령어셋와 함께 스택포인터를 사용 할 수도 있지만 일반적인 범용 레지스터는 아니다. AArch64에는 여러 스택 포인터가 있으며 각 포인터는 특정 Exception Level과 연결되어 있다.이름은 SP_ELn이다.

  • SP_EL0
  • SP_EL1
  • 만약 EL2가 구현되어 있다면, SP_EL2
  • 만약 EL3가 구현되어 있다면, SP_EL3

Stack Pointer Register 사용

스택포인터는 Exception Level에 대한 접미사로 표시될 수 있다.

  • t(thread) : 모든 Exception에서SP_EL0 만 사용
  • h(handler) : 각 Exception에서 SP_ELx 사용

Stack Pointer 옵션

Exception LevelAArch64 stack pointer options
EL0EL0t
EL1EL1t, EL1h
EL2EL2t, EL2h
EL3EL3t, EL3h

Stack Pointer Select (SPSel)

SPSel 레지스터의 SP비트 값에 따라 사용되는 스택포인터가 정해진다.

  • 0 : 모든 Exception Level 에서 SP_EL0 사용
  • 1 : 모든 Eceoption Level에서 각자의 SP_ELx를 사용

리눅스 커널은 SPSel 을 설정하지 않고 필요에 따라 해당 Exceoption Level 을 직접 지정하는 방식을 구현하고 있다.

Saved Process Status Register(SPSR)

  • SS (21) : Software Step

SPSR는 특정 시점의 프로세서 상태를 저장하는 레지스터이다. SPSR은 Exception을 취할 수 없는 EL0를 제외한 각 Exception Level마다 존재하며, 이름은 SPSR_ELn이다.

  • EL1 : SPSR_EL1
  • EL2 : SPSR_EL2
  • EL3 : SPSR_EL3

Exception Link register(ELR)

ELR은 익셉션 복귀 시 돌아갈 실행 위치를 저장하는 레지스터이다. 프로세서에 의해 현재 Exception Level에 해당하는 레지스터 값이 PC에 복사된다. ELR 레지스터는 복귀할 Exception Level이 없는 EL0를 제외하고 각 Exception Level마다 존재하며 이름은 ELR_ELn 이다.

System registers

시스템 레지스터는 프로세서를 구성하고 MMU 및 예외 처리와 같은 시스템을 제어하는데 사용된다. 시스템 레지스터는 데이터 처리나 load/store 명령으로 직접 사용할 수 없다. 대신 시스템 레지스터의 내용을 X레지스터로 읽어 들여 연산한 다음 시스템 레지스터에 다시 써야 한다.

시스템 레지스터에 access하기 위한 두 가지 명령는 다음과 같다.

MRS Xd, <system register>

<system register> 값을 Xd로 읽어온다.

MSR <system register>, Xn

Xn 값을 <system register>에 write한다.

시스템 레지스터는 특정한 이름이 있는데, SCTLR_EL1를 예로 들면 아래 명령어는 SCTLR_EL1를 X0 레지스터로 읽는다.

MRS X0, SCTLR_EL1
  • 시스템 레지스터 이름은 _ELx로 끝난다.
  • _ELx는 레지스터에 액세스 하는데 필요한 최소 권한을 지정한다.
  • 권한이 부족한 상태에서 레지스터에 액세스하려고 하면 예외가 발생한다.

참고

답글 남기기