为什么内核无法优雅地处理崩溃

use*_*675 0 linux kernel linux-kernel

对于用户模式应用程序,不正确的页面访问除了应用程序崩溃之外不会造成很多麻烦,并且可以通过异常处理来优雅地完成应用程序崩溃。为什么我们不能对内核崩溃做同样的事情呢?因此,当内核模块尝试访问某些无效地址时,就会出现页面错误并导致内核崩溃。为什么不能像卸载故障模块那样优雅地处理它。

更具体地说,我有兴趣知道这是完全不可能还是可能。我不愿意知道它在使用该系统时可能带来的困难。我知道驱动程序崩溃会导致设备无法使用,我对此表示同意。唯一的问题是是否可以优雅地卸载有故障的驱动程序。

Nem*_*ric 5

正如其他答案很好地解释了为什么从内核崩溃中恢复不可行一样,我将尝试讲述其他内容。

这个领域有很多研究,最著名的是教授。安迪·塔南鲍姆 (Andy Tanenbaum) 和他的 MINIX。虽然内核崩溃对于 MINIX 来说仍然是致命的,但 MINIX 内核非常简单(微内核),缩小了错误的空间,并且在其内部大多数其他东西(包括驱动程序)都作为用户模式进程运行。因此,如果网络驱动程序出现故障,由于它们运行在单独的地址空间中,内核所需要做的就是尝试重新启动驱动程序。

当然,有些区域您无法恢复(或仍然无法恢复),例如文件系统崩溃的情况(请参阅此处的最近讨论)。

关于这个主题有几篇很好的论文,例如http://pages.cs.wisc.edu/~swami/papers/thesis.pdf,我强烈建议观看 Tanenbaum 的视频,例如这个(标题是“MINIX 3:可靠的和安全操作系统”,以防它离线)。

我认为这解决了您的评论:

我们应该能够卸载有故障的模块。为什么我们不能?这是我的问题。这是安全性的设计选择还是根本不可能。如果是设计选择,是什么因素迫使我们做出这样的选择

如果图形驱动程序模块崩溃,您可以在没有屏幕的情况下生存。但是,我们无法卸载有故障的模块并继续,因为如果它崩溃并且它在与内核相同的地址空间中运行,您不知道它是否毒害了内核内存 - 安全性是这里的首要因素。