一、系统调用
系统调用(System Call)是操作系统提供给用户程序的一组接口,用于执行需要内核权限的操作。这些操作通常涉及到硬件资源的访问或管理,例如文件I/O、进程控制、内存管理等。以下是对系统调用的详细解释,包括其工作机制、分类、实现方式及常见示例。
1. 系统调用的工作机制
-
用户模式与内核模式:
- 用户模式:用户程序运行在此模式下,受到严格的权限限制,不能直接访问硬件或执行特权指令。
- 内核模式:操作系统核心代码运行在此模式下,拥有完全的硬件访问权限和执行特权指令的能力。
-
触发系统调用:
用户程序通过特定的编程接口(如C语言中的标准库函数)发起系统调用请求。常见的触发方式包括使用特定的系统调用指令(如x86架构下的int 0x80
或syscall
指令)。 -
参数传递:
系统调用所需的参数可以通过寄存器或栈传递。不同的操作系统和体系结构可能有不同的约定。例如,在Linux x86_64架构中,前6个参数通过寄存器传递(RDI
,RSI
,RDX
,RCX
,R8
,R9
),更多的参数则通过栈传递。 -
模式切换:
当触发系统调用时,处理器会从用户模式切换到内核模式。这一步骤确保了安全性和稳定性,防止用户程序直接访问或修改关键系统资源。 -
执行系统调用处理程序:
内核接收到系统调用请求后,根据系统调用号(每个系统调用都有一个唯一的编号)找到对应的处理程序并执行。 -
返回结果:
执行完毕后,内核将结果返回给用户程序,并从内核模式切换回用户模式。
2. 系统调用的分类
系统调用可以根据其功能分为几大类:
-
进程控制:
- 创建新进程(
fork()
,vfork()
) - 加载和执行新程序(
exec()
系列函数)
- 创建新进程(