定义
- 操作系统提供给应用程序的编程接口
- 用户态程序请求内核服务的唯一方式
与用户级函数调用的区别
| 维度 | 系统调用 | 普通函数调用 |
|---|---|---|
| 运行状态 | 用户态→核心态切换 | 仅在用户态执行 |
| 实现机制 | 需 trap 指令(中断与异常) | 普通 call/jmp 指令 |
| 执行特权 | 可执行特权指令(访问硬件) | 只能执行普通指令 |
| 返回机制 | 涉及现场恢复和重新调度 | 简单返回 |
分类
- 进程控制(fork、exit、wait)
- 文件操作(创建、打开、读、写、关闭、删除)
- 设备管理
- 信息维护
- 通信(pipe、shmget、socket)
系统调用编号分发机制
- 每个系统调用有唯一系统调用号
- 用户程序将系统调用号存入特定寄存器
- 进入内核后,内核根据系统调用号查系统调用表(sys_call_table),跳转到对应处理函数
- 不同 OS 的系统调用表不同 → 安装包不通用
参数传递方法
- 寄存器传递:参数通过特定寄存器传递(速度快,数量有限)
- 栈传递:参数压入用户栈
- 内存传递:参数存入内存块,将内存地址传入寄存器
执行流程
- 用户程序执行到系统调用
- trap 指令:CPU 态制位(用户态→核心态)
- 保护现场,保存寄存器状态
- 根据系统调用号查系统调用表,进入对应处理入口
- 参数通过寄存器/栈/内存传递
- 执行内核态服务(核心态可执行特权指令直接访问硬件)
- 结果写回寄存器
- 恢复现场,返回用户态继续执行
write 系统调用完整路径示例
用户程序 printf → C 标准库函数 → write() 系统调用 → trap 指令进入内核 → 内核根据系统调用号分发 → VFS(虚拟文件系统)层 → 文件系统驱动定位文件物理位置 → 磁盘驱动程序 → DMA 传输 → CPU 让出给其他程序 → 磁盘中断(传输完成)→ 中断处理程序唤醒等待进程 → 恢复现场 → 返回用户程序
示例关系
- printf(C 标准库函数)→ write(系统调用)→ 输出到设备
- fopen/fclose/fread/fwrite 等库函数底层均封装对应系统调用