Appearance
系统调用
考情分析
系统调用的概念和执行过程是选择题高频考点,特别是与库函数的区分。🔥🔥🔥 高频。
用户程序想读一个文件、创建一个进程,但这些操作都涉及硬件资源,用户态又没有权限——怎么办?
系统调用的概念
系统调用是操作系统提供给应用程序的程序接口(API),是用户程序请求操作系统服务的唯一方式。
用户程序不能直接执行特权操作(如 I/O、创建进程),必须通过系统调用"请求"操作系统代为执行——就像银行柜台,你不能自己去金库拿钱,只能填单子让柜员帮你操作。
系统调用的分类
| 类别 | 功能 | 示例 |
|---|---|---|
| 进程控制 | 创建/终止/等待进程 | fork, exec, exit, wait |
| 文件管理 | 打开/关闭/读写文件 | open, close, read, write |
| 设备管理 | 请求/释放设备 | ioctl |
| 信息维护 | 获取系统信息 | getpid, time |
| 通信 | 进程间通信 | pipe, shmget, socket |
系统调用的执行过程
关键步骤:
- 传参:将系统调用号和参数放入寄存器
- 陷入:执行 trap 指令(
int 0x80或syscall),触发从用户态到内核态的切换 - 执行:内核根据系统调用号在系统调用表中找到对应处理函数并执行
- 返回:结果放入寄存器,执行中断返回指令,回到用户态
系统调用 vs 库函数
| 比较 | 系统调用 | 库函数 |
|---|---|---|
| 执行环境 | 内核态 | 用户态(可能内部调用系统调用) |
| 提供者 | 操作系统内核 | 语言运行库(如 C 标准库) |
| 开销 | 需要态切换,开销大 | 普通函数调用,开销小 |
| 举例 | read, write, fork | printf, malloc, fopen |
printf 是库函数,它在内部调用了 write 系统调用。malloc 在内部调用了 brk 或 mmap 系统调用。
注意
并非所有库函数都涉及系统调用。例如 strlen 只是在用户态计算字符串长度,不需要任何系统调用。
系统调用与中断的关系
系统调用通过 trap(陷入) 指令触发,trap 本质上是一种内中断(异常)。
| 概念 | 层次 |
|---|---|
| 系统调用 | OS 提供的功能接口 |
| trap 指令 | 触发系统调用的机制 |
| 中断/异常 | 实现态切换的底层硬件机制 |
考研高频考点
- 🔥🔥🔥 系统调用在内核态执行(通过 trap 陷入)
- 🔥🔥🔥 系统调用 vs 库函数的区别
- 🔥🔥 系统调用是用户程序获取 OS 服务的唯一方式
- 🔥🔥 系统调用的执行流程(传参→trap→查表→执行→返回)
- 🔥 凡是涉及资源管理或硬件访问的操作都需要系统调用
系统调用是程序运行时与 OS 交互的接口,但程序在运行前还要经历编译、链接、装入——下一篇来看一个 .c 文件是怎么一步步变成内存中可执行的进程的。