系统调用
系统调用
系统调用(Syscall)是操作系统提供给应用程序的接口,应用程序通过 Trap(访管)指令主动进入内核态请求服务。
是什么
系统调用是应用程序主动请求 OS 服务的唯一机制。它是用户态通往内核态的”合法车票”——用户程序遇到自己没权限干的事(碰硬盘、创建进程、读文件),就执行一句 Trap 指令,由硬件陷入内核态处理。
判断诀窍:哪些操作走系统调用
问自己一个问题:“我写 C/C++ 代码时,能不能调一个函数主动干这件事?“
| 能主动调用? | 结论 | 例子 |
|---|---|---|
| 能(程序员视角) | 是系统调用 | fork() 创建进程、read() 读文件 |
| 不能(OS 后台偷偷做) | 不是 | 进程调度、页置换 |
| 调库函数算一下 | 不是裸系统调用 | rand()(底层可能调 getpid() 取熵,但属 C 标准库封装) |
关键区分:页置换会引发缺页异常(切换),但缺页异常是硬件触发的,不是应用程序主动调用的 → 页置换本身不是系统调用。
如何进入内核态
- 系统调用(访管 Trap):用户态执行 Trap 指令 → 硬件陷入内核态。Trap 指令本身在用户态执行,但结果触发访管中断切换内核态。
- 异常(内中断):如除零、缺页。在用户态发生,硬件强制拦截并切换内核态处理。
易错:Trap 指令是”引发切换的指令”,但它本身在用户态执行。别把它当成”必须在内核态执行的指令”。
执行流程:硬件 vs 软件”接力赛”
执行系统调用的过程是一场硬件和软件的完美接力:
第一棒(纯硬件自动完成,OS 还没介入):
- 保存断点(PC)和程序状态字(PSW)
- 将 CPU 模式改为内核态
- 根据中断号查中断向量表,找到 OS 入口地址
第二棒(OS 接管执行):
- 保存通用寄存器内容(保护现场)
- 执行系统调用服务例程(如去读磁盘)
- 恢复通用寄存器,执行 IRET 指令返回
口诀:硬件隐指令负责”换衣服(切内核态)+ 记地址(PC/PSW)“;OS 软件负责”存包裹(通用寄存器)+ 干正事(服务例程)“。
知识闭环
四道错题串成的脉络:
- 是什么 → 应用程序主动请求 OS 服务的唯一机制
- 怎么进 → 用户态执行 Trap 指令,硬件陷内核态
- 进了之后 → 硬件保存 PC/PSW、切内核态;OS 保存通用寄存器、跑服务例程
- 为什么需要 → 用户态遇到”搞不定”(读文件/创建进程)或”出格”(除零/缺页)就切内核态
相关笔记
相关错题
cd ..