系统调用(陷阱)
系统调用是用户态程序请求内核服务的唯一合法途径,属于同步异常中的陷阱(Trap)类型。
工作流程:用户程序通过 syscall 指令触发一个特殊的陷阱异常。该指令会:
- 将执行模式从用户态切换到内核态。
- 处理器根据系统调用号在中断描述符表中查找对应的系统调用处理程序。
- 内核执行请求的服务(如读写文件、创建进程)。
- 完成后返回到用户态,并将结果返回给用户程序。
系统调用号:每个系统调用(如 read、write、open)都有唯一的编号。用户程序将系统调用号存入特定寄存器(x86-64中是 %rax),参数依次放入其他寄存器。
与普通函数调用的区别:
- 系统调用涉及用户态到内核态的上下文切换,开销远大于普通函数调用。
- 系统调用由内核代表用户程序执行,可以访问硬件和内核数据结构。
- 系统调用是受控的、安全的用户态/内核态切换通道。
典型系统调用:read、write、open、close、fork、execve、mmap 等。