为什么内核无法正常处理崩溃

时间:2015-09-18 05:47:55

标签: linux linux-kernel kernel

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

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

3 个答案:

答案 0 :(得分:4)

正如其他答案非常清楚地说明为什么从内核崩溃中恢复是不可行的,我会试着说出别的东西。

这个领域有很多研究,最值得一提的是教授。 Andy Tanenbaum和他的MINIX。虽然内核崩溃对MINIX来说仍然是致命的,但MINIX内核非常简单(微内核)缩小了bug的空间,而在其中大多数其他东西(包括驱动程序)作为用户模式进程运行。因此,如果网络驱动程序出现故障,因为它们在单独的地址空间中运行,所有内核需要做的是尝试重新启动驱动程序。

当然,在某些方面您无法恢复(或仍然无法恢复),例如文件系统崩溃(请参阅最近的讨论here)。

关于此主题有几篇好文章,例如http://pages.cs.wisc.edu/~swami/papers/thesis.pdf,我强烈建议观看Tanenbaum的视频this one(标题是" MINIX 3:可靠和安全操作系统"以防万一脱机)。

我认为这可以解决你的意见:

  

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

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

答案 1 :(得分:2)

有点像说"如果你将所有Java代码包装在try / catch块中,你就已经消除了所有错误!&#34 ;

有很多"错误"被捕获的,例如kalloc如果内存不足则会返回NULL,如果没有USB,则USB代码会返回错误等。但是整个操作都没有尝试/捕获系统,因为不是所有的错误都可以修复。

正如所指出的,如果您的文件系统模块崩溃会发生什么?继续运行没有文件?你的以太网驱动程序怎么样?现在你的盒子已经从互联网上切断了,你甚至不能再使用它了,但是它甚至不能重新启动。

所以尽管内核可能没有"崩溃"当模块崩溃时,内核的状态可以任意破坏。内核可以在没有屏幕,文件系统或互联网连接的情况下保持活着,但这是什么样的存在?

答案 2 :(得分:0)

内核模块和内核本身共享相同的地址空间。如果模块开始出现异常并且从另一个子系统覆盖内存,则根本没有保护。 因此,当驱动程序崩溃时,它可能会或可能不会保持对该驱动程序的本地。如果你很幸运,你仍然有一个功能有点的内核,可以继续工作。 用户空间不会发生这种情况,因为每个进程的地址空间是独立的,因此可以捕获错误的内存访问并停止进程(这是一个SEGFAULT)。