ABI (Application binary interface)
在電腦軟件中,一個應用二進制接口 (ABI
) 是兩個二進制程序模組之間的接口。通常,模組中的一個是庫或操作系統服務,另一個為用戶運行的程序。
一個 ABI
定義了數據接口或計算機程序是如何在機器碼中被訪問到的,這里說的機器碼是一個底層、依賴於硬件的格式。而 API
則正好相反,它定義了源碼形式的訪問,這種方式是相對上層、獨立於硬件,且通常是可讀性較高的格式。ABI
的一個方面是調用規范,它確定了數據是如何作為輸入提供給計算程序,或如何作為輸出從計算程序中輸出出來的。
與 ABI
關系緊密的通常是編譯器、操作系統或庫作者。一個應用程序員在寫混雜多種編程語言的程序時或在使用不同編譯器編譯同一語言寫的程序時,通常需要直接處理 ABI
,
描述
ABI
涉及的內容包括:
- 處理器指令集,像是寄存器文件結構體、棧組織、內存訪問類型等
- 處理器可以直接訪問的基礎數據類型的長度、布局與對齊方式
- 調用規范控制着函數的參數是如何進行傳遞的,返回值是如何返回的,比如它控制着下面的行為:
- 是否將所有的參數傳遞給棧,還是部分參數通過寄存器進行傳遞
- 哪個函數參數使用哪個寄存器
- 傳遞給棧的第一個函數參數是第一個入棧還是最后一個入棧
- 一個應用應該如何通過系統調用訪問到操作系統,是否
ABI
直接指定了系統調用,而不是訪問系統調用的偽替 (自造詞,原詞 stub),系統調用號 - 在完整的操作系統中的
ABI
,目標文件、程序庫的二進制格式等
完備 ABI
一個完備的 ABI
,比如 Intel Binary Compatibility Standard (iBCS)
,允許一個支持該操作系統 ABI
的程序,不做任何修改直接在另一個相同的系統 (提供必要的共享庫,並滿必要的預置條件) 上運行。
嵌入式 ABI
一個嵌入式應用二進制接口 (EABI:
Embedded-application binary interface) 指定了文件格式、數據類型、寄存器使用、棧組織以及函數參數傳遞等內容的標准規范。
支持 EABI
的編譯器創建的目標碼,兼容其他這種編譯器生成的目標碼。允許開發者將一個編譯器生成的目標碼,鏈接到另一個編譯器生成的庫。
EABI
設計來在嵌入式系統有限的資源上優化它的性能。因此 EABI
忽略大部分的內核與用戶代碼之間的抽象層概念。比如,可能會被避免動態鏈接,以允許更小的執行與更快的加載速度,固定的寄存器使用以允許更加緊湊的棧與內核調用,且將應用運行在特權模式下允許直接訪問到定制化硬件操作,而不需要間接調用設備驅動。對 EABI
的選擇,會影響性能。
被大家廣泛使用的 EABI
包括 PowerPC
、Arm EABI
、MIPS EABI
。特定的軟件,比如 C
庫的實現,可能會增加額外的限制,以實現更加緊湊的 ABI
,比如 GNU OABI
以及 EABI for ARM
都是 ARM EABI
的一個子集。