系统调用的原理
系统调用是什么实现的?
用户态之间的通信通常通过 socket 或网络暴露 API 并调用,但系统调用不同,它是通过硬件机制实现的(高性能):
- CPU 提供 syscall 这个特殊的指令。
- 底层库 glibc/musl 提供内核的系统调用包装函数,函数的实现逻辑是将系统调用号和对应参数放入特定的寄存器中,然后执行 syscall 指令。
- CPU 收到 syscall 指令后,自动从用户态切换到内核态,并从预设的寄存器加载相应的内核系统调用入口地址。
- CPU 执行相应的系统调用实现函数,并将结果写到特定的寄存器中。
- CPU 切回用户态,底层库 glibc/musl 从特定的寄存器中读取系统调用返回值,返回给上层应用。
如何查看支持的系统调用列表?
arch
目录下的 tbl
文件保存了各种处理器架构下的系统调用映射表:
比如最常见的 x86
架构下的系统调用列表在 arch/x86/entry/syscalls/syscall_64.tbl
这个文件中:
第 1 列是系统调用号,是系统调用的唯一标识,不同处理器下可能不一样,第 3 列就是系统调用名称。