内核内存空间在操作系统中是受保护的。通常情况下,一个普通程序执行在用户空间。当需要与内核通信的时候,比如写文件到磁盘,就需要进行系统调用

有趣的是,内核原生提供的系统调用很少(参考List of Linux/i386 system calls)。当我们需要系统调用的时候,实际上是在调用调用的上一层 API。这一层 API 封装了各种系统调用(通常就是操作系统内置的 C 库)。现阶段,这一层 API 的标准来自于 IEEE ,名为 POSIX(Portable Operating System Interface)。这么做的原因是 unix 倡导的 提供机制,而不是提供策略。意思是提供有限的,但可以很好组合的工具、方法,在此基础上实现各种功能。

例如,

get_pid() 在内核中的被定义为 sys_getpid()
bar() 在内核中被定义为 sys_bar()

一个用户空间的程序,要做系统调用,具体的过程为

  • 陷入内核
  • 传递系统调用编号和参数
  • 执行系统调用
  • 将系统调用的返回值带给用户空间