Linux核心不允許用戶程式直接呼叫內部函式,必須透過系統呼叫介面。為簡化封裝工作,核心提供_syscallN巨集,並建立用戶空間封裝函式,形成完整的服務呼叫鏈路。
核心定義_syscall0至_syscall5六個巨集,數字代表參數個數(不含系統呼叫號)。每個參數需傳遞型別與名稱兩項,加上回傳值型別與名稱,共2*(n+1)個巨集參數。
write()_syscall3(int, write, int, fd, const char*, buf, unsigned int, count)
int, write:回傳值型別與名稱int, fd:參數1型別與名稱const char*, buf:參數2型別與名稱unsigned int, count:參數3型別與名稱巨集展開後產生內嵌組合語言,執行int 0x80(x86)或syscall(x86_64)陷入核心。
核心匯出的系統呼叫名稱(如sys_write)不直接供用戶呼叫。C標準庫(glibc)提供POSIX標準函式(write()),內部處理參數檢查、錯誤碼轉換(errno)、執行緒安全等,再呼叫核心系統呼叫。用戶程式如同呼叫普通函式般使用write(fd, buf, count)。
用戶程式
│
▼
glibc write() → 參數檢查、errno處理
│
▼
系統呼叫封裝 _syscall3 → 內嵌組語
│
▼
int 0x80 / syscall 指令
│
▼
核心入口 system_call() → sys_write()
│
▼
VFS → 檔案系統驅動 → 硬體
syscall/sysret指令,效率高於int 0x80。gettimeofday等高頻系統呼叫映射至用戶空間,避免上下文切換。理解此機制有助於編寫高效系統程式、除錯strace輸出、實作容器運行時與安全策略。
Linux 記憶體管理核心原理:從核心空間 (頁、區、Slab、vmalloc) 到使用者空間 (VMA、mm_struct、fork 複製) 完整圖解
Linux 防火牆啟用與連接埠管理速查:iptables / firewalld / ufw 三大工具對照
CentOS 部署 TinyProxy HTTP 代理伺服器快速指南
PXE + TFTP + DHCP 實現 Linux 網絡無人值守安裝全流程
/etc/inittab 詳解:SysVinit 運行級別與啟動腳本控制
Linux 策略路由深度解析:多路由表、規則鏈與 RPDB 核心機制