天天看點

《Linux系統程式設計(第2版)》——1.2 API和ABI

本節書摘來自異步社群《linux系統程式設計(第2版)》一書中的第1章,第1.2節,作者:【美】robert love著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

程式員都希望自己實作的程式能夠一直運作在其聲明支援的所有系統上。他們希望能在自己的linux版本上運作的程式也能夠運作于其他linux版本,同時還可以運作在其他支援linux體系結構的更新(或更老)的linux版本上。

在系統層,有兩組獨立的影響可移植性的定義和描述。一是應用程式程式設計接口(application programming interface,api),二是應用程式二進制接口(application binary interface,abi),它們都是用來定義和描述計算機軟體的不同子產品間的接口的。

1.2.1 api

api定義了軟體子產品之間在源代碼層互動的接口。它提供一組标準的接口(通常以函數的方式)實作了如下抽象:一個軟體子產品(通常是較高層的代碼)如何調用另一個軟體子產品(通常位于較低層)。舉個例子,api可以通過一組繪制文本函數,對在螢幕上繪制文本的概念進行抽象。api僅僅是定義接口,真正提供api的軟體子產品稱為api的實作。

通常,人們把api稱為“約定”,這并不合理,至少從api這個術語角度來講,它并非一個雙向協定。api使用者(通常是進階軟體)并沒有對api及其實作提供任何貢獻。api使用者可以使用api,也可以完全不用它:用或不用,僅此而已!api的職能隻是保證如果兩個軟體子產品都遵循api,那麼它們是“源碼相容”(source compatible),也就是說,不管api如何實作,api使用者都能夠成功編譯。

api的一個實際例子就是由c标準定義的接口,通過标準c庫實作。該api定義了一組基礎函數,比如記憶體管理和字元串處理函數。

在本書中,我們會經常提到各種api,比如第3章将要讨論的标準i/o庫。1.3節給出了linux系統程式設計中最重要的api。

1.2.2 abi

api定義了源碼接口,而abi定義了兩個軟體子產品在特定體系結構上的二進制接口。它定義了應用内部如何互動,應用如何與核心互動,以及如何和庫互動。api保證了源碼相容,而abi保證了“二進制相容(binary compatibility)”,確定對于同一個abi,目标代碼可以在任何系統上正常工作,而不需要重新編譯。

abi主要關注調用約定、位元組序、寄存器使用、系統調用、連結、庫的行為以及二進制目标格式。例如,調用約定定義了函數如何調用,參數如何傳遞,分别保留和使用哪些寄存器,調用方如何擷取傳回值。

盡管曾經在不同作業系統上為特定的體系結構定義一套唯一的abi,做了很多努力,但是收效甚微。相反地,作業系統(包括linux)往往會各自定義自己獨立的abi,這些abi和體系結構緊密關聯,絕大部分abi表示了機器級概念,比如特定的寄存器或彙編指令。是以,在linux,每個計算機體系結構都定義了自己的abi。實際上,我們往往通過機器體系結構名稱來稱呼這些abi,如alpha或x86-64。是以,abi是作業系統(如linux)和體系結構(如x86-64)共同提供的功能。

系統程式設計需要有abi意識,但通常沒有必要記住它。abi并沒有提供顯式接口,而是通過工具鍊(toolchain),如編譯器、連結器等來實作。盡管如此,了解abi可以幫助你寫出更優化的代碼,而如果你的工作就是編寫彙編代碼或開發工具鍊(也屬于系統程式設計範疇),了解abi就是必需的。

abi是由核心和工具鍊定義和實作的。

繼續閱讀