ABI(Application Binary Interface)

 

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에 비해 조금 더 성능을 향상시키기 위한 변경을 가했다.

 

참고

댓글 남기기