Computer Science

[CS] ARM Architecture ( ISA )

Tjdmin1 2025. 5. 13. 12:57

1. ARM Architecture란?

ARM 아키텍처(ARM Architecture)는 영국의 ARM Holdings에서 설계한 저전력, 고효율의 RISC 기반 프로세서 구조를 말합니다.

오늘날 스마트폰, 태블릿, IoT 기기, 임베디드 시스템, 그리고 MacBook과 같은 디바이스에 널리 사용되고 있으며, 안드로이드 디바이스의 대부분의 CPU는 ARM 아키텍처를 기반으로 하고 있습니다.

 

여기서 RISC(Reduced Instruction Set Computer)는 이름 그대로 명령어 집합을 단순화한 컴퓨터 아키텍처를 의미합니다.
복잡한 명령어를 사용하는 CISC(Complex Instruction Set Computer) 방식의 AMD64(x86_64) 아키텍처에 비해, RISC는 간단한 명령어를 더 빠르게 실행할 수 있어, 특정 상황에서는 더 우수한 성능과 효율성을 발휘할 수 있습니다.

 

이러한 특징 덕분에 ARM 아키텍처는 크기가 작고 배터리 사용이 중요한 스마트폰, 태블릿, IoT 기기, 임베디드 시스템 등에 적합하며,
전력 소비를 최소화하면서도 안정적인 성능을 제공할 수 있습니다.

 

2. ARM 프로세서 종류

List of ARM processors

 

ARM 프로세서 종류가 엄청나게 종류가 많은 것을 볼 수 있습니다.

 

 Cortex-A (Application Profile)

  • 용도: 고성능 애플리케이션용
  • 사용처: 스마트폰, 태블릿, 노트북, 일부 서버
  • 특징:
    • 가상 메모리(MMU) 지원
    • 리눅스, 안드로이드, Windows 등 운영체제 탑재 가능
    • 멀티코어, 멀티스레드 지원

대표 코어 예시

  • Cortex-A53: 보급형 64비트
  • Cortex-A76: 플래그십용 고성능
  • Cortex-X3: ARMv9 기반 초고성능 코어

Cortex-R (Real-time Profile)

  • 용도: 실시간 처리 (RTOS 기반)
  • 사용처: 자동차 ECU, 산업용 로봇, HDD 컨트롤러 등
  • 특징:
    • 짧고 예측 가능한 응답 시간 보장
    • 일반 OS가 아닌 RTOS (실시간 운영체제) 사용
    • 종종 이중화 코어 (lockstep) 기능 포함 → 신뢰성 강화

대표 코어 예시

  • Cortex-R5: 자동차 제어 ECU
  • Cortex-R8: 고속 저장장치 컨트롤러 등

Cortex-M (Microcontroller Profile)

  • 용도: 초저전력, 저가형 임베디드 시스템
  • 사용처: IoT 센서, 스마트워치, 소형 전자기기, 마이크로컨트롤러
  • 특징:
    • 단일 명령어 실행, 전력 효율 극대화
    • MMU 없음, 대신 간단한 MPU
    • 대부분 Bare-metal 또는 RTOS 환경에서 동작

대표 코어 예시

  • Cortex-M0: 초소형 MCU, 소비전력 극저
  • Cortex-M4: DSP 기능 포함
  • Cortex-M33: 보안기능 강화 (TrustZone 지원)

 

이런 식으로 분류가 되고 나머지는 표로 정리해드리겠습니다.

T Thumb 16비트 압축 명령어 세트 지원. 코드 크기를 줄여서 메모리 절약 가능
D Debug (EmbeddedICE) 디버깅 기능 포함. JTAG 등의 외부 디버거와 연결하여 하드웨어 디버깅 가능
T2 Thumb-2 Thumb에 32비트 명령어 일부 추가. ARM 명령어와 거의 동등한 기능
E Enhanced DSP DSP(디지털 신호 처리) 명령어 지원. MAC, SIMD 등 멀티미디어 처리에 유리
J Jazelle Java 바이트코드를 하드웨어 수준에서 직접 실행 (JVM을 하드웨어 가속)
I EmbeddedICE 하드웨어 디버깅 기능 포함. JTAG 등 외부 디버거 연결 가능
S Synthesisable 칩 제조사들이 FPGA나 ASIC에 통합할 수 있도록 설계된 소프트코어
Z Jazelle/TrustZone 확장 Java 실행 또는 TrustZone 보안 기능 일부 지원 (ARMv6Z 등)
K Cryptographic Extensions 암호화 명령어 하드웨어 가속 (AES, SHA 등 ARMv8 이후에 적용)
Baseline Baseline Profile Cortex-M 계열에서 최소 기능만 포함된 기본형. MMU 없음, Thumb 전용
Mainline Mainline Profile Cortex-M 계열의 확장형. TrustZone, FPU, MPU 등 고급 기능 지원

 

3. ARM ISA (Instruction Set Architecture)

ARM ISA(Instruction Set Architecture)는 ARM 프로세서에서 사용되는 명령어 집합 구조로, 프로세서가 해석하고 실행할 수 있는 기계어 명령의 형식, 레지스터 구성, 주소 지정 방식, 실행 규칙 등을 정의하는 설계 기준입니다.

 

현재 시중에 출시된 스마트폰이나 태블릿에는 주로 ARMv8-AARMv9-A 기반의 프로세서가 사용되고 있으며, 최신 제품일수록 ARMv9-A 채택 비율이 높습니다.

 

따라서 이후 설명은 최신 아키텍처인 ARMv9-A를 중심으로 진행하겠습니다.

또한 대부분의 최신 안드로이드 기기들은 AArch64 ( ARM64 ) 전용으로 동작하여 AArch64 기준으로 설명하겠습니다.

 

Register

공식 문서를 보게되면 범용 레지스터 R0부터 R30까지 총 31개의 레지스터는, 64비트 모드에서는 각각 X0부터 X30으로 불리고, 32비트 모드에서는 W0부터 W30으로 불립니다.
이는 AMD64 아키텍처의 RAX와 EAX 관계와 유사합니다.

 

168P

The X30 general-purpose register is used as the procedure call link register.

 

문장에서 알 수 있듯이, X30 레지스터는 함수 호출 시 복귀 주소를 저장하는 용도로 사용되며, 일반적으로 링크 레지스터(Link Register) 또는 줄여서 LR이라고도 불립니다.

 

또한 공식 문서에는 안나와있지만 X29 레지스터는 fp라고도 불립니다.

 

SP Register와 PC Register도 있습니다.

SP는 64비트 전용 스택 포인터(Stack Pointer) 레지스터입니다.

함수 호출 시 지역 변수나 리턴 주소 등을 저장하는 스택의 현재 위치를 가리킵니다.

SP의 하위 32비트는 WSP라는 이름으로 접근할 수 있습니다. 즉, 32비트 연산 시에는 WSP를 통해 값 일부만 다룰 수 있습니다.

PC는 현재 실행 중인 명령어의 주소를 저장하는 64비트 레지스터입니다.

 

그럼 제가 만든 문제인 StartLink문제를 ARM 아키텍쳐로 컴파일해 디버깅 해보겠습니다.

main 함수에 브레이크포인트를 설정한 뒤 확인한 레지스터 정보입니다.
앞서 설명드렸던 것처럼, X0부터 X28까지의 범용 레지스터와 함께 fp(X29), lr(X30), 그리고 sp(Stack Pointer), pc(Program Counter) 레지스터가 표시되어 있는 것을 확인할 수 있습니다.

 

CPSR 레지스터는 ARM 아키텍처에서의 플래그 레지스터로, AMD64 아키텍처에서의 ZF(Zero Flag)와 같은 플래그 레지스터들과 동일한 역할을 합니다.

 

322p

Flag 상태

이번엔 어셈블리를 조금 봐보겠습니다.

 

위와 같이 함수의 프롤로그에서 X29 레지스터는 현재 스택 포인터(sp)를 기준으로 프레임 포인터 역할을 수행하도록 설정됩니다.

구체적으로 x29는 sp + 0x20 값을 저장함으로써, 현재 함수의 스택 프레임 기준점으로 사용됩니다.
이처럼 ARM64의 함수 호출 규약(AAPCS64)에 따라 X29를 프레임 포인터로 사용하는 것이 관례이며, 이로 인해 디버거나 리버싱 도구에서는 x29를 fp(frame pointer)라고 별칭으로 표시하게 됩니다.

 

이 어셈블리에선 wzr이라는 레지스터도 보이게 되는데 저 레지스터는 Zero Register라고 불리게됩니다.

아래 표로 정리해놓겠습니다.

XZR 64비트 Zero Register. 항상 값이 0이며, 읽으면 0을 반환하고, 기록하면 무시됩니다. 사용 예: ADD X1, X2, XZR → X1 = X2 + 0
WZR 32비트 XZR의 하위 32비트 버전. 항상 0이며, 기록해도 무시됩니다.
WSP 32비트 Stack Pointer (SP)의 하위 32비트 접근용 이름. SP는 64비트지만, 32비트 명령어에서 사용 시 WSP로 접근합니다.

 

Assembly Language

기본적인 주요 어셈블리 정리

ADD 산술 덧셈 Rd = Rn + Op2
ADC 산술 Carry 포함 덧셈 Rd = Rn + Op2 + C
SUB 산술 뺄셈 Rd = Rn - Op2
SBC 산술 Carry 포함 뺄셈 Rd = Rn - Op2 - !C
RSB 산술 역순 뺄셈 Rd = Op2 - Rn
RSC 산술 역순 Carry 포함 뺄셈 Rd = Op2 - Rn - !C
MOV 데이터 복사 Rd = Op2
MVN 데이터 NOT 복사 Rd = ~Op2
AND 논리 AND 연산 Rd = Rn & Op2
BIC 논리 비트 클리어 Rd = Rn & ~Op2
ORR 논리 OR 연산 Rd = Rn | Op2
EOR 논리 XOR 연산 Rd = Rn ^ Op2
CMP 플래그 비교 CPSR 설정 (Rn - Op2)
CMN 플래그 음수 비교 CPSR 설정 (Rn + Op2)
TST 플래그 AND 테스트 CPSR 설정 (Rn & Op2)
TEQ 플래그 XOR 테스트 CPSR 설정 (Rn ^ Op2)
LDR 메모리 로드 Rd = [주소]
STR 메모리 저장 [주소] = Rd
ADRP 주소 페이지 주소 로딩 Rd = (Op 주소의 상위 4KB)
MOVZ 상수 상수 초기화 Rd = Immediate (Zero-fill)
MOVK 상수 상수 삽입 (Keep) Rd[bitrange] = Immediate
LSL 비트 논리 좌시프트 Rd = Rn << shift
LSR 비트 논리 우시프트 Rd = Rn >> shift
ASR 비트 산술 우시프트 부호 유지하며 우시프트
BL 제어 함수 호출 X30에 복귀 주소 저장
BR 제어 레지스터 분기 PC = Xn
RET 제어 함수 복귀 PC = X30
NOP 제어 아무것도 안 함 -

 

자세한건 공식 문서를 참고해주세요.

 

호출 규약 ( AAPCS64 )

AAPCS64는 ARM64 공식 호출 규약입니다.

참고 문서 18P

r30 LR (Link Register) 함수 복귀 주소 저장
r29 FP (Frame Pointer) 현재 함수의 스택 프레임 기준점
r19~r28 callee-saved 레지스터 (함수 호출 시 보존해야 함)
r18 플랫폼 레지스터 TLS(Thread Local Storage) 또는 임시 용도 (플랫폼에 따라 다름)
r17 IP1 intra-procedure-call용 임시 레지스터 2 (PLT, veneer 등에서 사용됨)
r16 IP0 intra-procedure-call용 임시 레지스터 1 (PLT, veneer 등에서 사용됨)
r9~r15 일반 임시 레지스터 (caller-saved)
r8 구조체 리턴 주소 전달용 (indirect result location register)
r0~r7 함수 인자 / 리턴값 전달용 (parameter/result registers)
SP (스택 포인터) 현재 스택의 위치를 가리키는 포인터

 

 

이번에 ARM 아키텍처의 ISA 중에서 레지스터(Register)와 어셈블리 언어(Assembly Language)등에 대해 알아보았습니다.
이를 통해 ARM의 기본 구조와 명령어 처리 방식을 다시 한번 정리하고, 기초적인 개념을 복습할 수 있는 좋은 계기가 되었습니다.

읽어주셔서 감사합니다.