Skip to content

系统调用

考情分析

系统调用的概念和执行过程是选择题高频考点,特别是与库函数的区分。🔥🔥🔥 高频。

用户程序想读一个文件、创建一个进程,但这些操作都涉及硬件资源,用户态又没有权限——怎么办?

系统调用的概念

系统调用是操作系统提供给应用程序的程序接口(API),是用户程序请求操作系统服务的唯一方式。

用户程序不能直接执行特权操作(如 I/O、创建进程),必须通过系统调用"请求"操作系统代为执行——就像银行柜台,你不能自己去金库拿钱,只能填单子让柜员帮你操作。

系统调用的分类

类别功能示例
进程控制创建/终止/等待进程fork, exec, exit, wait
文件管理打开/关闭/读写文件open, close, read, write
设备管理请求/释放设备ioctl
信息维护获取系统信息getpid, time
通信进程间通信pipe, shmget, socket

系统调用的执行过程

关键步骤:

  1. 传参:将系统调用号和参数放入寄存器
  2. 陷入:执行 trap 指令(int 0x80syscall),触发从用户态到内核态的切换
  3. 执行:内核根据系统调用号在系统调用表中找到对应处理函数并执行
  4. 返回:结果放入寄存器,执行中断返回指令,回到用户态

系统调用 vs 库函数

比较系统调用库函数
执行环境内核态用户态(可能内部调用系统调用)
提供者操作系统内核语言运行库(如 C 标准库)
开销需要态切换,开销大普通函数调用,开销小
举例read, write, forkprintf, malloc, fopen

printf 是库函数,它在内部调用了 write 系统调用。malloc 在内部调用了 brkmmap 系统调用。

注意

并非所有库函数都涉及系统调用。例如 strlen 只是在用户态计算字符串长度,不需要任何系统调用。

选择题判断对照

408 选择题最爱问"以下哪些操作一定会触发系统调用 / 一定不会"。一张速查表:

操作是否触发系统调用理由
读写文件、网络 socket涉及设备/资源管理,必须陷入内核
创建/终止进程、线程涉及 PCB/TCB 内核数据结构
申请大块内存(malloc 大对象)(间接)触发 brk/mmap 系统调用
申请小块内存(命中已有堆)用户态分配器在已 mmap 的堆里切块
获取系统时间、PIDgettimeofday / getpid 是系统调用
字符串处理(strlen/strcpy纯计算,全在用户态
printf 调用不一定命中行缓冲时不刷新→不触发;遇 \n 或满缓冲触发 write
数学运算(sin/sqrt纯用户态计算
浮点除零 / 访存越界不是系统调用但是异常,机制上也会陷入内核

易错

  • "凡是涉及内核的都是系统调用" — 。异常(除零、缺页)也陷入内核但不是系统调用
  • "库函数 = 用户态" — 不完全。库函数本身在用户态,但内部可能调用系统调用
  • "系统调用是软中断" — 可接受。trap 指令属于内中断(异常)范畴,与硬件中断的"异步"特点不同

系统调用与中断的关系

系统调用通过 trap(陷入) 指令触发,trap 本质上是一种内中断(异常)

概念层次
系统调用OS 提供的功能接口
trap 指令触发系统调用的机制
中断/异常实现态切换的底层硬件机制

考研高频考点

  • 🔥🔥🔥 系统调用在内核态执行(通过 trap 陷入)
  • 🔥🔥🔥 系统调用 vs 库函数的区别
  • 🔥🔥 系统调用是用户程序获取 OS 服务的唯一方式
  • 🔥🔥 系统调用的执行流程(传参→trap→查表→执行→返回)
  • 🔥 凡是涉及资源管理或硬件访问的操作都需要系统调用

系统调用是程序运行时与 OS 交互的接口,但程序在运行前还要经历编译、链接、装入——下一篇来看一个 .c 文件是怎么一步步变成内存中可执行的进程的。

真题练习

相关真题(8题)

2023Q26选择题2分

态切换:系统调用完成后返回用户态

2022Q31选择题2分

中断处理:中断服务程序将数据送入内核缓冲区

中断与异常(OS 视角)系统调用
2021Q32选择题2分

文件数量上限:由索引结点号4字节=32位决定,最多2³²个文件

2019Q25选择题2分

系统调用:在内核态执行,是OS提供的接口,不同OS接口不统一

2017Q24选择题2分

系统调用流程:先传参→陷入→执行服务→返回

2013Q28选择题2分

态切换:除零异常和read系统调用进入内核态,sin()是库函数不进入

中断与异常(OS 视角)系统调用
2012Q28选择题2分

read系统调用:需要文件描述符而非文件名,缺数据会阻塞,会切换到内核态

2010Q23选择题2分

外部中断:键盘输入是外部设备中断,其他是内部异常