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 아키텍처의 범용 레지스터를 확인합시다.
이번에는 임베디드 개발에서 많이 활용되는 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(링크드 레지스터)입니다.