原书:Linux Kernel Development 3rd. Edition,书名也可以翻译为《Linux内核开发》,书中描述的是2.6.34版内核。

用户空间和内核空间

现代操作系统提供保护机制,内核独立于普通应用程序,运行于系统态(内核态),拥有受保护的内存空间和访问硬件设备的所有权限,这种系统态和被保护的内存空间统称为内核空间

普通应用程序在用户空间运行于用户空间,有许多限制,例如不能直接访问硬件、不能访问内核分配给其他应用程序的内存范围。

进程上下文和中断上下文

应用程序通过系统调用陷入内核,内核代其执行,这时内核被称为运行于进程上下文中。

硬件设备和系统通信时,硬件发出中断信号打断处理器执行,继而打断内核执行。Linux内核调用中断服务程序(ISR)处理中断,中断服务程序不在进程上下文中执行,而是在一个与进程无关的,专门的中断上下文中执行,为了保证第一时间响应中断,并且快速退出。

每个处理器在任何指定时间上的活动处于以下三种情况之一:

  • 运行于用户空间,执行用户进程。
  • 运行于内核空间,处于进程上下文,代表某个特定的进程执行。
  • 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断。(最新的Intel Xeon处理器架构Sapphire Rapids将支持用户态中断,具体可以看知乎上的这篇文章

单体内核(monolithic kernel)和微内核(micro kernel)

操作系统内核有两大阵营:单体内核和微内核

单体内核将内核从整体上作为一个单独的大过程来实现,运行在一个单独的地址空间上,内核各个组件之间通过函数调用。

微内核的功能划分为多个独立的过程,每个过程叫做一个服务器,运行在独立的地址空间上。只有少数的服务器运行在特权模式下,其他服务器都运行在用户空间。各服务器之间采用进程间通信(IPC)机制通信。IPC机制涉及内核空间和用户空间的上下文切换,造成性能开销。为了降低开销,Windows NT和Mac OS X等微内核操作系统不让微内核服务器运行在用户空间,违背了微内核设计的初衷。

Linux是实用主义的单体内核,避免了微内核的性能损失,所有内核功能通过函数调用,无需使用IPC,又汲取了微内核的精华(模块化设计、动态加载内核模块、抢占式内核、内核线程)。

Linux Kernel mailing list

http://vger.kernel.org/