應用二進制介面

在軟件開發中,應用二進制介面(英語:application binary interface,縮寫為ABI)是指兩程式模組間的介面;通常其中一個程式模組會是函式庫或作業系統所提供的服務,而另一邊的模組則是用戶所執行的程式。

一個ABI定義了機械碼如何存取資料結構與運算程式,此處所定義的介面相當低階並且相依於硬件。而類似概念的API則在原始碼定義這些,則較為高階,並不直接相依於硬件,通常會是人類可閱讀的程式碼。一個ABI常見的樣貌即是調用約定:資料怎麼成為計算程式的輸入或者從中得到輸出;x86的調用約定即是一個ABI的例子。

決定要不要採取既定的ABI(不論是否由官方提供),通常由編譯器,作業系統或函式庫的開發者來決定;然而,如果撰寫一個混和多個程式語言的應用程式,就必須直接處理ABI,採用外部函數呼叫英語Foreign function interface來達成此目的。

描述

ABI涵蓋了各種細節,如:

  • 資料類型的大小、佈局和對齊;
  • 呼叫約定(控制着函數的參數如何傳送以及如何接受返回值),例如,是所有的參數都通過棧傳遞,還是部分參數通過暫存器傳遞;哪個暫存器用於哪個函數參數;通過棧傳遞的第一個函數參數是最先push到棧上還是最後;
  • 系統呼叫的編碼和一個應用如何向作業系統進行系統呼叫;
  • 以及在一個完整的作業系統ABI中,目的檔的二進制格式、程式庫等等。

一個完整的ABI,像Intel二進制相容標準英語Intel Binary Compatibility Standard(iBCS)[1],允許支援它的作業系統上的程式不經修改在其他支持此ABI的作業系統上執行。

其他的ABI標準化了一些細節,包括C++名字修飾[2] ,和同一個平台上的編譯器之間的呼叫約定[3],但是不包括跨平台的相容性。

ABI不同於應用程式介面(API),API定義了原始碼和庫之間的介面,因此同樣的代碼可以在支援這個API的任何系統中編譯,然而ABI允許編譯好的目的碼在使用相容ABI的系統中無需改動就能執行。 在Unix風格的作業系統中,存在很多執行在同一硬件平台上互相相關但是不相容的作業系統(尤其是Intel 80386相容系統)。有一些努力嘗試標準化ABI,以減少銷售商將程式移植到其他系統時所需的工作。然而,直到現在還沒有很成功的例子,雖然Linux標準化工作群組正在為Linux做這方面的努力。

EABI

嵌入式應用二進制介面指定了檔案格式、資料類型、暫存器使用、堆積組織最佳化和在一個嵌入式軟件中的參數的標準約定。開發者使用自己的匯編語言也可以使用EABI作為與相容的編譯器生成的匯編語言的介面。 支援EABI的編譯器建立的目的檔可以和使用類似編譯器產生的代碼相容,這樣允許開發者連結一個由不同編譯器產生的庫。EABI與關於通用電腦的ABI的主要區別是應用程式代碼中允許使用特權指令,不需要動態連結(有時是禁止的),和更緊湊的堆疊幀組織用來節省主記憶體。[4] 廣泛使用EABI的有Power PC[5]ARM.[6][7]

參見

參考資料

  1. ^ Intel Binary Compatibility Standard (iBCS). [2011-01-19]. (原始內容存檔於2012-05-27). 
  2. ^ Itanium C++ ABI 互聯網檔案館存檔,存檔日期2008-11-19. (compatible with multiple architectures)
  3. ^ Itanium C++ ABI: Exception Handling 互聯網檔案館存檔,存檔日期2008-05-11. (compatible with multiple architectures)
  4. ^ EABI Summary. PowerPC Embedded Application Binary Interface: 32-Bit Implementation (PDF) Version 1.0. Freescale Semiconductor, Inc. 1995-10-01: 28–30 [2011-01-19]. (原始內容存檔 (PDF)於2012-03-16). 
  5. ^ "PowerPC Embedded Processors Application Note"[永久失效連結]
  6. ^ Debian ARM accelerates via EABI port. Linuxdevices.com. 2007-01-19 [2007-10-11]. (原始內容存檔於2012-07-14). 
  7. ^ Andrés Calderón and Nelson Castillo. Why ARM's EABI matters. Linuxdevices.com. 2007-03-14 [2007-10-11]. (原始內容存檔於2012-07-14). 

外部連結