大西冰城的博客

跟我学操作系统(6):系统调用

Word count: 884Reading time: 2 min
2026/04/25
loading

什么是系统调用

之前我们说过,操作系统作为用户与硬件之间的接口,向上提供了一组系统调用(System Call)。用户程序通过这些接口请求内核提供服务。系统调用是用户态程序访问内核功能的标准入口,可以理解为一种特殊的函数调用,与库函数那种在用户空间执行的调用不同,系统调用会触发上一章提到的陷入指令,将执行权切换到内核态,由操作系统内核来处理请求,从而安全地访问和操作系统资源。库函数则是在系统调用的基础上提供了更高层次的封装,方便程序员用各种高级语言编写应用程序。值得注意的是,并非所有库函数都会调用系统调用,有些库函数只需在用户空间执行即可。

系统调用的过程

当一个运行在用户态的程序需要发起系统调用时,首先会执行传参数指令,将所需参数传入CPU寄存器或程序栈中。这些参数主要包含两类核心信息,一是系统调用编号——用于明确告知内核需要执行的具体系统调用(如读写文件、创建进程等),二是该系统调用所需的具体参数(例如文件描述符、数据缓冲区地址、数据长度等),不同系统调用的参数类型和数量会有所差异。

接着,程序会执行一条陷入指令,这条指令会触发一个中断信号,切换CPU到内核态,由操作系统的内核程序来处理这个请求。内核程序会先读取之前传递的系统调用编号,通过编号在系统调用表中查找对应的内核处理函数,随后执行该函数以完成具体操作(如读写磁盘文件、分配内存空间、创建新进程等)。在此过程中,内核会全程管控系统资源,确保操作的安全性和合法性。

当内核完成所有操作后,会将处理结果(成功标识、返回数据或错误信息等)存入指定的寄存器或栈中,同时触发态切换,将CPU从内核态切换回用户态。最后,用户程序从指定位置读取处理结果,继续执行后续的代码逻辑,完成一次完整的系统调用。

陷入指令是在用户态程序中执行的一条特殊指令,并非特权指令。

flowchart LR
    A["用户程序
准备系统调用参数"] --> B["执行陷入指令
触发中断"] B --> C["CPU切换到内核态
内核处理系统调用"] C --> D["执行系统调用处理函数
完成操作"] D --> E["将结果存入寄存器或栈
切换回用户态"] E --> F["用户程序读取结果
继续执行后续代码"]

凡是与共享资源有关的操作都需要通过系统调用来完成,因为这些操作涉及到对系统资源的访问和管理,必须由内核来进行控制和协调,以确保系统的稳定性和安全性。

本章与上一章系统的中断有知识重合的地方,因为系统调用本身就属于一种特殊的中断机制。

CATALOG
  1. 1. 什么是系统调用
  2. 2. 系统调用的过程