在为小型 CLI 系统构建内核时,最好的选择是什么?
如果我无知的话,我不太了解微内核可以做什么:
在一种情况下,有单片内核允许用户在到达硬件之前控制服务,但这可能会损害内核本身。
另一方面,微内核做同样的事情,软件不会到达内核,但是由于它通过服务器直接与硬件对话,这是否会使其潜在的不稳定和不安全?
在为小型 CLI 系统构建内核时,最好的选择是什么?
如果我无知的话,我不太了解微内核可以做什么:
在一种情况下,有单片内核允许用户在到达硬件之前控制服务,但这可能会损害内核本身。
另一方面,微内核做同样的事情,软件不会到达内核,但是由于它通过服务器直接与硬件对话,这是否会使其潜在的不稳定和不安全?
理论上,通过将大部分驱动程序代码放入用户空间,微内核对攻击更具弹性:对一个驱动程序的攻击不能轻易地用于利用对其他驱动程序的访问,或获得内核级权限。此外,内核尺寸的减小使它的攻击面更小。
实际上,内核架构只是安全性的一个次要方面。设计人员对安全性和实施质量的关注会产生更大的影响。
不仅从理论的角度来看,微内核通常被认为更安全。通常,它们的功能比“通用”单片内核的功能更受限制,因此包含的错误更少,纯粹是因为它们的代码库更小。相反,您以高权限运行的代码越多,发生灾难的机会就越大。
从理论的角度来看,微内核本质上更安全的原因有几个关键点(前提是它被正确实现):
将驱动程序与内核(以及彼此)分离 - 失败/恶意的音频/网络驱动程序不会崩溃,甚至不会默默地修改内核(或其他驱动程序或用户应用程序)。这种分离的重要基石之一是通过消息传递而不是共享内存来实现IPC ,因为它允许内核清理传输的数据。显然,“常规”用户进程也是如此。与单片内核相比,它也是最大的性能损失之一。
作为独立进程的驱动程序可以在与微内核和根本不需要任何硬件访问的应用程序不同的保护环中运行。当然,这必须得到硬件的支持。
更精简的代码库允许对一些微内核进行形式验证,包括seL4 的端到端正确性(如果你问我,这是值得纪念的成就)。因此,一个写得很好的规范可能只会产生预期的结果。这使得关于上述实现的附录变得多余。
除此之外,微内核也更安全:可以重新启动发生故障的驱动程序而不影响系统的其余部分(这显然要求使用该驱动程序的应用程序对驱动程序故障具有一定的弹性)。这意味着客机中出现故障的显示驱动程序不仅无法关闭整个飞机控制系统,甚至不会导致需要花费几秒钟的时间进行完全重启(您在着陆时没有这种情况) ,在恶劣天气下起飞或飞行)。经典示例可以是INTEGRITY (178B) - 请注意,它(像许多类似的内核/系统一样)缺少动态内存分配之类的东西,这只是一种舒适,如果你想设置像硬现实这样的约束,你就必须忍受-在您的系统上执行。