【问题标题】:Why is Linux called a monolithic kernel?为什么 Linux 被称为单片内核?
【发布时间】:2010-12-20 20:46:31
【问题描述】:

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

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

【问题讨论】:

    标签: architecture operating-system linux-kernel


    【解决方案1】:

    单片内核是一个内核,其中所有服务(文件系统、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 微内核。我无意贬低他人最近的工作。

    【讨论】:

    • 有趣的是,Linus Torvalds 在创建 Linux 时深受 Andew Tanenbaum 的 MINIX 的影响。但是,MINIX 基于微内核设计,而 Linux 使用单片内核。
    • @Martin Liversage:更多的是沮丧而不是受影响:) 我编辑了我的答案以反映这一点。
    • @DigitalRoss:回答完这个问题后你应该会看到我的收件箱,与 Minix 和 Mach 爱好者相比,Linus 是温顺的。
    • @p_l 我认为现在非常接近我们需要讨论微型、单体和混合之间的区别的时候了。这可能是一个很好的问题:)
    【解决方案2】:

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

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

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

    【讨论】:

    • Windows 绝对是一个单体内核。
    • @Adam:我不同意。旧式 16 位 Windows 单片内核,Windows 95 等也是如此。但是基于 NT 的 Windows 版本,包括所有服务器版本以及 Vista 和 7,显然是微内核或者可能是混合的,这取决于您使用的“微内核”定义。
    • 仅仅因为打印机驱动程序不在 ring0 中运行并不能使其成为微内核 :)
    • @caf:我建议你看看en.wikipedia.org/wiki/Windows_NT_kernelen.wikipedia.org/wiki/Comparison_of_operating_system_kernels。您会看到 Windows NT 及其后续版本,包括 Vista、7 和 Servers,被描述为“混合内核”。操作系统的两个大型子系统完全在用户模式下运行,而不仅仅是一个打印机驱动程序。 :-)
    • 我的评论有点半开玩笑——“混合”的名称似乎毫无用处。
    【解决方案3】:

    ;tl-dr - 不,Linux 总是单片的。

    Linux modules 在某种意义上可能意味着 modular。正如其他人所指出的,单片通常代表 微内核单片 内核。传统的微内核只有这些功能,

    1. 调度
    2. 内存管理
    3. 进程间通信

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


    Tanenbaum's predictions

    1. 微内核是未来
    2. x86 将消亡,RISC 架构将主导市场
    3. (5 年后)每个人都将运行免费的 GNU 操作系统

    PC 和服务器程序员可能会笑,但对于现有的大多数手机来说,二三肯定是正确的。如果 BlackBerry QNX 取得成功,Tanenbaum 在所有方面都是正确的。

    此外,许多L1-hypervisors 下方有一个micro-kernel。这是因为管理程序除了 context 开关之外通常不会做太多事情。

    显然,三个预言了 Linux 的成功。 ;-)


    微内核的一个论点是,所有的单体子系统都需要一次同步多个值。为了做到这一点,他们必须使用锁,并且在扩展到并行架构时会受到Amdahl's law 的影响。反之,微内核会导致大量 IPC 消息。

    一个主要的发展是使用lock-free 编程来避免单一内核中的争用。这避免了单一内核中的锁定,同时也减少了 IPC 开销。最近,所有 CPU 都在扩展它们的 ISA,以包含更好的 lock-free 算法原语。所以 Linux 可能会在一段时间内保持单一内核。

    【讨论】:

    • 是的,我知道塔南鲍姆的意思是赫德。但是GNU switched to Linux 所以措辞很有趣。
    • 为什么移动设备没有使用 x86?是什么让其他架构具有优势?
    • 是的,这些很重要。制作 x86 SOC(片上系统)很困难。没有标准的 HDL 代码来制作 SOC 供应商(Broadcom、飞思卡尔等)可以购买的 x86。
    【解决方案4】:

    来自Wikipedia

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

    另一方面,最新版本的 Windows 使用 Hybrid kernel

    混合内核是一种内核架构,它结合了计算机操作系统中使用的微内核和单片内核架构的各个方面。由于与单片内核的相似性,该类别存在争议;一些人认为这个词是简单的营销。传统的内核类别是单体内核和微内核(超内核和外内核被视为微内核的更极端版本)。

    【讨论】:

    • 如果我在内核空间做任何事情,我必须记住在某处使用“hybric kerkel”。 SCNR ;-)
    • Windows NT一直是一个混合系统。内核可能不是完全混合的,但您会遇到问题,您将其视为它的一部分(例如,winapi 被实现为用户空间服务)
    【解决方案5】:

    在这种情况下,'Monolithic' 并不是指存在单个大型可执行文件,正如您所说,Linux 支持在运行时动态加载内核模块。在谈论内核时,“单片机”意味着整个操作系统以“特权”或“主管”模式运行,而其他类型的操作系统则使用诸如“微内核”之类的内核,其中只有最小的一组功能在特权模式下运行,并且大部分操作系统在用户空间中运行。

    微内核的支持者说这更好,因为更小的代码意味着更少的错误,并且在超级用户模式下运行的错误可能会导致比在用户空间代码中更大的问题(例如在形式的“内核恐慌”)。一些微内核足够小,可以“正式验证”,这意味着您可以根据规范在数学上证明内核是“正确的”。 L4 就是一个很好的例子。

    【讨论】:

    【解决方案6】:

    单片内核是完全在单个地址空间中运行的单个大型进程。它是一个单一的静态二进制文件。所有内核服务都存在并在内核地址空间中执行。内核可以直接调用函数。基于单片内核的操作系统的例子有 Linux、Unix。

    我认为这篇文章将帮助您更多地理解这个概念。

    http://learnlinuxconcepts.blogspot.in/2014/03/what-are-monolithic-and-micro-kernels.html

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 2018-02-02
    • 2012-12-28
    相关资源
    最近更新 更多