x86发生无法恢复的硬件故障之后…

x86发生无法恢复的硬件故障之后,会触发中断通知操作系统,相关的中断类型主要有两个:

另外还有两个必须提到:

  • PCIe AER – Advanced Error Reporting,这是PCIe的新特性,发生故障时可以通过中断报告故障的详细信息,需要硬件、BIOS和driver的支持才行,但现在仍有许多硬件不支持。
  • SMI – System Management Interrupt,这是给BIOS/firmware使用的一个特殊中断,这个中断不是直接给OS用的。触发SMI中断以后,系统进入SMM模式-System Management Mode,BIOS/firmware在这种特殊模式下进行电源管理、硬件故障处理等工作。在新的APEI(ACPI Platform Error Interface)标准下,硬件故障触发的中断可以不直接通知OS,而先通过SMI进入BIOS/firmware,让BIOS/firmware可以先行处理硬件故障,视情况再决定是否通知OS继续处理。这种模式称为Firmware First Model,在新的kernel上默认是打开的,可以这样检查:
    $ dmesg | grep -i apei
    [ 1.020287] GHES: APEI firmware first mode is enabled by WHEA _OSC.

发生无法恢复的硬件故障之后,硬件直接触发中断,而不是kernel或driver通过指令触发的。那么触发的是哪一种类型的中断呢?

  • 如果处于Firmware First Model(见上文SMI段落中的解释)
    先通过SMI中断进入BIOS/firmware,BIOS/firmware对故障进行处理之后再决定是否以中断的方式通知OS,并确定中断的类型。
  • 如果处于OS Native Model(即Firmware First Model关闭的情况)
    • CPU/memory/chipset的无法恢复的故障通常触发MCE中断;
    • I/O故障可能触发PCIe AER中断,前提是软硬件都支持;
    • 其它硬件故障统统触发NMI中断。

MCE的中断优先级最高,是专为硬件故障诊断而设计的,包含了关于故障的详细信息,有助于定位故障点,它并不能涵盖所有的故障类型,限于 memory, cpu cache 和 system bus。其它常见的故障比如I/O卡通常不触发MCE。

如果软硬件都支持的话,PCIe的故障会触发AER中断,它是专为PCIe硬件故障诊断而设计的,包含了故障的详细信息,方便诊断。但许多硬件尚不支持AER。

除此之外的各种无法恢复的硬件故障统统触发NMI中断。使用NMI的缺点是NMI Status and Control Register仅有的单字节状态无法精确指示故障位置,信息量很小,很难定位故障点,毕竟NMI不是专为处理硬件故障设计的。

与小型机相比,x86的硬件故障处理机制还存在很大的不足:
小型机上发生无法恢复的硬件故障会触发一个单一的中断,只要触发这个中断就可以断定是硬件故障,并且伴随中断提供了充分的故障信息,便于定位故障。不像x86这样有多种中断类型的可能,MCE和AER倒也罢了,最后所有其它类型的硬件故障都归入NMI,而NMI是一个过度使用的公用中断,软件也用、硬件也用,perf profiling也用,watchdog也用,而且NMI本不是专为故障诊断设计的,提供的故障信息量非常少,使得故障定位很难;即使是专门为方便故障诊断而设计的MCE和AER,在实践中定位故障也不容易,除非BIOS遵照规范提供了详尽的硬件槽位信息,这在多数通用机上没有做到,有些专用设备比如磁盘阵列什么的,为了方便售后服务在BIOS/firmware上作了很多工作,这才使得MCE和AER的故障定位容易了些。总的来说,x86的硬件故障处理机制像是打补丁拼凑出来的,缺乏整体性,还有漏洞,而且标准又不是强制性的,各厂商的产品都有差异,使得本来就漏洞百出的机制又打了折扣。Intel x86的RAS只是看上去很美而已。

注:SMI还可以被服务器用于电源管理、监测等功能,比如HPE Proliant Server的BIOS就把SMI用于CPU耗电监测(Processor Power and Utilization Monitoring)和内存故障预警(Memory Pre-Failure Notification)等。

注:我们在讨论“x86发生无法恢复的硬件故障”这个题目的时候,请注意触发中断是在硬件层面上发生的,某个硬件故障直接通过硬件针脚触发中断,并不是kernel或driver通过指令触发中断。虽然kernel和driver也可以通过指令触发NMI或SMI,但那是另一个话题–即“kernel或driver认为有故障而故意触发NMI或SMI”–我们在此不予讨论。

x86 CPU的中断优先级
x86 CPU的中断优先级