我读到过Linux是一个单片内核。单片内核是否意味着将完整的内核代码编译并链接到可执行文件中?

如果Linux能够支持模块,为什么不将所有子系统分解成模块并在必要时加载它们呢?在这种情况下,内核不需要一开始就加载所有模块,可以在模块中维护函数的索引,并在必要时加载它们。


当前回答

单片内核是一个内核,其中所有服务(文件系统、VFS、设备驱动程序等)以及核心功能(调度、内存分配等)都是一个紧密结合的组,共享相同的空间。这直接反对微内核。

微内核倾向于将核心功能与系统服务和设备驱动程序(基本上就是系统服务)隔离开来。例如,VFS(虚拟文件系统)和块设备文件系统(即minixfs)是在内核空间之外运行的独立进程,使用IPC与内核、其他服务和用户进程通信。简而言之,如果它是Linux中的一个模块,那么它就是微内核中的一个服务,表示一个隔离的进程。

不要将术语模块化内核与整体内核相混淆。一些单片内核可以被编译为模块化(例如Linux),重要的是模块被插入并从处理核心功能(内核空间)的相同空间运行。

微内核的优点是任何失败的服务都可以很容易地重新启动,例如,如果根文件系统抛出中止,内核就不会停止。不过,这也可以被视为一个缺点,因为它可以隐藏非常重要的错误(或者使它们看起来不那么重要,因为问题似乎会不断地自我修复)。它被视为一个巨大的优势,在某些情况下,一旦部署了某个组件,您就无法方便地修复它。

The disadvantage to a microkernel is that asynchronous IPC messaging can become very difficult to debug, especially if fibrils are implemented. Additionally, just tracking down a FS/write issue means examining the user space process, the block device service, VFS service, file system service and (possibly) the PCI service. If you get a blank on that, its time to look at the IPC service. This is often easier in a monolithic kernel. GNU Hurd suffers from these debugging problems (reference). I'm not even going to go into checkpointing when dealing with complex message queues. Microkernels are not for the faint of heart.

通往工作稳定内核的最短路径是整体方法。这两种方法都可以提供POSIX接口,在这种接口中,对于只想编写代码以在任何给定的设计上运行的人来说,内核的设计就变得没什么兴趣了。

我在生产中使用Linux(单片)。然而,我对内核开发的大部分学习、破解或修补都是关于微内核的,特别是HelenOS。

Edit

如果您已经读完了我冗长的回答,那么您可能会从“关于内核设计的伟大Torvalds-Tanenbaum之争”中获得一些乐趣。这本书在2013年读起来更有趣,距今已经20多年了。最有趣的部分是莱纳斯在最后一条留言中的签名:

Linus "my first, and hopefully last flamefest" Torvalds

显然,这和Tanenbaum关于x86将很快被淘汰的预言一样,都没有实现。

NB:

当我说“Minix”时,我并不是指Minix 3。此外,当我提到HURD时,我指的是(主要)Mach微内核。我无意贬低别人最近的工作。

其他回答

单片内核是一个内核,其中所有服务(文件系统、VFS、设备驱动程序等)以及核心功能(调度、内存分配等)都是一个紧密结合的组,共享相同的空间。这直接反对微内核。

微内核倾向于将核心功能与系统服务和设备驱动程序(基本上就是系统服务)隔离开来。例如,VFS(虚拟文件系统)和块设备文件系统(即minixfs)是在内核空间之外运行的独立进程,使用IPC与内核、其他服务和用户进程通信。简而言之,如果它是Linux中的一个模块,那么它就是微内核中的一个服务,表示一个隔离的进程。

不要将术语模块化内核与整体内核相混淆。一些单片内核可以被编译为模块化(例如Linux),重要的是模块被插入并从处理核心功能(内核空间)的相同空间运行。

微内核的优点是任何失败的服务都可以很容易地重新启动,例如,如果根文件系统抛出中止,内核就不会停止。不过,这也可以被视为一个缺点,因为它可以隐藏非常重要的错误(或者使它们看起来不那么重要,因为问题似乎会不断地自我修复)。它被视为一个巨大的优势,在某些情况下,一旦部署了某个组件,您就无法方便地修复它。

The disadvantage to a microkernel is that asynchronous IPC messaging can become very difficult to debug, especially if fibrils are implemented. Additionally, just tracking down a FS/write issue means examining the user space process, the block device service, VFS service, file system service and (possibly) the PCI service. If you get a blank on that, its time to look at the IPC service. This is often easier in a monolithic kernel. GNU Hurd suffers from these debugging problems (reference). I'm not even going to go into checkpointing when dealing with complex message queues. Microkernels are not for the faint of heart.

通往工作稳定内核的最短路径是整体方法。这两种方法都可以提供POSIX接口,在这种接口中,对于只想编写代码以在任何给定的设计上运行的人来说,内核的设计就变得没什么兴趣了。

我在生产中使用Linux(单片)。然而,我对内核开发的大部分学习、破解或修补都是关于微内核的,特别是HelenOS。

Edit

如果您已经读完了我冗长的回答,那么您可能会从“关于内核设计的伟大Torvalds-Tanenbaum之争”中获得一些乐趣。这本书在2013年读起来更有趣,距今已经20多年了。最有趣的部分是莱纳斯在最后一条留言中的签名:

Linus "my first, and hopefully last flamefest" Torvalds

显然,这和Tanenbaum关于x86将很快被淘汰的预言一样,都没有实现。

NB:

当我说“Minix”时,我并不是指Minix 3。此外,当我提到HURD时,我指的是(主要)Mach微内核。我无意贬低别人最近的工作。

'Monolithic' in this context does not refer to there being a single large executable, and as you say, there Linux supports the dynamic loading of kernel modules at runtime. When talking about kernels, 'monolithic' means that the entire operating system runs in 'privileged' or 'supervisor' mode, as opposed to other types of operating systems that use a type of kernel such as a 'microkernel', where only a minimal set of functionality runs in privileged mode, and most of the operating system runs in user space.

Proponents of microkernels say that this is better because smaller code means less bugs, and bugs running in supervisor mode can cause much greater problems than in user space code (such as a greater chance of having security vulnerabilities or total system crashes in the form of a 'kernel panic'). Some microkernels are sufficiently minimal that they can be 'formally verified', which means you can mathematically prove that the kernel is 'correct' according to a specification. L4 is a good example of this.

从维基百科:

单片内核是一种内核架构,其中整个操作系统都在内核空间中单独工作,并且是作为监督模式。与其他体系结构不同的是,单片内核单独定义了计算机硬件之上的高级虚拟接口,使用一组原语或系统调用来实现所有操作系统服务,如进程管理、并发性和内存管理本身,并将一个或多个设备驱动程序作为模块。

另一方面,Windows的最新版本使用了Hybrid内核。

混合内核是一种基于计算机操作系统中使用的微内核和单片内核架构的结合的内核架构。由于与单片内核的相似性,这个类别是有争议的;这个词被一些人认为是简单的市场营销。传统的内核类别是单片内核和微内核(纳米内核和外核被视为微内核的更极端版本)。

tl-dr -不,Linux一直是单片的。

Linux模块在某种意义上可能意味着模块化。正如其他人所注意到的那样,monolithic通常表示微内核而不是单片内核。传统的微内核只有这些特性,

调度 内存管理 进程间通信

在主内核中没有硬件驱动程序、协议栈、文件系统、挂起/恢复、时钟管理等。这些东西与任何用户任务都是相同的(尽管它们可能通过MMU/调度器具有不同的特权)。


Tanenbaum的预测

微内核是未来的趋势 x86将会消亡,RISC架构将主导市场 (5年后)每个人都将运行一个自由的GNU操作系统

PC和服务器程序员可能会笑,但对于现有的大多数手机来说,2和3确实是正确的。无论如何,如果黑莓QNX取得成功,塔南鲍姆是对的。

此外,许多l1管理程序在底层都有一个微内核。这是因为除了上下文切换之外,hypervisor通常不会做太多事情。

显然,三个因素预示着Linux的成功。;-)


微内核的一个论点是,所有单片子系统都需要在同一时间同步多个值。为了做到这一点,它们必须使用锁,并且在扩展到并行架构时将受到阿姆达尔定律的影响。计数器是微内核导致大量的IPC消息。

一个主要的发展是使用无锁编程来避免单片内核中的争用。这避免了单片内核中的锁定,同时也减少了IPC开销。最近,所有cpu都在扩展它们的ISA,为无锁算法包括更好的原语。因此,Linux可能在一段时间内仍将是一个单片内核。

单片内核意味着整个操作系统以内核模式运行(即由硬件高度特权)。即操作系统的任何部分都不能以用户模式(低权限)运行。只有运行在操作系统之上的应用程序才能以用户模式运行。

在非单片内核操作系统(如Windows)中,操作系统本身的很大一部分运行在用户模式下。

无论哪种情况,操作系统都可以是高度模块化的。