今天我們來看看Linux中形形色色的介面
如果將核心比作一座工廠,那麼Linux中眾多的介面就是通往這個巨大工廠的高速公路。這條路要足夠堅固,禁得起各種破壞(Robust)。要能跑得了運貨的卡車,還要能升降飛機。(Compatible)。當然了這條路要越寬越好(Performant)。如下圖所標,Linux中有四種型別的介面。位於內核和使用者之間的API(應用程式介面)和ABI(應用二進位制介面)。核心內部的API和ABI。下麵我們逐條的來看看這些介面。
核心-使用者介面有核心系統呼叫和GNU C Library (glibc)的包裝例程(wrap subroutines)構成。Linux API開發的標的是給POSIX標準提供一個相對相容的,程式健壯性強的,高效能的實現,同時又實現一些Linux特有的標準。
1.1 Linux內核的系統呼叫介面
系統呼叫介面包含了核心中所有已經實現的和可使用的系統呼叫。
標準庫是對系統呼叫的封裝,用於給使用者提供一個簡單易用的使用者態介面。其中最為熟知的就是GNU C Library(glibc),還有為嵌入式和移動裝置使用的uClibc。
1.3對POSIX的補充
還有一些介面是Linux特有的,比如:
Cgroup子系統,該子系統包含cgroup系統呼叫和libcgroup。
Futex,epoll,dnotify,inotify,Fanotify等系統呼叫。
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規範,那麼不同的應用就可以實現向前相容,再也不用擔心版本升級後,舊版本的應用不能運行了。
核心API主要是核心中標記為 “EXPORT_SYMBOL”的函式。這些函式主要是為了核心模組的編寫而提供的。收到核心版本迭代的影響,核心API並不穩定。2.x版本內核的模組可能在3.x版本上就無法使用。
內核的abi和linux 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