Linux中形形色色的接口API和ABI

前言

如果將內核比作一座工廠,那麼Linux中衆多的接口就是通往這個巨大工廠的高速公路。這條路要足夠堅固,禁得起各種破壞(Robust)。要能跑得了運貨的卡車,還要能升降飛機。(Compatible)。當然了這條路要越寬越好(Performant)。如下圖所標,Linux中有四種類型的接口。位於內核和用戶之間的API(應用程序接口)和ABI(應用二進制接口)。內核內部的API和ABI。下面我們逐條的來看看這些接口。

1.Linux API

內核-用戶接口有內核系統調用和GNU C Library (glibc)的包裝例程(wrap subroutines)構成。Linux API開發的目標是給POSIX標準提供一個相對兼容的,程序健壯性強的,高性能的實現,同時又實現一些Linux特有的標準。

1.1 Linux內核的系統調用接口

系統調用接口包含了內核中所有已經實現的和可使用的系統調用。

1.2 C標準庫

標準庫是對系統調用的封裝,用於給用戶提供一個簡單易用的用戶態接口。其中最爲熟知的就是GNU C Library(glibc),還有爲嵌入式和移動設備使用的uClibc。

1.3 對POSIX的補充

還有一些接口是Linux特有的,比如:

Cgroup子系統,該子系統包含cgroup系統調用和libcgroup。

Futex,epoll,dnotify,inotify,Fanotify等系統調用。

2. Linux ABI

ABI是一系列約定的集合,例如GNU/Linux,FreeBSD約定函數調用的頭六個整型參數放在寄存器RDI, RSI, RDX, RCX, R8和R9上;同時XMM0到XMM7用來放置浮點變元。對於系統調用,R10用來替代RCX。其他額外的參數推入棧,返回值保存在RAX中。[1] 可以說調用慣例(calling convention)就是ABI。因此,ABI是和具體CPU架構和OS相關的。

具體而言,ABI包含以下內容:[3]

1. 一個特定的處理器指令集

2. 函數調用慣例

3. 系統調用方式

4. 可執行文件的格式(ELF,PE)

那麼,究竟我們爲什麼要糾結於ABI這個概念呢?答案是爲了兼容,只要OS遵守相同的ABI規範,那麼不同的應用就可以實現向前兼容,再也不用擔心版本升級後,舊版本的應用不能運行了。

3. In-kernel API

內核API主要是內核中標記爲 “EXPORT_SYMBOL”的函數。這些函數主要是爲了內核模塊的編寫而提供的。收到內核版本迭代的影響,內核API並不穩定。2.x版本內核的模塊可能在3.x版本上就無法使用。

4. In-Kernel ABI

內核的abi和linux abi的定義類似,再次不再贅述。

5. Abstraction ABI

在某些情況下,內核過於底層,開發者需要更高一層的抽象。於是出現了類似Mesa 3D的爲圖形驅動開發而生的API。

參考

[1]

https://en.wikipedia.org/wiki/Linux_kernel_interfaces

所有圖的來源

[2]

https://abi-laboratory.pro/index.php?view=abi-view

[3] https://en.wikipedia.org/wiki/Application_binary_interface

abi的wiki

[4] https://zh.wikipedia.org/wiki/X86%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A

x86調用慣例的中文wiki

[5]

http://laoar.net/blogs/316/

討論什麼是ABI

[6] https://elixir.bootlin.com/linux/latest/source/kernel/sched/wait.c

內核API

[7]

https://stackoverflow.com/questions/2171177/what-is-an-application-binary-interface-abi

討論什麼是ABI

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章