API、ABI區別

http://blog.csdn.net/xinghun_4/article/details/7905298php

 

應用程序二進制接口(ABI-Application Binary Interface)定義了一組在PowerPC系統軟件上編譯應用程序所須要遵循的一套規則。主要包括基本數據類型,通用寄存器的使用,參數的傳遞規則,以及堆棧的使用等等。html

ABI涵蓋了各類細節:如數據類型、大小和對齊;調用約定(控制着函數的參數如何傳送以及如何接受返回值);系統調用的編碼和一個應用如何向操做系統進行系統調用;以及在一個完整的操做系統ABI中,目標文件的二進制格式、程序庫等等。一個完整的ABI,像Intel二進制兼容標準 (iBCS)[1] ,容許支持它的操做系統上的程序不經修改在其餘支持此ABI的操做體統上運行。編程

其餘的 ABI 標準化細節包括 C++ 名稱修飾[2] ,和同一個平臺上的編譯器之間的調用約定[3],可是不包括跨平臺的兼容性。api

ABI不一樣於應用程序接口(API),API定義了源代碼和庫之間的接口,所以一樣的代碼能夠在支持這個API的任何系統中編譯,然而ABI容許編譯好的目標代碼在使用兼容ABI的系統中無需改動就能運行。 在Unix風格的操做系統中,存在不少運行在同一硬件平臺上互相相關可是不兼容的操做系統(尤爲是Intel 80386兼容系統)。有一些努力嘗試標準化ABI,以減小銷售商將程序移植到其餘系統時所需的工做。然而,直到如今尚未很成功的例子,雖然Linux標準化工做組正在爲Linux作這方面的努力。函數

API,顧名思義,是編程的接口, 換句話說也就是你編寫「應用程序」時候調用的函數之類的東西。對於內核來講,它的「應用程序」有兩種:一種是在它之上的,用戶空間的真正的應用程序,內核 給它們提供的是系統調用這種接口,好比 read(2),write(2);另外一種就是內核模塊了,它們和內核處於同一層,內核給它們提供的是導出的內核函數,好比 kmalloc(),printk()。這些接口都是你能夠在編寫程序的時候直接看到的,能夠直接拿來用的。編碼

而 ABI 是另外一種形式的接口,二進制接口。除非你直接使用匯編語言,這種接口通常是不能直接拿來用的。好比,內核系統調用用哪些寄存器或者乾脆用堆棧來傳遞參數,返回值又是經過哪一個寄存器傳遞回去,內核裏面定義的某個結構體的某個字段偏移是多少等等,這些都是二進制層面上的接口。這些接口是直接給編譯好的二 進制用的。換句話說,若是 ABI 保持穩定的話,你在以前版本上編譯好的二進制應用程序、內核模塊,徹底能夠無須從新編譯直接在新版本上運行。另外一種比較特殊的 ABI 是像 /proc,/sys 目錄下面導出的文件,它們雖然不是直接的二進制形式,但也會影響編譯出來的二進制,若是它裏面使用到它們的話,所以這些「接口」也是一種 ABI。spa

你平時看到的什麼 POSIX 標準啊,C99 標準啊,都是對 API 的規定。而規定 ABI 的標準就很少,並且也沒那麼強勢,Linux 上面的 ABI 標準彷佛只有 Linux Foundation 提供的一些標準操作系統

好了,從上面我 們能夠看出,其實保持一個穩定的 ABI 要比保持穩定的 API 要可貴多。好比,在內核中 int register_netdevice(struct net_device *dev) 這個內核函數原型基本上是不會變的,因此保持這個 API 穩定是很簡單的,但它的 ABI 就未必了,就算是這個函數定義自己沒變,即 API 沒變,而 struct net_device 的定義變了,裏面多了或者少了某一個字段,它的 ABI 就變了,你以前編譯好的二進制模塊就極可能會出錯了,必須從新編譯才行。.net

你可能會感到意外,上游的 Linux 內核其實不光不保持穩定的 ABI,它就連穩定的 API 都不會保持!並且還牛逼哄哄地寫了一個文檔,叫 stable_api_nonsense.txt。這麼作的道理是,內核一直在向前推動,並且速度很快,內核開發者們並不想由於 API 的限制而阻礙前進的腳步!畢竟咱們不想成爲下一個 Windows!:-)htm

因此,你的驅動在不一樣版本的內核上不經修改直接運行那幾乎是不太可能的,就算是你容許從新編譯也未必就能不經修改編譯成功。即便在同一個大版本的不一樣發行版上也可能不行。

那你應該怎麼辦?最好的辦法莫過於把你的驅動貢獻到社區,匯入內核源代碼樹中,這樣一旦內核的 API 有改動,改動這個 API 的人就有義務替 你修改你的驅動的代碼,你只須要 review 一下(或者這個也會有人幫你),也省去你很多時間,何樂而不爲呢?另外一種辦法就是基於某個提供穩定 ABI 的內核,好比紅帽的 RHEL (認爲這是廣告的人請使用 CentOS,謝謝!),紅帽的企業版內核保證有穩定的 ABI,只要你沒有跨大的版本,由於咱們的源代碼裏會檢測 ABI 的變化,爲此咱們實在付出了很多努力。

相關文章
相關標籤/搜索