我听别人说过,如果未受保护的内存在内核模式下超出安全墙,那么硬件就会受到损坏。
这是真的?
如果不是,当内核模式发生错误时会发生什么?
答案1
在内核错误的情况下会发生蓝屏死机。 这正是产生 BSOD 的原因:通过冻结系统来防止硬件损坏。 “无法解决的错误”有点模棱两可。KMODE_EXCEPTION_NOT_HANDLED 通常是在出现未知错误的情况下生成的。不过你的问题应该更准确。
答案2
写入 RAM,即使是随机数据,也不会损坏硬件。
如果系统在将文件或数据写入硬盘时发生中断,则驱动器上的数据可能会不一致。结果可能会丢失数据。但不会对设备造成物理损坏。
某些硬件设备对于 CPU 来说就像 RAM。一个现代示例是“本地 APIC”,它存在于几乎所有现代 x86 CPU 中。但是,在此处写入随机或意外数据不会造成硬件损坏,但可能会锁定您的系统。
控制系统风扇的软件在称为“SMRAM”的内存部分中运行。这部分通常完全无法被操作系统访问。在某些系统上可以重新激活它,但需要写入 MSR 和内存才能做到这一点。如果它失败了,所有现代 CPU 都会在过热时关闭。
写信给闪光即您的系统固件 (UEFI/BIOS) 所在的闪存,可能会阻止您的系统启动。从技术上讲,硬件没有损坏,但如果不物理地重新编程或更换固件闪存,您将无法启动系统。
操作系统可以更新闪存。但是,这需要实现一个协议来将数据发送到闪存,这意味着它并不像在某个 RAM 中写入那么简单。我相信通常实现的方式是 BIOS/UEFI 更新实用程序实际上将更新的固件写入 RAM 或闪存的保留区域,然后在下次启动时由 BIOS 本身刷新。在这种情况下,内核在 BIOS/UEFI 更新期间不运行,因此它无法执行任何操作。
UEFI 具有可读写的系统变量,并且这些变量的空间有限,并提供可更新这些变量的接口。有些主板存在一个问题,即写入的数据超过该空间的容量会导致固件损坏,重新启动时无法启动系统。这与内核崩溃无关,而是固件中的一个错误。
内核模式崩溃时会发生什么?某个程序(异常处理程序、Windows 内核工具中的函数或驱动程序)会调用 Windows API 函数KeBugCheckEx
:
无论系统崩溃的原因是什么,实际执行崩溃的函数都
KeBugCheckEx
记录在 Windows 驱动程序工具包 (WDK) 中。此函数接受一个停止代码(也称为错误检查代码)和四个参数,这些参数必须根据每个停止代码进行解释。
在
KeBugCheckEx
屏蔽了系统所有处理器上的所有中断之后,它会将显示切换到低分辨率 VGA 图形模式(所有 Windows 支持的视频卡都实现该模式),绘制蓝色背景并显示停止代码,然后显示一些文本以建议用户可以做什么。最后,
KeBugCheckEx
调用任何已注册的设备驱动程序错误检查回调(通过调用函数注册KeRegisterBugCheckCallback
),让驱动程序有机会停止其设备。然后,它调用已注册的原因回调(通过调用函数注册
KeRegisterBugCheckReasonCallback
),允许驱动程序将数据附加到崩溃转储或将崩溃转储信息写入备用设备。
之后还有几个步骤(如果我找到参考资料,我会更新)。总结一下,基本上它会禁用所有中断,调用任何在崩溃期间想要调用的驱动程序,调用任何添加或更改崩溃转储的驱动程序,然后写入崩溃转储信息并停止或重新启动。