응용 프로그램 이진 인터페이스

커널 내 및 커널-사용자 공간 API와 ABI의 고급 비교
리눅스 커널GNU C 라이브러리리눅스 API를 정의한다. 컴파일 후, 이진 파일은 ABI를 제공한다. 이 ABI를 오랫동안 안정적으로 유지하는 것은 ISV에게 중요하다.

응용 프로그램 이진 인터페이스(application binary interface, ABI)는 소프트웨어가 노출하는 인터페이스로, 프로세스기계어 접근을 위해 정의된다. 노출되는 소프트웨어는 라이브러리이고, 소비 주체는 프로그램이다.

ABI는 상대적으로 낮은 추상화 수준에 있다. 인터페이스 호환성은 대상 하드웨어소프트웨어 빌드 툴체인에 따라 달라진다. 반면, 응용 프로그래밍 인터페이스(API)는 상대적으로 높은 수준의 하드웨어 독립적이고 인간이 읽을 수 있는 형식소스 코드로의 접근을 정의한다. API는 컴파일 전 소스 코드 수준에서 인터페이스를 정의하지만, ABI는 컴파일된 코드에 대한 인터페이스를 정의한다.

API 호환성은 일반적으로 시스템 설계 및 툴체인의 관심사이다. 그러나 프로그래머는 여러 언어로 프로그램을 작성하거나 동일한 언어에 대해 여러 컴파일러를 사용할 때 ABI를 직접 다루어야 할 수 있다.

완전한 ABI는 ABI를 지원하는 프로그램이 해당 ABI를 제공하는 여러 운영 체제에서 수정 없이 실행될 수 있도록 한다. 대상 시스템은 필요한 라이브러리(ABI를 구현하는)를 제공해야 하며, 다른 전제 조건이 있을 수 있다.

설명

ABI가 다루는 인터페이스 측면은 다음과 같다.

  • 프로세서 명령어 집합, 레지스터 파일 구조, 메모리 접근 유형 등의 세부 사항
  • 프로세서가 직접 접근할 수 있는 기본 자료형의 크기, 레이아웃 및 데이터 구조 정렬
  • 호출 규약, 함수의 인수가 전달되는 방식과 반환 값이 검색되는 방식을 제어한다. 예를 들어 다음을 제어한다.
    • 콜 스택이 어떻게 구성되는지
    • 모든 매개변수가 콜 스택에 전달되는지, 아니면 일부가 레지스터에 전달되는지
    • 어떤 레지스터가 어떤 함수 매개변수에 사용되는지
    • 콜 스택에 전달된 첫 번째 함수 매개변수가 먼저 푸시되는지 마지막으로 푸시되는지
    • 함수 호출 후 콜 스택을 정리하는 책임이 호출자에게 있는지 피호출자에게 있는지
  • 네임 맹글링[1]
  • 예외 전파[2]
  • 응용 프로그램이 운영 체제에 시스템 호출을 하는 방식, 그리고 ABI가 시스템 호출 스텁에 대한 프로시저 호출 대신 직접 시스템 호출을 지정하는 경우 시스템 호출 번호
  • 완전한 운영 체제 ABI의 경우, 목적 파일, 프로그램 라이브러리 등의 이진 형식

ABI에는 인텔 이진 호환성 표준(iBCS)[3] 및 다양한 명령어 세트에 대한 System V Release 4 ABI가 포함된다.

임베디드 ABI

임베디드 ABI (EABI)는 임베디드 운영체제에서 사용되며, 파일 형식, 자료형, 레지스터 사용법, 스택 프레임 구성, 임베디드 소프트웨어 프로그램의 함수 매개변수 전달과 같은 측면을 지정한다.

EABI를 지원하는 각 컴파일러 및 어셈블러는 다른 컴파일러 및 어셈블러가 생성한 코드와 호환되는 목적 파일을 생성한다. 이를 통해 개발자는 한 컴파일러가 생성한 라이브러리를 다른 컴파일러가 생성한 목적 파일과 링크할 수 있다.

일반적으로 EABI는 대상 임베디드 시스템의 제한된 리소스에 대해 성능에 최적화되어 있다. 따라서 EABI는 일반적으로 데스크톱 운영 체제에서 볼 수 있는 커널과 사용자 공간 사이의 추상화를 생략할 수 있다. 예를 들어, 더 작은 실행 파일과 더 빠른 로딩을 위해 동적 링킹을 피할 수 있고, 고정된 레지스터 사용은 더 작은 스택과 커널 호출을 허용하며, 특권 모드에서 응용 프로그램을 실행하면 장치 드라이버 호출의 간접 없이 사용자 지정 하드웨어 작업에 직접 접근할 수 있다.[4] EABI의 선택은 성능에 영향을 미칠 수 있다.[5][6]

널리 사용되는 EABI에는 파워PC,[4] ARM,[7]MIPS EABI가 포함된다.[8] C 라이브러리와 같은 특정 소프트웨어 구현은 더 구체적인 ABI를 형성하기 위해 추가적인 제한을 부과할 수 있다. 한 가지 예는 ARM용 GNU OABI 및 EABI인데, 둘 다 ARM EABI의 하위 집합이다.[9]

같이 보기

각주

  1. “Itanium C++ ABI”.  (compatible with multiple architectures)
  2. “Itanium C++ ABI: Exception Handling”.  (compatible with multiple architectures)
  3. “Intel Binary Compatibility Standard (iBCS)”. 
  4. 〈EABI Summary〉. 《PowerPC Embedded Application Binary Interface: 32-Bit Implementation》 (PDF) Version 1.0판. Freescale Semiconductor, Inc. 1995년 10월 1일. 28–30쪽. 
  5. “Debian ARM accelerates via EABI port”. Linuxdevices.com. 2016년 10월 16일. 2007년 1월 21일에 원본 문서에서 보존된 문서. 2007년 10월 11일에 확인함. 
  6. Andrés Calderón and Nelson Castillo (2007년 3월 14일). “Why ARM's EABI matters”. Linuxdevices.com. 2007년 3월 31일에 원본 문서에서 보존된 문서. 2007년 10월 11일에 확인함. 
  7. “ABI for the Arm Architecture”. Developer.arm.com. 2020년 2월 4일에 확인함. 
  8. Eric Christopher (2003년 6월 11일). “mips eabi documentation”. 《binutils@sources.redhat.com》 (메일링 리스트). 2020년 6월 19일에 확인함. 
  9. “ArmEabiPort”. 《Debian Wiki》. Strictly speaking, both the old and new ARM ABIs are subsets of the ARM EABI specification, but in everyday usage the term "EABI" is used to mean the new one described here and "OABI" or "old-ABI" to mean the old one. 

외부 링크

Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9

Portal di Ensiklopedia Dunia

Kembali kehalaman sebelumnya