【发布时间】:2010-12-20 20:46:31
【问题描述】:
我读到 Linux 是一个单片内核。单体内核是否意味着将完整的内核代码编译并链接成可执行文件?
如果 Linux 能够支持模块,为什么不将所有子系统分解为模块并在必要时加载它们呢?在这种情况下,内核不必一开始就加载所有模块,并且可以维护模块中函数的索引并在必要时加载它们。
【问题讨论】:
标签: architecture operating-system linux-kernel
我读到 Linux 是一个单片内核。单体内核是否意味着将完整的内核代码编译并链接成可执行文件?
如果 Linux 能够支持模块,为什么不将所有子系统分解为模块并在必要时加载它们呢?在这种情况下,内核不必一开始就加载所有模块,并且可以维护模块中函数的索引并在必要时加载它们。
【问题讨论】:
标签: architecture operating-system linux-kernel
单片内核是一个内核,其中所有服务(文件系统、VFS、设备驱动程序等)以及核心功能(调度、内存分配等)都是一个紧密结合的组,共享相同的空间。这直接反对 微内核。
微内核更喜欢将核心功能与系统服务和设备驱动程序(基本上只是系统服务)隔离开来的方法。例如,VFS(虚拟文件系统)和块设备文件系统(即 minixfs)是在内核空间之外运行的独立进程,使用 IPC 与内核、其他服务和用户进程进行通信。简而言之,如果它是Linux中的模块,那么它就是微内核中的服务,表示一个孤立的进程。
不要将术语 模块化 内核与单片内核混淆。一些单片内核可以编译为模块化(例如 Linux),重要的是模块插入到处理核心功能的同一空间(内核空间)并从其运行。
微内核的优点是任何失败的服务都可以很容易地重新启动,例如,如果根文件系统抛出异常,内核不会停止。不过,这也可以被视为一个缺点,因为它可以隐藏非常关键的错误(或者使它们看起来不那么关键,因为问题似乎在不断地自我修复)。在部署后您根本无法方便地修复某些内容的情况下,它被视为一个很大的优势。
微内核的缺点是异步 IPC 消息传递可能变得非常难以调试,尤其是在实现 fibrils 时。此外,仅跟踪 FS/写入问题意味着检查用户空间进程、块设备服务、VFS 服务、文件系统服务和(可能)PCI 服务。如果您对此一无所知,那么是时候查看 IPC 服务了。这在单片内核中通常更容易。 GNU Hurd 遇到这些调试问题 (reference)。在处理复杂的消息队列时,我什至不会进入检查点。微内核不适合胆小的人。
实现工作稳定内核的最短路径是单片方法。任何一种方法都可以提供 POSIX 接口,其中内核的设计对于只想编写代码以在任何给定设计上运行的人来说几乎没有兴趣。
我在生产中使用 Linux(单片机)。然而,我在内核开发方面的大部分学习、黑客或修补都进入了微内核,特别是 HelenOS。
编辑
如果您通过我冗长的回答得到了这么多,您可能会在阅读“Great Torvalds-Tanenbaum debate on kernel design”时获得一些乐趣。在它发生 20 多年后,2013 年读起来更有趣。最有趣的部分是 Linus 在最后一条消息中的签名:
Linus "my first, and hopefully last flamefest" Torvalds
显然,这与 Tanenbaum 的 x86 将很快过时的预测一样,并没有成为现实。
注意:
当我说“Minix”时,我并不是指 Minix 3。此外,当我提到 HURD 时,我指的是(主要是)Mach 微内核。我无意贬低他人最近的工作。
【讨论】:
单片内核意味着整个操作系统在内核模式下运行(即硬件的高度特权)。也就是说,操作系统的任何部分都不会在用户模式(较低权限)下运行。只有操作系统之上的应用程序才能在用户模式下运行。
在 Windows 等非单内核操作系统中,操作系统本身的很大一部分运行在用户模式下。
无论哪种情况,操作系统都可以高度模块化。
【讨论】:
;tl-dr - 不,Linux 总是单片的。
Linux modules 在某种意义上可能意味着 modular。正如其他人所指出的,单片通常代表 微内核 与 单片 内核。传统的微内核只有这些功能,
没有硬件驱动程序、协议栈、文件系统、挂起/恢复、时钟管理等在主内核中。这些东西对于任何用户任务相同(尽管它们可能通过 MMU/调度程序具有不同的权限)。
PC 和服务器程序员可能会笑,但对于现有的大多数手机来说,二三肯定是正确的。如果 BlackBerry QNX 取得成功,Tanenbaum 在所有方面都是正确的。
此外,许多L1-hypervisors 下方有一个micro-kernel。这是因为管理程序除了 context 开关之外通常不会做太多事情。
显然,三个预言了 Linux 的成功。 ;-)
微内核的一个论点是,所有的单体子系统都需要一次同步多个值。为了做到这一点,他们必须使用锁,并且在扩展到并行架构时会受到Amdahl's law 的影响。反之,微内核会导致大量 IPC 消息。
一个主要的发展是使用lock-free 编程来避免单一内核中的争用。这避免了单一内核中的锁定,同时也减少了 IPC 开销。最近,所有 CPU 都在扩展它们的 ISA,以包含更好的 lock-free 算法原语。所以 Linux 可能会在一段时间内保持单一内核。
【讨论】:
来自Wikipedia:
单片内核是一种内核架构,其中整个操作系统都在内核空间中工作,并且单独作为主管模式。与其他架构不同,单片内核单独定义了计算机硬件上的高级虚拟接口,具有一组原语或系统调用来实现所有操作系统服务,例如进程管理、并发和内存管理本身以及一个或多个设备驱动程序作为模块。
另一方面,最新版本的 Windows 使用 Hybrid kernel。
混合内核是一种内核架构,它结合了计算机操作系统中使用的微内核和单片内核架构的各个方面。由于与单片内核的相似性,该类别存在争议;一些人认为这个词是简单的营销。传统的内核类别是单体内核和微内核(超内核和外内核被视为微内核的更极端版本)。
【讨论】:
在这种情况下,'Monolithic' 并不是指存在单个大型可执行文件,正如您所说,Linux 支持在运行时动态加载内核模块。在谈论内核时,“单片机”意味着整个操作系统以“特权”或“主管”模式运行,而其他类型的操作系统则使用诸如“微内核”之类的内核,其中只有最小的一组功能在特权模式下运行,并且大部分操作系统在用户空间中运行。
微内核的支持者说这更好,因为更小的代码意味着更少的错误,并且在超级用户模式下运行的错误可能会导致比在用户空间代码中更大的问题(例如在形式的“内核恐慌”)。一些微内核足够小,可以“正式验证”,这意味着您可以根据规范在数学上证明内核是“正确的”。 L4 就是一个很好的例子。
【讨论】:
单片内核是完全在单个地址空间中运行的单个大型进程。它是一个单一的静态二进制文件。所有内核服务都存在并在内核地址空间中执行。内核可以直接调用函数。基于单片内核的操作系统的例子有 Linux、Unix。
我认为这篇文章将帮助您更多地理解这个概念。
http://learnlinuxconcepts.blogspot.in/2014/03/what-are-monolithic-and-micro-kernels.html
【讨论】: