因為有些行為是很危險的,
所以 C 以提供 C library 的方式來讓寫程式的人可以做到一些較高權限的事情
不過也並非所有的 library 內容都是為了提供 system call
步驟一為,一個程式執行到了 wrapper function
( C library 中,會需要執行 system call 的 funciton )
在 wrapper 傳遞到 system call 之前,必須要把資料給放到特定的 register 裡
以 x86-32 為例,wrapper function 先把 register %eax
放入 system call 的編號,這樣真的要執行 system call
的時候就知道要用哪一個 system call 了
trap
instructiontrap
是一個 x86-32 的 instruction,執行完這個 instruction 後
就會開始真的執行 system call 的內容了
a) 把 register 存放到 kernel stack 中(跟一般的 function 對待 callee-saved register 一樣)
b) 檢查 system call 的編號(先前被 wrapper function 放在 %eax
中)
c) 根據 system call 的編號,執行相對應的行為
d) 復元 register 的值,對應於步驟 a)
e) return 回 wrapper function
如果執行的過程有出錯, wrapper function 會把 global variable errno
set 好,
wrapper function return 回去
The Linux Programming Interface: A Linux and UNIX System Programming Handbook