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