ABI(Application Binary Interface) 표준
Application간 binary 데이터를 어떻게 교환해야 하는지 다음과 같은 규칙들을 정한다.
- 데이터 타입과 정렬 방법
- 함수 호출 시 인수 및 결과에 대해 레지스터 교환 방법
- 시스템 콜 호출 방법
- 프로그램 코드의 시작과 데이터에 대한 초기화 방법
- 파일 교환 방법(ELF 등)
EABI 표준
EABI(Embeded ABI)는 임베디드 환경의 ABI를 다룬다. ARM 아키텍처에서 리눅스 버전에 따라 ABI를 사용하는 방식이 다음 두 가지로 나뉜다.
- arm/OABI
- 커널 v2.6.15 (mainline v2.6.16) 이전에 사용되던 ABI 방식(Old ABI 또는 legacy ABI라고도 불린다)
- glibc 2.3.6 까지 사용
- gcc: linux-arm-none-gnu
- arm/EABI
- 커널 v2.6.16 부터 사용되는 ARM EABI 방식
- glibc v2.3.7 및 v2.4 부터 사용
- gcc: linux-arm-none-gnueabi
arm/OABI 및 arm/EABI 차이점
소프트 인터럽트 호출방식
- OABI
- swi __NR_SYSCALL_BASE(==0x900000)+1
- EABI
- mov r7, #1 (시스템콜 인덱스)
- swi 0
구조체 패키징
- OABI
- 구조체는 4 바이트 단위로 정렬
- EABI
- 구조체 사이즈대로 사용
스택에 인수 정렬
- OABI
- 스택에 저장할 때 4 바이트 단위로 저장
- EABI
- 스택에 저장할 때 8 바이트 단위로 저장
64bit 타입 인수 정렬
- OABI
- 4 바이트 단위로 정렬
- EABI
- 8 바이트 단위로 정렬
Enum 타입 사이즈
- OABI
- 4 바이트 단위
- EABI
- 가변으로 지정할 수 있음
인수 전달 시 레지스터 수
- OABI
- 4개 (r0~r3)
- EABI
- 7개(r0~r6)
차이점 예제
소프트 인터럽트 + 64bit 타입 인수 정렬
예) long sum64(unsigned int start, size_t size); syscall no=100
- arm/OABI
- r0에 start 대입
- r1과 r2에 size를 64비트로 대입
- swi #(0x900000 + 100)
- arm/EABI
- r0에 start 대입
- r2와 r3에 size를 64비트로 대입
- r7에 100 대입
- swi 0
툴체인(toolchain)
포맷: arch[-vendor][-os]-abi
- arch
- 사용 아키텍처
- 예) arm, armeb, aarch64, aarch64_eb, mips, x86, i686…
- eb = be = Endian Big
- vendor
- 툴체인 공급자
- 예) gnu, apple, bcm2708, bcm2708hardfp, none(특정 벤더와 관련 없는)
- os
- 운영체제
- 예) linux, none(bare metal, 운영체제와 관련 없는)
- abi
- 지원하는 ABI(Application Binary Interface)
- 예) eabi, gnueabi, gbueabihf
Floating Point Unit
- FPU(Floationg Point Unit) 사용
- VFP (Coretex 시리즈 등)
- 여러 아키텍처가 FPU를 사용하지 않거나 서로 다른 FP instruction set을 사용한다.
- softfloat
- FP instruction을 만들지 않고 GCC가 컴파일타임에 라이브러리에서 함수로 준비
- hardfloat
- FP instruction을 에뮬레이션한다.
ARM Tool Chain
- arm-linux-gnueabi
- GNU에서 softfloat을 사용하는 armel 아키텍처를 위해 사용한다.
- FP(Floating Point)가 없는 arm 아키텍처에서 softfloat 방식을 사용한다.
- arm-linux-gnueabihf
- GNU에서 hard float을 사용하는 armhf 아키텍처를 위해 사용한다.
- 참고로 응용 프로그램을 컴파일 하여 구동하는 경우 hardfloat을 사용한 라이브러리도 같이 준비되어 있어야 한다.
- arm-bcm2708-linux-gnueabi
- armv7 아키텍처용 softfloat 방식 사용
- arm-bcm2708hardfp-linux-gnueabi
- armv7 아키텍처용 hardfloat 방식 사용
- 참고: linaro 툴체인을 사용하는 경우 gcc에 비해 조금 더 성능을 향상시키기 위한 변경을 가했다.
참고
- Linaro Toolchain Working Group | linaro.org
- ARM EABI port | wiki.debian.org
- Application Binary Interface for the ARM® Architecture | arm – pdf 다운로드