蓝屏死机

来自 WinStory Wiki
跳转到导航 跳转到搜索
蓝屏死机
Microsoft Windows 的组件
文件:Windows11-10.0.22449.1000-BSOD.png
类型错误屏幕
推出于Windows 3.0 Build 55
Windows NT 3.1 1991 年 10 月版本

蓝屏死机(也称为蓝屏、错误检查、BSOD 或停止错误)[1]Microsoft Windows 操作系统中系统崩溃期间发生的屏幕的通用名称。当操作系统由于致命的系统错误而无法再安全运行时,会显示它。

历史

与普遍的看法相反,Windows 1.0Windows 2.x 没有崩溃屏幕。当早期 Windows 在较新版本的 MS-DOS 上运行时,它将输出“不正确的 DOS 版本”错误消息,然后在启动过程中将部分计算机内存内容喷入控制台缓冲区,这通常被认为是崩溃屏幕,尽管它只是徽标代码中存在的一个 bug。每当 Windows 崩溃时,通常会导致系统挂起或 shell 返回 DOS。

用于显示重要系统消息的用户界面最初是在 Windows 3.0 中引入的,主要由 386 增强模式下的虚拟设备驱动程序使用。这是文本模式下的全屏消息,它会挂起 Windows,直到用户通过按某个键将其关闭。最初,它使用黑色背景,但后来在 Windows 3.1 中更改为蓝色。除此之外,整个界面在经典 Windows 系列的其余部分产品中几乎没有变化。

在 Windows 3.x 中,这主要用于程序在用户执行操作之前无法继续运行的情况,例如设备冲突或磁盘交换。[2]但是,严重的系统错误仍会导致 Windows 以与旧 Windows 版本类似的方式退出回 MS-DOS。此接口还用于在 Windows 3.1 中实现的简单任务管理器,它允许用户终止无响应的程序或通过按 Ctrl+Alt+Del 重新启动系统,前提是 Windows 是在 386 增强模式下运行。当程序无响应时显示的消息最初是由 Steve Ballmer 编写的,这是后来由 Microsoft 开发人员 Raymond Chen 透露的。[3]

Windows 95 及更高版本特别使用用户界面来报告严重的系统错误,而不是退出到 DOS,这为其赢得了臭名昭著的“蓝屏死机”绰号。Windows 9x 系列的独特之处在于它允许用户在大多数系统错误后继续,尽管它通常会导致系统不稳定。[4]作为对其他错误对话框的类似更改的一部分,使用 Windows Me 更新了异常消息的措辞。

此界面的其他值得注意的用途还包括早期 Windows 98 版本中的 ACPI 子系统错误,这些错误将背景颜色覆盖为红色,或者 Windows Me 的早期版本在某一时刻短暂地将图形“安全关闭”屏幕替换为蓝屏。Windows Me 还用蓝屏替换了启动期间启动初始化错误(如保护错误)的 MS-DOS 黑屏错误。

Windows NT

在 Windows NT 上,蓝屏通常也称为停止错误(STOP errors),指的是将错误代码引入到 Windows 7*** STOP 标签。根据最初在 NT 内核中编写代码的开发人员 John Vert 的说法,该内核负责在文本模式下控制屏幕,因此选择蓝底白字是为了匹配 MIPS 的固件显示,以及当时许多 NT 开发人员使用的 SlickEdit 文本编辑器的默认配色方案。[5]

第一个已知实现蓝屏的版本是 1991 年 10 月版本。早期版本仅将错误代码打印到调试器(如果已附加),并在无限循环中触发断点。最初,系统崩溃只会导致错误代码被打印到屏幕上,尽管后来在 Windows NT 3.1 开发期间,它被扩展为显示堆栈跟踪和加载的驱动程序及其基址的列表。

此消息在 Windows 2000 中进行了简化,仅包含用户遇到蓝屏时的可能说明。此外,在内核本身中引入 VGA 驱动程序允许蓝屏以 640×480 图形模式显示,而不是传统的 80×50 文本模式 - 尽管 Build 17961814 中的初始实现存在 bug,导致文本绘制在黑色背景或启动屏幕图形的顶部。用户说明进一步更新,字体在 Windows XP 中更改为 Lucida Console。

Windows 8 的开发过程中,蓝屏发生了许多重大变化。在 Build 7788 左右,蓝屏进行了更新,以支持使用 VBE 2.0 和抗锯齿的更高分辨率。起初,这个更新的蓝屏只有在系统在启动过程中崩溃时才会出现,尽管它后来在 Build 7880 编译时的所有错误检查中得到了充分利用。在 Build 7899 中,它将很快被简化的黑屏所取代,后来在 Build 8045 中重新设计,增加一个悲伤的表情符号。[a]背景颜色后来在 Build 8064 中更改为浅蔚蓝色,然后在操作系统的后续版本中略有调整。

Windows 10 Build 14316.1000 中,蓝屏添加了一个二维码,该二维码链接到 Microsoft 的网站以诊断蓝屏错误。从 Build 14993 开始,预览体验成员版本的背景颜色更改为绿色,并略有措辞更改,以便能够快速区分预览体验成员和生产版本错误报告;尽管这可以通过在 HKLM/SYSTEM/ControlSet001/Control/CrashControl 键中使用 DWORD 值 DisplayPreReleaseColor 来关闭。在 Windows 10 2020 年 5 月更新及更高版本中,消息已更改为指代用户的设备,而不是用户的电脑。

Windows 11 Build 22000.51 中,错误检查的默认背景颜色暂时从蓝色更改为黑色,尽管预览体验计划中的用户仍保留绿色。此更改后来在 Build 22000.346 中恢复,尽管带有较深的蓝色阴影。二维码在 Windows Server Build 22463 中被丢弃了一小段时间,之后又恢复了。

实现

在经典 Windows 中,蓝屏由 Shell VxD 中的 SHELL_SYSMODAL_Message 例程实现。此例程将暂时停止系统,然后继续告诉显示驱动程序将显示切换到文本模式。它设置背景和前景色,清除屏幕并显示消息。然后,它会等待有效的按键,然后切换回图形模式并恢复操作。在 Windows 9x 上,它最常从 VWIN32.VXD 中的 VWIN32_BlueScreenPopup 调用,它显示了有关正在发生的异常的臭名昭著的消息。可以通过更改 SYSTEM.INI386Enh 部分下)中的 MessageBackColor(背景颜色)和 MessageTextColor(文本颜色)值来更改屏幕的颜色。

基于 NT 的系统上的蓝屏是在 KeBugCheckKeBugCheckEx 函数中实现的,这些函数包含在内核可执行文件中。这两个函数的区别在于,前者只接受错误检查代码作为整数参数,而后者还接受另外四个整数作为错误检查参数代码,根据错误检查代码的不同,它们可能具有不同的含义。在内核模式下运行的组件可以调用任一函数,以便在检测到可能导致数据损坏的致命不可纠正错误时以受控方式关闭系统。[6][7]然后,相应的功能负责切换到兼容的视频模式,渲染蓝屏本身,保存内存转储,如果启用,则重新启动系统。颜色在内核中硬编码,但可以使用NotMyFault等驱动程序进行更改。[8]

如果用户模式进程在 ntdll.dll 中使用带有 OPTION_SHUTDOWN_SYSTEM 标志的 NtRaiseHardError 系统调用来保持关闭权限,则还可以触发错误检查,这会将系统转换为内核模式,然后触发 FATAL_UNHANDLED_HARD_ERROR 错误检查。

图库

经典 Windows

Windows NT 4.0 及更早期版本

Windows 2000 到 Windows 7

Windows 8 及以后版本

Server 变体

  1. 悲伤表情符号不会显示在服务器版本或日语版本中。也可以通过更改 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl 中的 DisableEmoticon 注册表值来切换它。

引用资料