跳至正文

系统调用


系统调用

系统调用(Syscall)是操作系统提供给应用程序的接口,应用程序通过 Trap(访管)指令主动进入内核态请求服务。

是什么

系统调用是应用程序主动请求 OS 服务的唯一机制。它是用户态通往内核态的”合法车票”——用户程序遇到自己没权限干的事(碰硬盘、创建进程、读文件),就执行一句 Trap 指令,由硬件陷入内核态处理。

判断诀窍:哪些操作走系统调用

问自己一个问题:“我写 C/C++ 代码时,能不能调一个函数主动干这件事?“

能主动调用?结论例子
能(程序员视角)是系统调用fork() 创建进程、read() 读文件
不能(OS 后台偷偷做)不是进程调度、页置换
调库函数算一下不是裸系统调用rand()(底层可能调 getpid() 取熵,但属 C 标准库封装)

关键区分:页置换会引发缺页异常(切换),但缺页异常是硬件触发的,不是应用程序主动调用的 → 页置换本身不是系统调用。

如何进入内核态

  • 系统调用(访管 Trap):用户态执行 Trap 指令 → 硬件陷入内核态。Trap 指令本身在用户态执行,但结果触发访管中断切换内核态。
  • 异常(内中断):如除零、缺页。在用户态发生,硬件强制拦截并切换内核态处理。

易错:Trap 指令是”引发切换的指令”,但它本身在用户态执行。别把它当成”必须在内核态执行的指令”。

执行流程:硬件 vs 软件”接力赛”

执行系统调用的过程是一场硬件和软件的完美接力:

第一棒(纯硬件自动完成,OS 还没介入)

  1. 保存断点(PC)和程序状态字(PSW)
  2. 将 CPU 模式改为内核态
  3. 根据中断号查中断向量表,找到 OS 入口地址

第二棒(OS 接管执行)

  1. 保存通用寄存器内容(保护现场)
  2. 执行系统调用服务例程(如去读磁盘)
  3. 恢复通用寄存器,执行 IRET 指令返回

口诀:硬件隐指令负责”换衣服(切内核态)+ 记地址(PC/PSW)“;OS 软件负责”存包裹(通用寄存器)+ 干正事(服务例程)“。

知识闭环

四道错题串成的脉络:

  1. 是什么 → 应用程序主动请求 OS 服务的唯一机制
  2. 怎么进 → 用户态执行 Trap 指令,硬件陷内核态
  3. 进了之后 → 硬件保存 PC/PSW、切内核态;OS 保存通用寄存器、跑服务例程
  4. 为什么需要 → 用户态遇到”搞不定”(读文件/创建进程)或”出格”(除零/缺页)就切内核态

相关笔记

相关错题

  • 408错题日记4 — 用户态 vs 内核态越权判定(特权指令识别,错题群)
  • 408错题日记5 — 系统调用 vs 系统内部机制(2021)、中断处理接力棒(2022)、引发态切换的元凶(2013/2015)

cd ..