如果將內(nèi)核比作一座工廠,那么Linux中眾多的接口就是通往這個(gè)巨大工廠的高速公路。這條路要足夠堅(jiān)固,禁得起各種破壞(Robust)。要能跑得了運(yùn)貨的卡車,還要能升降飛機(jī)。(Compatible)。當(dāng)然了這條路要越寬越好(Performant)。如下圖所標(biāo),Linux中有四種類型的接口。位于內(nèi)核和用戶之間的API(應(yīng)用程序接口)和ABI(應(yīng)用二進(jìn)制接口)。內(nèi)核內(nèi)部的API和ABI。下面我們逐條的來(lái)看看這些接口。
1.Linux API
內(nèi)核-用戶接口有內(nèi)核系統(tǒng)調(diào)用和GNU C Library (glibc)的包裝例程(wrap subroutines)構(gòu)成。Linux API開(kāi)發(fā)的目標(biāo)是給POSIX標(biāo)準(zhǔn)提供一個(gè)相對(duì)兼容的,程序健壯性強(qiáng)的,高性能的實(shí)現(xiàn),同時(shí)又實(shí)現(xiàn)一些Linux特有的標(biāo)準(zhǔn)。
1.1 Linux內(nèi)核的系統(tǒng)調(diào)用接口
系統(tǒng)調(diào)用接口包含了內(nèi)核中所有已經(jīng)實(shí)現(xiàn)的和可使用的系統(tǒng)調(diào)用。
1.2 C標(biāo)準(zhǔn)庫(kù)
標(biāo)準(zhǔn)庫(kù)是對(duì)系統(tǒng)調(diào)用的封裝,用于給用戶提供一個(gè)簡(jiǎn)單易用的用戶態(tài)接口。其中最為熟知的就是GNU C Library(glibc),還有為嵌入式和移動(dòng)設(shè)備使用的uClibc。
1.3對(duì)POSIX的補(bǔ)充
還有一些接口是Linux特有的,比如:
Cgroup子系統(tǒng),該子系統(tǒng)包含cgroup系統(tǒng)調(diào)用和libcgroup。
Futex,epoll,dnotify,inotify,Fanotify等系統(tǒng)調(diào)用。
2. Linux ABI
ABI是一系列約定的集合,例如GNU/Linux,F(xiàn)reeBSD約定函數(shù)調(diào)用的頭六個(gè)整型參數(shù)放在寄存器RDI, RSI, RDX, RCX, R8和R9上;同時(shí)XMM0到XMM7用來(lái)放置浮點(diǎn)變?cè)?duì)于系統(tǒng)調(diào)用,R10用來(lái)替代RCX。其他額外的參數(shù)推入棧,返回值保存在RAX中。[1] 可以說(shuō)調(diào)用慣例(calling convention)就是ABI。因此,ABI是和具體CPU架構(gòu)和OS相關(guān)的。
具體而言,ABI包含以下內(nèi)容:[3]
1. 一個(gè)特定的處理器指令集
2. 函數(shù)調(diào)用慣例
3. 系統(tǒng)調(diào)用方式
4. 可執(zhí)行文件的格式(ELF,PE)
那么,究竟我們?yōu)槭裁匆m結(jié)于ABI這個(gè)概念呢?答案是為了兼容,只要OS遵守相同的ABI規(guī)范,那么不同的應(yīng)用就可以實(shí)現(xiàn)向前兼容,再也不用擔(dān)心版本升級(jí)后,舊版本的應(yīng)用不能運(yùn)行了。
3. In-kernel API
內(nèi)核API主要是內(nèi)核中標(biāo)記為 “EXPORT_SYMBOL”的函數(shù)。這些函數(shù)主要是為了內(nèi)核模塊的編寫而提供的。收到內(nèi)核版本迭代的影響,內(nèi)核API并不穩(wěn)定。2.x版本內(nèi)核的模塊可能在3.x版本上就無(wú)法使用。
4. In-Kernel ABI
內(nèi)核的abi和linux abi的定義類似,再次不再贅述。
5. Abstraction ABI
在某些情況下,內(nèi)核過(guò)于底層,開(kāi)發(fā)者需要更高一層的抽象。于是出現(xiàn)了類似Mesa 3D的為圖形驅(qū)動(dòng)開(kāi)發(fā)而生的API。
-
Linux
+關(guān)注
關(guān)注
87文章
11227瀏覽量
208924 -
API
+關(guān)注
關(guān)注
2文章
1485瀏覽量
61814
原文標(biāo)題:黃東升: Linux中形形色色的接口API和ABI
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論