如果某个程序违反了其指令路径和/或内存数据,操作系统会暂停某些消息,因为程序在“虚拟机”中运行,如操作系统的空间,并且无法确定其下一条指令。
操作系统也是一个程序,与任何其他程序共享机器资源,并且可以以类似的方式停止但它有时足够健康,可以显示一些调试信息和蓝屏。所以作为程序员,我在想,如果我能做到这一点 - 发出调试信息并使屏幕变蓝,为什么我不能尝试完全恢复操作系统而不需要冷重启?毕竟它的操作系统 - 它应该是所有软件的坚实基础(当然不是谈论Windows),如果航天飞机运行Windows那么会发生什么 - 它将无法恢复?:)
所以:只是MS没有注意尽力恢复到不需要重启的地步,还是其他更深层次的问题阻止像MS这样的公司无法做到这一点?
答案 0 :(得分:3)
这与微软没有任何关系; Linux具有kernel panic机制,OS X具有kernel panic机制。我发现当检测到内部损坏时,每个非玩具操作系统内核都会有某种恐慌机制。腐败可能来自错误的硬件,有缺陷的软件,伽玛射线正确地撞击内存板,谁知道。
内核恐慌背后的重点是认识到不应该出错的东西出错了。还有什么可能无效?根据发生崩溃的 where ,同步和卸载文件系统可能不安全,因为这可能会在驱动器上的良好数据上写下损坏的数据。
写入视频卡是告知用户事件的好方法(许多系统都连接了监视器),写入视频卡不太可能损坏磁盘数据:这将花费相当大的错误对于IOMMU或页面表如此损坏,以至于它们引用磁盘文件和大多数操作系统在内核崩溃后拒绝写入块设备以试图不惜一切代价保护用户数据
考虑一下如何使系统恢复运行状态?您需要拆除可能与损坏的内核数据结构相关联的所有应用程序。您需要以正确的顺序重新启动应用程序,以恢复系统服务。重启是一种非常简单的方法,可以可靠地完成这两件事。
答案 1 :(得分:2)
由于用户空间程序无法恢复的原因,您无法恢复操作系统 - 当看到某些类型的错误时,这意味着您的程序处于未定义状态,因此无法恢复。即使问题在某种意义上并不致命(即不会导致程序立即死亡),但由于事情已经或可能已经损坏而继续下去是不安全的。
例如,无论是用户空间程序还是OS内核,例如缓冲区溢出或乱搞指针都会导致堆栈损坏。程序应该如何从中恢复?当当前正在执行的函数结束时,使用一个烧坏的堆栈,它将返回到哪里?返回地址可能已经消失。怎么办?
而且不仅仅是微软。曾经听说过Unix中的“内核恐慌”吗?