我在Tanenbaum关于操作系统的书中看到有保护环,并且ring 0属于内核。一般来说,人们可能会说“内核模块处理环 0 的 I/O 和内存管理”,或者“内核模块”特定于 Linux,不适用于 OpenBSD 和 MULTICS 等?
答案1
Andrew Tanenbaum 提出的想法通常不能直接适用于 Linux(或任何传统的整体 Unix 内核)。您问题的答案比您建议的要简单得多:Linux 内核模块是已编译并链接到单独文件中的内核代码,而不是链接到内核映像中。这个单独的内核对象文件 (.ko) 可以在运行时按需加载到内核地址空间中。实际上,所有可以编译为内核模块的驱动程序也可以静态链接到内核映像中,一旦加载代码,功能上没有任何差异。
模块代码是内核代码,它以与所有其他内核代码相同的权限运行。原则上,内核模块可以替换任何内核代码,但为了干净地做到这一点,内核本身必须提供一种机制供模块挂钩。
关于术语的旁注:保护环是 Multics 操作系统引入的概念。 “Ring 0”到“Ring 3”是特定于 Intel 处理器的术语。其他处理器架构使用其他术语,例如用户/管理员模式。尽管英特尔处理器提供四种不同级别的特权,但大多数操作系统只使用两种:Ring 3 用于用户级代码,Ring 0 用于内核代码,镜像其他处理器的用户/管理员模式。 (OS/2 是个例外,它使用三个级别的特权。)
随着硬件级虚拟化技术的出现,特权级概念最近得到了扩展。例如,ARM架构定义了三个权限级别:User、Supervisor和Hypervisor。开玩笑地说,最终在基于 Intel 的机器上使用了四个环:Ring 3 用于用户级代码,Ring 0 用于(虚拟机)内核代码,Ring -1 用于管理程序代码,Ring -2 用于 SMM 模式。
答案2
内核的概念并不适用于所有操作系统。它很普遍,但究竟如何将其应用到特定系统可能是一个有争议的问题。
在程序彼此隔离的多道程序系统中,内核有一个精确的定义:内核是系统中可以访问所有内容的部分。内核是不孤立的部分。内核的作用至少是提供隔离机制,但它可以做更多的事情。在包括Linux在内的传统Unix内核架构中,内核还包含硬件驱动程序、网络协议、文件系统驱动程序等。
在大多数系统上,正在运行的程序之间的隔离依赖于硬件功能(处理器特权模式、内存管理单元)。内核是系统中运行在处理器最高特权模式下的部分,在该模式下可以控制整个系统的特权。在 x86 处理器上,此模式称为“ring 0”;请注意,“ring 0”是 x86 术语,而不是一般概念。一般概念称为“内核模式”或“特权模式”或“主管模式”。
“内核模块处理环 0 的 I/O 和内存管理”这一说法没有意义。内核作为一个整体,处理内存管理(在决定哪个进程拥有哪个内存以及在什么地址访问内存的级别)和 I/O(在将数据复制进和复制出外设的级别)。内核作为一个整体运行在处理器的内核模式下,即 x86 处理器上的 Ring 0。
内核模块是内核的一部分,在启动后加载。模块和启动时代码之间的唯一区别在于其加载方式。内核模块中的代码与启动时加载的内核代码具有相同的权限级别,并且可以执行相同的功能(任何可以作为模块加载的代码也可以包含在启动时映像中)。许多现代 Unix 系统都有内核模块,包括 Solaris、*BSD、Linux 等。