Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

9365
557
421924


[Arm프로세서] AAPCS: Armv8: 브랜치와 복귀 명령어 - bl Armv8: 함수 호출 규약

Arm 스팩 문서를 보면서 BL 명령어에 대해 알아봅시다.

C6.2.33 BL
Branch with Link branches to a PC-relative offset, setting the register X30 to PC+4. It provides a hint that this is a subroutine call.
[출처] DDI0487Fc_armv8_arm.pdf

위 스팩의 내용을 조금 이해하기 어려운데, 쉽게 다음과 같이 정리할 수 있습니다.

   * PC와 관련된 오프셋으로 지정된 주소로 브랜치
   * 브랜치를 하고 복귀할 주소를 X30 레지스터에 설정

위 내용을 읽으면 어떤 동작인지 파악하기 어려운데요. 이해를 돕기 위해 bl 명령어가 있는 예시 코드를 분석하겠습니다.

01  0x1004 some_routine:  stp x29, x30, [sp, #-0x10]! 
02  0x1008                 ; // code
03  0x100c                 bl 0x2000 <sub_routine>
04  0x1010                 ; // code
05  0x1014                 ldp x29, x30, [sp], #0x10
06  0x1018                 ret

위 코드에서 03번째 줄을 실행하면 sub_routine 함수의 주소인 0x2000로 분기합니다.
이 때 Arm 코어는 X30 레지스터에 0x1010 주소를 업데이트합니다. 0x1010는 sub_routine 함수를 호출하고 난 다음에 복귀할 주소이며, X30은 Armv8 아키텍처에서 링크 레지스터이기 때문입니다.

Arm 스팩 문서에서 BL 명령어에 대한 설명을 읽으면 바로 이해하기 어려운데, 세부 원리를 알아보면 Armv7 아키텍처의 BL 명령어가 동작하는 원리와 거의 유사합니다. Armv7 아키텍처에서는 'bl [주소]' 형식의 명령어를 실행하면 복귀할 주소를 링크 레지스터인 R14에 업데이트하는데, Armv8 아키텍처에서는 링크 레지스터인 X30에 복귀할 주소를 저장합니다. 복귀할 주소가 저장되는 레지스터의 종류만 다르지 동작 원리는 같습니다.

Armv8 아키텍처: AAPCS(함수호출 규약)

   ❑ 스택과 관련된 명령어 
      * stp 명령어  
      * sub 명령어  
      * ldp 명령어  
   ❑ 브랜치와 복귀 명령어
      * bl 명령어  
      * RET 명령어
AAPCS와 C 코드 최적화


Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자




핑백

덧글

댓글 입력 영역