Boo*_*ean 193 architecture operating-system linux-kernel
我读到Linux是一个单片内核.单片内核是否意味着将完整的内核代码编译并链接到可执行文件中?
如果Linux能够支持模块,为什么不将所有子系统分解为模块并在必要时加载它们?在这种情况下,内核最初不必加载所有模块,并且可以维护模块中函数的索引并在必要时加载它们.
Tim*_*ost 273
单片内核是一个内核,其中所有服务(文件系统,VFS,设备驱动程序等)以及核心功能(调度,内存分配等)都是共享相同空间的紧密组织.这直接反对微内核.
微内核更喜欢将核心功能与系统服务和设备驱动程序(基本上只是系统服务)隔离开来的方法.例如,VFS(虚拟文件系统)和块设备文件系统(即minixfs)是在内核空间之外运行的独立进程,使用IPC与内核,其他服务和用户进程进行通信.简而言之,如果它是Linux中的模块,那么它就是微内核中的一项服务,表明了一个孤立的过程.
不要将模块内核这个术语混淆为单一的.一些单片内核可以编译为模块化(例如Linux),重要的是模块插入并运行处理核心功能(内核空间)的相同空间.
微内核的优点是可以轻松地重新启动任何失败的服务,例如,如果根文件系统抛出中止,则没有内核停止.这也可以被视为一个缺点,因为它可以隐藏相当严重的错误(或使它们看起来不那么关键,因为问题似乎不断自我修复).它被视为一个巨大的优势,在您部署完成后无法方便地修复的情况.
微内核的缺点是异步IPC消息传递可能变得非常难以调试,尤其是在实现原纤维时.此外,仅跟踪FS /写入问题意味着检查用户空间进程,块设备服务,VFS服务,文件系统服务和(可能)PCI服务.如果你对此有所了解,那就该看看IPC服务了.在单片内核中这通常更容易.GNU Hurd遇到这些调试问题(参考).在处理复杂的消息队列时,我甚至不打算进入检查点.微内核不适合胆小的人.
通向工作稳定内核的最短路径是单片方法.这两种方法都可以提供POSIX接口,其中内核的设计对于想要编写代码以在任何给定设计上运行的人来说变得不太感兴趣.
我在生产中使用Linux(单片).但是,我对内核开发的大部分学习,黑客攻击或修补工作都进入了微内核,特别是HelenOS.
编辑
如果你通过我非常冗长的回答得到了这个,你可能会有一些乐趣阅读' 关于内核设计的伟大的Torvalds-Tanenbaum辩论 '.2013年,在它发生20多年后阅读它甚至更有趣.最有趣的部分是Linus在最后一条消息中的签名:
Linus "my first, and hopefully last flamefest" Torvalds
Run Code Online (Sandbox Code Playgroud)
显然,Tanenbaum预测x86很快就会过时,这种情况不会成真.
注意:
当我说"Minix"时,我并不暗示Minix 3.另外,当我提到HURD时,我正在引用(主要是)Mach微内核.我并不打算贬低别人最近的工作.
Ces*_*Gon 13
单片内核意味着整个操作系统以内核模式运行(即硬件具有高权限).也就是说,操作系统的任何部分都不在用户模式下运行(较低权限).只有操作系统顶部的应用程序才能以用户模式运行.
在非单片内核操作系统(如Windows)中,操作系统的很大一部分本身在用户模式下运行.
在任何一种情况下,操作系统都可以高度模块化.
来自维基百科
单片内核是一种内核架构,整个操作系统在内核空间中工作,并且单独作为管理员模式.与其他体系结构不同,1单片内核仅通过计算机硬件定义高级虚拟接口,具有一组原语或系统调用来实现所有操作系统服务,例如进程管理,并发和内存管理本身以及一个或多个更多设备驱动程序作为模块
另一方面,最新版本的Windows使用Hybric内核.
混合内核是基于微内核和计算机操作系统中使用的单片内核架构的各方面的内核架构.由于与单片内核的相似性,该类别存在争议; 这个术语被一些简单的营销所驳回.传统的内核类别是单片内核和微内核(纳米内核和外核被视为微内核的更极端版本).
; tl-dr - 不,Linux总是单片的.
Linux 模块在某种意义上可能意味着模块化.正如其他人所说,单片通常代表微内核而不是单片内核.传统的微内核只具有这些功能,
主内核中没有硬件驱动程序,协议栈,文件系统,挂起/恢复,时钟管理等.这些东西与任何用户任务相同(尽管它们可能通过MMU /调度程序具有不同的权限).
PC和服务器程序员可能会笑,但对于现有的大多数手机来说,两个和三个肯定是正确的.如果黑莓QNX取得成功,Tanenbaum将适用于所有帐户.
此外,许多L1管理程序下面都有一个微内核.这是因为除了上下文切换之外,超级遮阳板通常不会做太多.
显然有三个人预测Linux的成功.;-)
微内核的一个论点是,所有单片子系统都需要同时同步多个值.为了做到这一点,他们必须使用锁,并且在扩展到并行体系结构时将受到Amdahl定律的影响.计数器是微内核导致大量的IPC消息.
一个主要的发展是使用无锁编程来避免单片内核中的争用.这样可以避免锁定单片内核,同时还可以减少IPC开销.最近所有的CPU都在扩展其ISA,以包含更好的基元,用于无锁算法.因此Linux可能会在一段时间内保持单片内核.
在这种情况下,"Monolithic"并不是指有一个大型可执行文件,正如您所说,Linux支持在运行时动态加载内核模块.在讨论内核时,"单片"意味着整个操作系统以"特权"或"超级用户"模式运行,而不是使用某种内核的其他类型的操作系统,例如"微内核",其中只有最小的功能集以特权模式运行,大多数操作系统在用户空间中运行.
微内核的支持者认为这样做更好,因为较小的代码意味着更少的错误,并且在管理员模式下运行的错误可能导致比用户空间代码更大的问题(例如更大的机会出现安全漏洞或整个系统崩溃的形式'内核恐慌').一些微内核足够小,可以"正式验证",这意味着您可以根据规范在数学上证明内核是"正确的".L4就是一个很好的例子.