来自doc.redox-os.org/book/ch04-1…
微内核
微内核通过在内核空间中提供最少的抽象而在其设计中脱颖而出。微内核强调用户空间,不像单体内核强调内核空间。
微内核的基本理念是任何可以在用户空间运行的组件都应该在用户空间运行。内核空间应该只用于最重要的组件(例如,系统调用、进程分离、资源管理、IPC、线程管理等)。
内核的主要任务是充当通信和进程隔离的媒介。内核应该提供对硬件的最小抽象(即驱动程序,它可以并且应该在用户模式下运行)。
与单片内核相比,微内核更安全,更不容易崩溃。这是由于驱动程序和其他抽象的特权较低,因此不会对系统造成损害。此外,微内核非常易于维护,因为它们的代码量很小,这可以潜在地减少内核中的错误数量。
微内核优势
-
模块化和可定制化
单片内核是单片的。它们不允许像微内核那样细粒度的控制。这是由于许多基本组件被“硬编码”到内核中,因此需要对内核本身进行修改(例如,设备驱动程序)。
微内核本质上是非常模块化的。您可以在运行时替换、重新加载、修改、更改和删除模块,甚至无需接触内核。
现代单片内核尝试使用内核模块来解决这个问题,但仍然经常需要重新启动系统。
-
安全
微内核无疑比单体内核更安全。微内核的最小原则是最小特权原则的直接结果,根据该原则,所有组件都应该只具有提供所需功能所绝对需要的特权。
单片内核中的许多安全关键错误源于在内核模式下不受限制地运行的服务和驱动程序,没有任何形式的保护。
换句话说:在单片内核中,当在 ring 0 中运行时,驱动程序可以不受限制地做任何事情
-
更少崩溃
与微内核相比,单片内核往往容易崩溃。单片内核中崩溃的驱动程序可能会使整个系统崩溃,而微内核则存在关注点分离,允许系统安全地处理任何崩溃。
在 Linux 中,我们经常看到驱动程序取消引用错误指针的错误,最终导致内核恐慌。
缺点
任何现代操作系统都需要基本的安全机制,例如虚拟化和内存分段。此外,任何进程(包括内核)都有自己的堆栈和存储在寄存器中的变量。在上下文切换上,即每次调用系统调用或完成任何其他进程间通信 (IPC) 时,都必须完成一些任务,包括:
- 保存调用者寄存器,尤其是程序计数器(调用者:调用系统调用或 IPC 的进程)
- 重新编程MMU的页表(又名TLB)
- 将 CPU 置于另一种模式(内核模式、用户模式)
- 恢复被调用者寄存器(被调用者:由系统调用或IPC调用的进程)
这些在微内核上并不是天生就慢,但是微内核不得不更频繁地执行这些操作。许多系统功能由用户空间进程执行,需要额外的上下文切换。
随着时间的推移,单体内核和微内核之间的性能差异已经被边缘化,使得它们的性能具有可比性。这部分是由于较小的表面积可以更容易优化。