目錄
- 一、系統調用概述
- 二、系統調用實現機制
- 四、性能優化技術
- 五、常見問題排查
- 六、安全注意事項
一、系統調用概述
-
定義
- 用戶空間訪問內核功能的唯一合法入口
- 提供硬件抽象接口,保證系統穩定和安全
-
與API區別
特性 系統調用 API 執行層級 內核態 用戶態 實現方式 軟中斷(int 0x80) 函數庫 性能開銷 較高 較低
二、系統調用實現機制
- 處理流程
用戶程序 → libc包裝函數 → 觸發軟中斷 → 查找系統調用表 → 執行內核函數 → 返回結果
2. **關鍵數據結構**
- `sys_call_table`:系統調用表(x86架構)
- `struct pt_regs`:保存用戶態寄存器上下文3. **參數傳遞**
- x86:通過寄存器(ebx, ecx, edx等)
- ARM:R0-R6寄存器
- 參數數量限制:Linux通常≤6個## 三、添加新系統調用(示例)
1. **步驟**
1. 在內核源碼`include/linux/syscalls.h`添加聲明
2. 實現函數(添加`SYSCALL_DEFINEx`宏)
3. 更新系統調用表(架構相關文件)
4. 重新編譯內核2. **示例代碼**
```c
// 聲明
SYSCALL_DEFINE2(mycall, int, arg1, char __user *, arg2);// 實現
long sys_mycall(int arg1, char __user *arg2) {printk(KERN_INFO "My syscall called!\n");return 0;
}
四、性能優化技術
-
vdso機制
- 將部分系統調用映射到用戶空間
- 典型應用:
gettimeofday()
-
快速路徑優化
- 減少上下文切換開銷
- 示例:
epoll
使用就緒列表
五、常見問題排查
-
錯誤代碼
strace -T -tt -o trace.log ./myprogram
-
性能分析工具
- perf:
perf trace -e raw_syscalls:*
- ftrace:跟蹤系統調用路徑
- perf:
六、安全注意事項
-
參數檢查原則
- 驗證用戶指針有效性(
copy_from_user()
) - 檢查權限(
capable()
函數)
- 驗證用戶指針有效性(
-
防御性編程
- 防止TOCTOU競爭條件
- 使用
__user
標記用戶空間指針

