定义

  • 操作系统提供给应用程序的编程接口
  • 用户态程序请求内核服务的唯一方式

与用户级函数调用的区别

维度系统调用普通函数调用
运行状态用户态→核心态切换仅在用户态执行
实现机制需 trap 指令(中断与异常普通 call/jmp 指令
执行特权可执行特权指令(访问硬件)只能执行普通指令
返回机制涉及现场恢复和重新调度简单返回

分类

  • 进程控制(fork、exit、wait)
  • 文件操作(创建、打开、读、写、关闭、删除)
  • 设备管理
  • 信息维护
  • 通信(pipe、shmget、socket)

系统调用编号分发机制

  • 每个系统调用有唯一系统调用号
  • 用户程序将系统调用号存入特定寄存器
  • 进入内核后,内核根据系统调用号查系统调用表(sys_call_table),跳转到对应处理函数
  • 不同 OS 的系统调用表不同 → 安装包不通用

参数传递方法

  • 寄存器传递:参数通过特定寄存器传递(速度快,数量有限)
  • 栈传递:参数压入用户栈
  • 内存传递:参数存入内存块,将内存地址传入寄存器

执行流程

  1. 用户程序执行到系统调用
  2. trap 指令:CPU 态制位(用户态→核心态)
  3. 保护现场,保存寄存器状态
  4. 根据系统调用号查系统调用表,进入对应处理入口
  5. 参数通过寄存器/栈/内存传递
  6. 执行内核态服务(核心态可执行特权指令直接访问硬件)
  7. 结果写回寄存器
  8. 恢复现场,返回用户态继续执行

write 系统调用完整路径示例

用户程序 printf → C 标准库函数 → write() 系统调用 → trap 指令进入内核 → 内核根据系统调用号分发 → VFS(虚拟文件系统)层 → 文件系统驱动定位文件物理位置 → 磁盘驱动程序 → DMA 传输 → CPU 让出给其他程序 → 磁盘中断(传输完成)→ 中断处理程序唤醒等待进程 → 恢复现场 → 返回用户程序

示例关系

  • printf(C 标准库函数)→ write(系统调用)→ 输出到设备
  • fopen/fclose/fread/fwrite 等库函数底层均封装对应系统调用