API : Application programming interface
換句話說也就是你編寫“應(yīng)用程序”時候調(diào)用的函數(shù)之類的東西中跌。對于內(nèi)核來說,它的“應(yīng)用程序”有兩種:一種是在它之上的埂伦,用戶空間的真正的應(yīng)用程序,內(nèi)核給它們提供的是系統(tǒng)調(diào)用這種接口思恐,比如 read(2)沾谜,write(2);另一種就是內(nèi)核模塊了胀莹,它們和內(nèi)核處于同一層基跑,內(nèi)核給它們提供的是導(dǎo)出的內(nèi)核函數(shù),比如 kmalloc()嗜逻,printk()涩僻。這些接口都是你可以在編寫程序的時候直接看到的缭召,可以直接拿來用的栈顷。
ABI:Application binary interface
除非你直接使用匯編語言,這種接口一般是不能直接拿來用的嵌巷。比如萄凤,內(nèi)核系統(tǒng)調(diào)用用哪些寄存器或者干脆用堆棧來傳遞參數(shù),返回值又是通過哪個寄存器傳遞回去搪哪,內(nèi)核里面定義的某個結(jié)構(gòu)體的某個字段偏移是多少等等靡努,這些都是二進(jìn)制層面上的接口。這些接口是直接給編譯好的二進(jìn)制用的。換句話說惑朦,如果 ABI 保持穩(wěn)定的話兽泄,你在之前版本上編譯好的二進(jìn)制應(yīng)用程序、內(nèi)核模塊漾月,完全可以無須重新編譯直接在新版本上運(yùn)行病梢。另一種比較特殊的 ABI 是像 /proc,/sys 目錄下面導(dǎo)出的文件梁肿,它們雖然不是直接的二進(jìn)制形式蜓陌,但也會影響編譯出來的二進(jìn)制,如果它里面使用到它們的話吩蔑,因此這些“接口”也是一種 ABI钮热。
你平時看到的什么 POSIX 標(biāo)準(zhǔn)啊,C99 標(biāo)準(zhǔn)啊烛芬,都是對 API 的規(guī)定隧期。而規(guī)定 ABI 的標(biāo)準(zhǔn)就不多,而且也沒那么強(qiáng)勢赘娄,Linux 上面的 ABI 標(biāo)準(zhǔn)似乎只有 Linux Foundation 提供的一些標(biāo)準(zhǔn)厌秒。