系統呼叫是從使用者態與 Linux 核心互動的唯一方式嗎?
是否有任何其他介面,例如 /proc 文件系統?
Linux 核心系統呼叫 API 是主要的 API(雖然隱藏在 libc 下,並且很少被程序員直接使用),並且大多數標準 IPC 機制都嚴重偏向於一切都是文件方法,這在此處消除了它們,因為它們最終需要讀取/寫(和更多)電話。
但是,在大多數平台上(如果您排除所有系統呼叫以使您到達那裡),有一種方法:VDSO。這是一種機制,核心將一個(或多個)稍微神奇的頁面映射到每個程序(通常以 ELF .so 的形式)。您可以使用 或 將其視為或
linux-vdso.so
類似。這實際上是核心和使用者程序之間的記憶體映射 IPC(儘管在其目前實現中是單向的)。ldd``/proc/PID/maps
它通常用於加速系統呼叫,最初是
linux-gate.so
為了解決 x86 性能問題而實現的 ( ),但它也可能包含核心數據和訪問函式。呼叫喜歡getcpu()
並且gettimeofday()
可能使用這些而不是進行實際的系統呼叫和核心上下文切換。這些優化呼叫的可用性由 glibc 啟動程式碼檢測和啟用(取決於平台可用性)。目前的實現包含一個(只讀)共享核心變數頁面,稱為“VVAR”頁面,可以直接讀取。您可以通過檢查 的輸出來檢查這一點,
strace -e trace=clock_gettime date
以查看您的date
命令是否進行任何clock_gettime()
系統呼叫,而使用正常工作的 VDSO 則不會(時間將由 VDSO 頁面中的函式從 VVARS 頁面讀取,請參閱 參考資料arch/x86/vdso/vclock_gettime.c
)。這裡有一個有用的技術總結:http: //blog.tinola.com/ ?e=5一個更詳細的教程:http ://www.linuxjournal.com/content/creating-vdso-colonels-other-chicken和手冊頁: http: //man7.org/linux/man-pages/man7/vdso.7.html