Armv7에서 Armv8로 넘어 오면서 Armv7의 구조가 많이 변경됐습니다. CPU 아키텍처의 최신 기법을 Armv8 아키텍처에 적용하면서 아키텍처의 구조를 많이 개선했으므로 Armv7 대비 20% 이상의 성능 개선이 있었다고 합니다. 그렇다면 Armv8 아키텍처에서 가장 많이 바뀐 기능이 무엇일까요? 레지스터와 기존의 Arm 동작 모드를 개선한 익셉션 레벨이라고 할 수 있습니다.
 
앞으로 Armv8 아키텍처에서 정의된 다음과 같은 레지스터를 설명합니다.
 
   * 범용 레지스터
   * 스페셜 레지스터
   * 시스템 레지스터
 
먼저 범용 레지스터를 알아봅시다.
 
Armv8 아키텍처의 범용 레지스터
 
Armv8 아키텍처에서 다양한 레지스터를 정의하는데 먼저 범용 레지스터가 무엇인지 알아야 합니다. 이번 절에서는 X0~X30로 불리는 범용 레지스터를 소개합니다.
시스템 프로그래머 입장에서 가장 먼저 익혀야 하는 레지스터는 범용 레지스터입니다. Armv8에서 정의된 범용 레지스터의 목록을 소개하고 각 레지스터의 역할을 알아봅시다.
 
다음 표는 Armv8 아키텍처에서 정의된 레지스터의 목록입니다.
 
 
표 2.4 Armv8 아키텍처의 범용 레지스터 목록
 
Armv7에서 정의된 범용 레지스터인 R0--R15 대신에 X0-X30가 보입니다. 표 2.4에서 명시된 레지스터를 Armv8 아키텍처의 범용 레지스터로 정의하며 X와 번호로 구성돼 있습니다. X0, X1에서 X29, X30와 같이 표기할 수 있습니다. X0--X30 레지스터의 역할은 R0--R15와 거의 같습니다. 이번 장 도입부에서 설명했듯이, X0-X30 레지스터로 Arm 코어가 사용하는 변수입니다.
 
이번에는 실전 프로젝트에서 자주 활용되는 커널 로그에서 Armv8 아키텍처의 범용 레지스터를 확인합시다.
 
[0.939869] CPU: 1 PID: 1 Comm: swapper/0 Not tainted 5.4.61 #1
[0.960583] pstate: a0c00005 (NzCv daif +PAN +UAO)
[0.980153] pc : common_general_probe+0x84/0x3d0
[0.981280] lr : common_general_probe+0x74/0x3d0
[0.981398] sp : 0xffffffc010053b80
[1.958000] x29: 0xffffffc010053b80 x28: 0x0000000000000000
[1.209500] x27: 0xffffffc010fa0478 x26: 0xffffffc0110220b0
[1.222600] x25: 0xffffffc010f868d0 x24: 0xffffffc010ba2470
[1.218260] x23: 0xffffffc010ba2420 x22: 0xffffff89684e0000
[1.229610] x21: 0x00000000ffffffea x20: 0xffffff8967f6e400
[1.424910] x19: 0x0000000000000000 x18: 0x0000000000000010
[1.436270] x17: 0x0000000000000001 x16: 0x0000000000000010
[1.437550] x15: 0xffffff89684e0510 x14: 0x202c292865626f72
[1.633240] x13: 0x705f6c6172656e65 x12: 0x675f6e6f6d6d6f63
[1.644600] x11: 0x205d4f4950475b20 x10: 0x5d31202020203a30
[1.645890] x9 : 0x0000000000000000 x8 : 0x0000000000000003
[1.841580] x7 : 0x00000000000001fc x6 : 0xffffffc011327000
[1.852940] x5 : 0x0000000000000001 x4 : 0xffffffc01132a808
[1.104821] x3 : 0x00000000ffffffff x2 : 0x00000000ffffffc0
[1.105957] x1 : 0x000000000000000a x0 : 0x0000000000000000
 
처음에 소개했던 X0부터 X30 레지스터까지 모두 보입니다. 
 
이번에는 임베디드 개발에서 많이 활용되는 TRACE32 프로그램에서 확인한 범용 레지스터를 소개합니다. 
 

 
 
그림 2.3 TRACE32 프로그램으로 본 Armv8 아키텍처의 레지스터 목록
 
X0에서부터 X30까지 레지스터가 보입니다. X0-X30는 Armv8 아키텍처에서 정의된 범용 레지스터로 프로세스가 실행 흐름을 저장합니다. 그래서 커널 크래시와 같이 시스템에 오류가 있을 때 범용 레지스터의 값을 로그로 뿌려줍니다.
 
이번에는 Armv8 아키텍처에서 정의된 범용 레지스터 세트를 알아봅시다. 다음은 Arm 스팩 문서에서 발췌한 내용입니다.
 
출처: DDI0487A_g_Armv8_Arm.pdf
B1.2.1 Registers in AArch64 state
 
In the AArch64 application level view, an Arm processing element has:
R0-R30 31 general-purpose registers, R0 to R30. Each register can be accessed as:
  • A 64-bit general-purpose register named X0 to X30.
  • A 32-bit general-purpose register named W0 to W30.
 
See the register name mapping in Figure B1-1.
 
X0~X30 레지스터는 범용 레지스터로 사용된다는 내용인데, 레지스터에 저장하는 데이터의 크기에 따라 다음과 같은 방식으로 표기합니다.
 
   * X0~X30: 64비트 크기 데이터를 저장  
   * W0~W30: 32비트의 데이터를 저장 
 
X0~X29와 같은 범용 레지스터는 주로 데이터를 연산하거나 메모리에 접근하는 명령어를 실행할 때 주소나 상수값을 저장합니다. X30은 Armv8에서 링크 레지스터(Link Register)로 사용되며, 서브 루틴으로 분기한 다음에 복귀할 주소를 저장합니다. Armv7의 R14와 유사한 기능입니다.
 
 
[정보]
함수 호출 규약(AAPCS)과 연관된 레지스터는 PC와 SP 그리고 X30(링크드 레지스터)입니다.

 

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

Updated 02.06.2024

+ Recent posts