System
系统调用(System Call)是操作系统提供给应用程序的一组接口,用于执行需要特权级别(例如内核级别)权限的操作,比如文件操作、网络通信、进程管理等。系统调用充当了用户程序与操作系统内核之间的桥梁,允许用户程序请求内核来执行某些任务。
以下是系统调用的一些常见示例:
文件操作: 打开、关闭、读取、写入、创建、删除文件等。
进程管理: 创建、终止、等待、挂起、恢复进程等。
内存管理: 分配和释放内存、映射文件到内存、更改内存保护权限等。
网络通信: 创建套接字、发送和接收数据、建立网络连接等。
设备控制: 控制设备,如打印机、磁盘驱动器、串口等。
时间管理: 获取当前时间、设置定时器、等待一段时间等。
用户管理: 用户身份验证、权限管理等。
过程
-
选择系统调用号: 用户空间程序需要执行特定的系统调用时,首先要确定所需的系统调用号。每个系统调用都有一个唯一的号码,由操作系统内核定义。这个号码存储在通用寄存器 RAX 中。
-
设置参数: 用户空间程序将系统调用所需的参数存储在一组通用寄存器中,具体寄存器的选择和数量根据系统调用的不同而有所不同。通常,前六个参数被存储在 RDI、RSI、RDX、R10、R8 和 R9 寄存器中。
-
触发系统调用: 用户空间程序使用 syscall 指令来触发系统调用。该指令将控制权从用户模式切换到内核模式,并将寄存器状态保存在内核栈中。
-
内核中的系统调用处理程序: 一旦控制权切换到内核模式,内核会根据 RAX 中的系统调用号找到相应的系统调用处理程序。这个处理程序会根据参数执行相应的操作,如读写文件、创建进程等。
-
系统调用处理程序的执行: 内核中的系统调用处理程序执行所需的操作,可以访问用户空间内存中的数据,并根据参数执行相应的任务。
-
返回结果: 处理程序执行完后,将结果存储在 RAX 寄存器中,然后通过 syscall 指令返回到用户空间。
-
返回用户空间: 控制权返回到用户空间,用户程序可以检查 RAX 中的结果来了解系统调用的执行情况。