3

如果一个程序违反了它的指令路径和/或内存数据,由于程序在“虚拟机”(如操作系统的空间)中运行并且无法确定其下一条指令,操作系统会通过一些消息将其暂停。

实习生的操作系统也是一个程序,与任何其他程序一样共享机器资源,并且可以以类似的方式停止,有时它足够健康,可以显示一些调试信息和蓝屏。因此,作为一名程序员,我在想,如果我能做到这一点 - 发出调试信息并使屏幕变蓝,为什么我不能尝试完全恢复操作系统而不是要求冷重启?毕竟它的操作系统 - 它应该是所有软件的坚如磐石的基础(当然不是在谈论 Windows),如果航天飞机运行 Windows 那么会发生什么 - 它不会恢复?:)

那么:仅仅是 MS 没有采取一切措施来恢复到不需要重新启动的程度,还是其他一些更深层次的问题阻止了像 MS 这样的公司无法做到这一点?

4

2 回答 2

3

这不是微软特有的。Linux 有内核恐慌机制,OS X 有内核恐慌机制。我希望每个非玩具操作系统内核在检测到内部损坏时都有某种恐慌机制。损坏可能来自硬件故障、软件故障、伽马射线恰到好处地击中内存板,谁知道呢。

内核恐慌背后的全部意义在于认识到不应该出错的事情已经出错了。还有什么可能是无效的?根据崩溃发生的位置,同步和卸载文件系统可能不安全,因为这可能会将损坏的数据覆盖在驱动器上的良好数据上。

写入视频卡是通知用户事件的好方法(无论如何,许多系统都连接了监视器)并且写入视频卡不太可能破坏磁盘上的数据:IOMMU 会出现相当大的错误或页表损坏,以至于它们引用磁盘上的文件,并且大多数操作系统会在内核崩溃后拒绝写入块设备,以不惜一切代价保护用户数据。

考虑一下您可以做些什么来使系统恢复运行状态?您需要拆除所有可能与损坏的内核数据结构相关联的应用程序。您需要以正确的顺序重新启动应用程序,以恢复系统服务。重新启动是可靠地完成这两件事的一种非常简单的方法。

于 2011-05-27T02:10:13.670 回答
2

您无法恢复操作系统的原因与用户空间程序无法恢复的原因相同——当看到某些类型的错误时,这意味着您的程序处于未定义状态,因此无法恢复。即使问题在某种意义上不是致命的(即不会导致程序立即死掉),继续下去也不安全,因为事情已经或可能已经损坏。

例如,无论是用户空间程序还是操作系统内核,例如缓冲区溢出或混乱的指针都会导致堆栈损坏。程序应该如何从中恢复?当当前正在执行的函数结束时堆栈被炸毁,它将返回到哪里?退货地址可能已经消失了。怎么办?

而且不仅仅是微软。听说过 Unix 中的“内核恐慌”吗?

于 2011-05-27T02:05:58.150 回答