9.4 系统调用的概念和类型

L54

学习目标

系统调用是用户程序获得OS服务的唯一途径,按功能分为进程控制、文件操纵、设备管理等类型。

  • 系统调用的基本概念:用户程序通过系统调用请求OS服务,是用户态进入核心态的唯一途径。
  • 系统调用的类型:进程控制(创建/终止)、文件操纵(打开/读写/关闭)、设备管理、信息维护、通信。
  • 系统调用与库函数的区别:库函数运行在用户态,可能封装系统调用;系统调用直接陷入内核。
  • 系统调用的执行过程:设置参数→执行陷入指令→进入核心态→处理程序→返回用户态。

原理 · 深入理解

系统调用路径 用户 API 陷入 / ecall 系统调用表 内核函数 返回用户态 恢复 PC · 继续应用 MCU 课多用直接 API;图中路径对齐教材与 RISC-V ecall

9.4 系统调用的概念和类型

本节概览:先建立「系统调用的概念和类型」的框架,再依次展开下列小节。

  1. 系统调用的基本概念
  2. 系统调用的类型
  3. POSIX标准

9.4.1 系统调用的基本概念

中断机制:系统调用通过中断机制实现,且一个 OS 的所有系统调用都通过同一个中断入口实现。

例如 MS-DOS 提供 INT 21H,应用程序通过该中断获取操作系统的服务;UNIX/Linux 则通过陷入指令(如 CHMK)进入核心态。

在计算机系统中,通常运行着系统程序和应用程序两类。为防止应用程序对 OS 的破坏,二者运行在不同状态:OS 内核运行在系统态,应用程序运行在用户态。

现代多数 OS 将 CPU 指令集分为特权指令和非特权指令两类。特权指令只能在系统态执行,用户态下不能直接使用,必须通过系统调用进入系统态。

  1. 特权指令
  2. 非特权指令
图9-6 系统功能的调用 用户程序 库函数 / 陷入 内核 返回
图9-6 系统功能的调用

9.4.2 系统调用的类型

文件操纵类系统调用用于对文件进行操作。

  1. 创建和删除文件
  2. 打开和关闭文件的系统调用
  3. 读和写文件的系统调用

进程通信类系统调用:在单处理机系统中,OS 常采用消息传递方式和共享存储区方式。

采用消息传递方式时,通信前需先打开连接:源进程发出打开连接的系统调用,目标进程用接受连接的系统调用表示同意;然后用发送消息或接收消息的系统调用交换信息;通信结束后用关闭连接的系统调用结束通信。

9.4.3 POSIX标准

目前许多操作系统都提供各种类型的系统调用,实现的功能也相类似,但在实现细节和形式上相差很大,这给应用程序与操作系统平台的无关性带来很大困难。

为解决此问题,国际标准化组织 ISO 给出了有关系统调用的国际标准 POSIX 1003.1(Portable Operating System IX),即「基于 UNIX 的可移植操作系统接口」。该标准使应用程序在不同 UNIX/Linux 平台间具有可移植性。

图9-7 系统程序、库函数、系统调用的分层 应用程序 (系统程序) C 库函数 printf / fopen 系统调用接口 write / open 操作系统内核 硬件
图9-7 UNIX/Linux系统程序、库函数、系统调用的分层关系

做 · 交互动画

  • 根据「学习目标」列出 3 个关键词,对照原理段落解释给自己听。

系统调用的概念和类型

用控件单步操作;日志区记下每一步发生了什么。

总结与提升

  • 能说出一种提高 Flash 寿命的软件策略。
  • 能用自己的话复述学习目标,并指出概念与板上实验的对应。
  • 能区分 Shell 与内核。
  • 能说明用户态不能直接访问设备寄存器的原因。

延伸思考

  • 断电瞬间写元数据为何危险?
  • 如果把本节机制拿到 Linux 或完整 OpenHarmony 上,会多出哪些硬件假设?
  • 图形 UI 在 SOWL TFT 上对应哪一层?
  • 全部函数都链进固件时,还有「用户/内核」边界吗?

← 本阶段封面 · 课程列表