리버싱/ARM

ABI의 레지스터 사용 규칙

cyanhe_wh 2021. 2. 15. 19:18
반응형

아키텍처마다 바이너리들이 상호 동작하기 위한 규칙이 존재한다.

이를 ABI(Application Binary Interface)라고 하는데, ARM도 ABI가 존재한다.

C/C++ 같은 프로그래밍 언어나 리눅스의 추가 규칙들이 더해진다.

ABI 중에서 함수 호출을 다루는 AAPCS64(Procedure Call Standard for the ARM 64-bit Architecture)는 어셈블리(assembly)와 C함수 사이의 인터페이스, C 함수 호출 등에 관한 내용을 다룬다.

코드를 분석하거나 효율적인 코드를 작성하는데 도움이된다.

 

AAPCS64의 레지스터 사용

64비트 정수 레지스터의 제공으로 프로그래밍 언어에서 사용 가능한 변수의 폭이 다양해졌다.

32비트 데이터 모델인 ILP32와 함께 64비트 리눅스의 기본 데이터 모델인 LP64도 지원한다.

 

파라미터 레지스터 (X0 ~ X7)

함수 호출 시 파라미터는 최대 8개까지 레지스터(X0 ~ X7)를 통해 전달한다.

aarch32파라미터를 4개까지 레지스터를 통해 저장하고, 초과하는 파라미터는 스택을 통해 전달한다.

레지스터만 사용하여 파라미터를 전달한다면, 외부 메모리에 위치한 스택 접근이 줄어드는 효과가 있다.

X0는 함수의 결과를 리턴하는 용도로도 사용한다.

 

호출자 저장 임시 레지스터 (X9 ~ X15)

X9 ~ X15 레지스터가 보존되어야 하는 경우, 호출자가 이 레지스터들을 자신의 스택 프레임에 저장해야 한다.

호출된 함수는 리턴 시 이 레지스터가 호출 전 상태로 유지되도록 보장할 필요가 없다.

 

피호출자 저장 레지스터 (X19 ~ X29)

X19 ~ X29 레지스터는 호출된 함수가 복원을 담당해야 한다.

커널의 cpu_switch_to 함수나 __cpu_suspend_enter 함수를 보면 호출된 함수가 메모리에 저장하는 것을 볼 수 있다.

 

특수 목적 레지스터 (X8, X16 ~ X18, X29, X30)

X8은 간접 결과 레지스터로, 주소 위치를 전달하는 데 사용한다.

 

X16 및 X17은 인트라 프로시저 레지스터(IP0, IP1)로 사용한다.

veneer 등에서 서브루틴 호출 사이의 중간 값을 위한 임시 레지스터로 사용되며, 함수에 의해 수정될 수 있다.

veneer는 분기 타깃이 분기 인스트럭션의 범위 밖에 있을 때 링커가 자동으로 삽입하는 코드다.

 

X18은 플랫폼 ABI용으로 사용한다.

X29는 프레임 포인터 레지스터(FP)로 사용한다.

X30은 링커 레지스터(LR)로 사용한다.

 

반응형

'리버싱 > ARM' 카테고리의 다른 글

aarch64 익셉션 핸들링  (0) 2021.02.15
시스템 레지스터  (0) 2021.02.09
aarch64 특수 목적 레지스터  (0) 2021.02.09
프로세서 상태 레지스터(PSTATE)  (0) 2021.02.09
ARMv8 레지스터  (0) 2021.02.09