内核内存空间在操作系统中是受保护的。通常情况下,一个普通程序执行在用户空间。当需要与内核通信的时候,比如写文件到磁盘,就需要进行系统调用。
有趣的是,内核原生提供的系统调用很少(参考List of Linux/i386 system calls)。当我们需要系统调用的时候,实际上是在调用调用的上一层 API。这一层 API 封装了各种系统调用(通常就是操作系统内置的 C 库)。现阶段,这一层 API 的标准来自于 IEEE ,名为 POSIX(Portable Operating System Interface)。这么做的原因是 unix 倡导的 提供机制,而不是提供策略。意思是提供有限的,但可以很好组合的工具、方法,在此基础上实现各种功能。
例如,
get_pid()
在内核中的被定义为 sys_getpid()
bar()
在内核中被定义为 sys_bar()
一个用户空间的程序,要做系统调用,具体的过程为
- 陷入内核
- 传递系统调用编号和参数
- 执行系统调用
- 将系统调用的返回值带给用户空间