首页/操作系统/操作系统概述/系统调用 🔗 在 Obsidian 中打开
操作系统 · 操作系统概述

系统调用

重要度 ★★★★★ 系统调用用户态内核态陷入
速查
系统调用是用户程序请求内核服务的唯一合法接口,通过陷入指令(trap/int/syscall)实现用户态 → 内核态切换。开销远大于普通函数调用(需模式切换 + 现场保存恢复)。

基本概念

系统调用(System Call)是操作系统提供给用户程序的唯一合法接口,用于请求内核态才能执行的特权操作(如 I/O、内存分配、进程创建)。

触发方式通过陷入指令(trap / int / syscall)从用户态切换到内核态。系统调用本质是陷阱(Trap),属于异常的一种,不是中断。

执行流程

  1. 用户程序将系统调用号和参数放入指定寄存器
  2. 执行陷入指令,触发软中断 / 陷阱
  3. CPU 从用户态切换到内核态
  4. 通过系统调用号在系统调用表中查找对应处理函数
  5. 执行内核态的系统调用处理函数
  6. 将结果返回给用户程序
  7. CPU 从内核态切换回用户态
用户态(User Mode) 准备调用号/参数 → 执行陷入指令 内核态(Kernel Mode) 查系统调用表 → 执行服务 → 返回 陷入 → 切内核态 返回 → 切用户态
点击「下一步」逐步查看系统调用的模式切换

分类

类别功能示例
进程控制创建/终止/等待进程fork()、exit()、wait()
文件操作读写创建删除文件open()、read()、write()
设备管理请求/释放设备ioctl()、read()、write()
内存管理分配/释放内存mmap()、brk()
信息维护获取/设置系统信息getpid()、time()
进程通信管道/共享内存/消息pipe()、shmget()

与库函数对比

对比项系统调用普通函数调用(库函数)
运行状态内核态用户态
切换方式陷入(trap)+ 模式切换普通跳转(call)
开销大(保存/恢复现场、模式切换)小(仅压栈跳转)
安全性受内核保护,有权限检查无额外保护
功能特权操作(I/O、进程管理等)通用计算
典型例子printf 是库函数(用户态执行),但内部会调用 write 系统调用。不是所有库函数都涉及系统调用。

易错点

必记
  1. 系统调用 $\neq$ 库函数:库函数(如 printf)在用户态,内部可能调用系统调用(如 write)。
  2. 系统调用是 Trap(陷阱),通过陷入指令触发,属异常而非中断。
  3. 系统调用开销大:涉及用户态/内核态切换和现场保存恢复。
  4. 一次系统调用不一定对应一次 I/O:内核可能缓冲或合并请求。
  5. 参数通过寄存器传递最常见(也可通过栈),不同系统约定不同。

记忆卡片

系统调用如何触发?
陷入指令(trap / int / syscall)。
在什么态执行?
内核态。
属于哪种中断?
陷阱(Trap),即软件中断 / 异常。
系统调用号的作用?
索引系统调用表,查找处理函数。
printf 是系统调用吗?
不是,是库函数;内部调用 write 系统调用。
为什么开销大?
需要用户态/内核态切换和现场保存恢复。

交互动画 · 一次 read() 系统调用的完整旅程

手动模式
用户态 User Mode(无特权) ① 调用 read()库函数封装 ② 调用号 3 + 参数fd/buf/count → 寄存器 ③ 陷入指令syscall / int 0x80 内核态 Kernel Mode(特权级 0) ④ 查系统调用表sys_call_table[3] ⑤ 执行 sys_read驱动 I/O → 用户缓冲 ⑥ 恢复现场返回结果 → 用户程序 陷入(模式切换 3→0) 返回(模式切换 0→3)
read(fd, buf, count) ── 系统调用 ──▶ 陷入 · 内核执行 · 返回
点击「播放」或「下一步」,跟随一次 read() 从用户态进入内核态再返回
系统调用是 Trap(陷阱/软中断),不是硬件中断;开销 = 模式切换 + 现场保存恢复
变量配色:用户态执行 · 内核态执行 · 虚线箭头为模式切换方向。

相关知识点

interrupt-and-exception program-linking-and-loading

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。