1、比如我在PC上用不管什么樣的COMPILER, 只要產(chǎn)生符合LINUX的ELF文件, 用相應的INSTRUCTION SET(比如INTEL, PPC, SPARC). 就可以在一個LINUX機器上運行. 調(diào)用系統(tǒng)或別人的LIB.ABI定義了BINARY的文件格式, 內(nèi)容, 以及裝載/卸載程序的要求, 函數(shù)調(diào)用的參數(shù)傳遞規(guī)則, 寄存器, 堆棧的使用等. abi(應用二進制接口)我的理解就是機器代碼一層的接口。
2、先說一下api(特指系統(tǒng)調(diào)用),api基本上是和機器硬件平臺無關但是和操作系統(tǒng)密切相關的接口,一個api調(diào)用定義了一個對內(nèi)核的操作,以及操作的參數(shù)。
3、C語言會議函數(shù)的形式調(diào)用api。
【資料圖】
4、abi,是比api更貼近硬件的一層接口,它規(guī)定的是二進制代碼之間的調(diào)用規(guī)則。
5、舉個例子來說吧!一個應用程序,調(diào)用了.so庫中的函數(shù)或者系統(tǒng)調(diào)用,如果它的編譯器可以找到被調(diào)用函數(shù)或者系統(tǒng)調(diào)用的話,則編譯可以同過,也就是說,它是用的api是正確的。
6、但是,這個調(diào)用離成功還很遠。
7、 首先,如果編譯出來的代碼和運行庫函數(shù)和系統(tǒng)調(diào)用的代碼不是一個硬件平臺的,則這個應用根本就不能和被調(diào)用代碼運行在一起,則調(diào)用不會成功。
8、即使庫函數(shù)、系統(tǒng)調(diào)用和是運行在同一硬件平臺上的調(diào)用也不一定會趁成功。
9、因為程序最終是被編譯成二進制代碼的,并且是要加載到內(nèi)存中運行的。
10、那么,在調(diào)用庫函數(shù)或者系統(tǒng)調(diào)用的時候,應用要先要以庫函數(shù)或者系統(tǒng)調(diào)用指定的方式和位置(內(nèi)存或者寄存器)設置參數(shù),然后通過中斷或者其他方式跳轉(zhuǎn)到被調(diào)用代碼的起始處進行執(zhí)行,被調(diào)用代碼從指定位置去到參數(shù),處理完畢之后再將結果放到指定的位置,最后應用再到指定的地方取回結果,調(diào)用完畢!我認為這個過程中,存放參數(shù)和結果的位置屬于abi規(guī)定的范圍,被調(diào)用程序的跳轉(zhuǎn)地址或者中斷號碼也是abi規(guī)定的范圍。
11、如果存取參數(shù)、結果的位置沒有明確的規(guī)范,或者調(diào)用、被調(diào)用雙方?jīng)]有遵照統(tǒng)一個規(guī)范,那么這個調(diào)用能夠根本就不可能成功;如果系統(tǒng)提供的庫函數(shù)路徑不正確,調(diào)用也不會成功;如果中斷代碼使用錯誤,調(diào)用也不會正確。
本文到此分享完畢,希望對大家有所幫助。