Content Entry

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

Published: 2016-06-22 Categories: Tips Tags: x86 MCE NMI SMI

x86发生无法恢复的硬件故障之后,会触发中断通知操作系统,这个中断是硬件直接触发的,而不是kernel或driver通过指令触发的。

与硬件故障有关的中断主要有两个:

  • MCE – Machine Check Exception (vector 18)
  • NMI – NonMaskable Interrupt (vector 2)
  • 还有个不常见的SMI – System Management Interrupt,后面再说。

MCE的中断优先级最高,它并不能涵盖所有的故障类型,主要有 memory, cache 和 system bus。其它常见的故障比如I/O卡通常不触发MCE。参考https://en.wikipedia.org/wiki/Machine-check_exception

如果硬件故障不是MCE,那么触发的中断就是NMI,这是服务器的硬件设计决定的,通过一个NMI pin(针脚)触发NMI中断。主流的服务器应该都是这种方式,参考https://en.wikipedia.org/wiki/Non-maskable_interrupt。使用NMI的缺点是NMI Status and Control Register的单字节状态无法精确指示故障位置,导致很难诊断,毕竟NMI不是专为处理硬件故障设计的。

需要注意的是x86 CPU结构本身允许硬件设计者触发其它类型的中断,比如有一位做存储设备的朋友就说他们的设备是触发SMI – System Management Interrupt,触发SMI中断以后,系统进入SMM模式-System Management Mode,这种特殊模式的设计初衷是给firmware/BIOS使用的,用于处理电源管理、硬件故障、安全功能等等。参见https://en.wikipedia.org/wiki/System_Management_Mode. 使用SMI的优点很明显:不占用已经被过度使用的NMI中断,但是使用SMI需要通过firmware实现,在一些专用设备比如磁盘阵列上可能会采用这种方式,在主流的服务器上还不常见。

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

x86 CPU的中断优先级

comments loading