驱动程序如何导致蓝屏?

Abh*_*eet 1 bsod drivers

驱动程序如何导致蓝屏?一些现实生活中经验丰富的例子会很好。我知道基本的东西,比如当操作系统遇到像 Divide-Fault 这样的严重错误时就会发生这种情况。当遇到上述错误时,我想知道更多与内核内存或内核行为相关的技术细节。

use*_*ser 7

考虑到操作系统在遇到此类错误时的正常操作过程是终止违规进程。

问题是,如果错误发生在内核边界内,你会怎么做你不能简单地杀死内核,因为即使有可能,这也会立即使系统崩溃,使操作系统无法报告出错的地方,重新启动(例如在没有内核独立的内核看门狗的情况下) 、存储诊断数据或任何其他在操作系统崩溃时被认为有用的东西。

所以操作系统做得第二好:它首先显示并可能存储诊断信息,然后进入某种状态,在这种状态下,控制权永远不会传出内核的特定部分。实际上,系统随后被冻结,因为在系统重新启动之前不会执行任何其他操作。内核可以执行诸如HLT指令之类的事情,进入无限循环,禁用输入中断,触发系统重启,或做任何其他合适的事情。

根据操作系统的不同,不同的事情可能会触发内核崩溃。一个可能的例子是在中断关闭的情况下执行时的页面错误;另一个是未通过先决条件或健全性检查的内核调用(IRQL_NOT_LESS_OR_EQUAL例如,这就是全部内容)。有关可以在 Windows 中触发 BSOD 的列表,请参阅MSDN上的 Windows 2000的 STOP 错误代码列表

在这种情况下,考虑内核边界内运行的内容的差异也很重要,因此有可能导致致命的系统崩溃,而不是简单地使单个进程崩溃。任何在内核之外(或者更准确地说,在 Intel 上,在 ring 0 之外)运行的任何东西都可能受到内核的限制,这就是为什么例如进程间内存保护和交换甚至可能或实用(每个进程被设置为只能访问自己的内存,由 CPU 强制执行,任何违规都会导致内核处理的页面错误,并可能导致请求的页面从交换中重新加载,或者内核抛出内存保护错误并终止违规进程)。在单片内核操作系统中,许多事情在内核边界内运行——这通常是为了提高性能,因为进出内核的上下文切换特别昂贵,但它给驱动程序程序员带来了巨大的负担,不要搞砸,因为任何错误(在在内核模式下执行时,不合时宜的时间,或永远,取决于错误的类别)是系统关键。相比之下,在微内核操作系统中,只有最少的代码在环 0(或等效项)中运行——通常,这仅限于诸如内存管理之类的事情,进程调度以及其他一些需要对整个系统进行该级别访问的东西——其余的东西在用户模式下运行,并通过定义良好的接口与内核通信。这样做允许使用与用户态进程相同的访问控制来保护与内核相关的代码,并使用正确定义的接口(例如,任何驱动程序都必须能够在正在运行的系统上加载时重新初始化相应的硬件,即使如果之前已加载驱动程序并且硬件设备处于潜在未知状态),则可以使用此方法。不利的一面是,所有这些上下文切换进出内核都会降低系统性能,据称这也是为什么在 Windows NT 4.0(与 NT 3.x 相比)中,Microsoft 将设备驱动程序移至 ring 0 而不是执行的一个重要原因比戒指 3。