计算机硬件出错了会发生什么?

-回复 -浏览
楼主 2018-12-05 13:59:55
举报 只看此人 收藏本贴 楼主
点击上方“公众号” 可以订阅哦!

某天,你坐在电脑前,与游戏中的怪物奋战时,一个神秘的宇宙射线到达地球。它逃过臭氧层的阻隔,穿过你的身体,击中电脑的内存条。你因为吸收了宇宙射线的能量变成了奥特曼,你的游戏人物属性也因为内存某个bit的翻转实力爆表,一刀把大Boss斩于马下。怎么样,就问你刺激不刺激?

也许变身只存在于好梦中,但硬件错误却时时刻刻在发生:一个电源的浪涌,电磁干扰和辐射等等都可能让电脑中的某些部分发生错误,而我们却很少看到这个错误:

这是为什么呢?

其实硬件出错可以分为已被纠正的(Corrected)和不能纠正的(Uncorrected):

1. Corrected:硬件发生错误,但已经被硬件或者固件纠正,不需要操作系统做出动作。

2.Uncorrected: 硬件发生错误,不能被纠正。它又分为两种:Recoverable, 错误被限制在一定范围内,可以进行隔离恢复;Fatal,致命错误,除了重启别无他法。

硬件可以有很多种方法来纠正错误,本质上都是提供庸余。以ECC内存来举例,相对于奇偶校验位(Parity)技術,ECC通过附加额外的5个比特可以发现2个bit错误或者纠正1个bit错误。内存的Mirror技术,利用双备份内存,发现并纠正错误的出错的内容。如此种种,电脑硬件/固件利用各种庸余来发现和纠正错误。

那是不是纠正了就完了呢?实际上除非偶然的浪涌产生的错误,因为制造工艺、老化等产生的错误有愈演愈烈的趋势。这次的一位错误被纠正了,不加处理和重视,下次可能产生两位错误,那时就有可能从Corrected变成Uncorrected!

Intel的CPU利用MCE和CMCI来向操作系统报告错误;PCIe子系统有标准的AER来报告错误;其他的硬件部分由BIOS通过WHEA/APEI来通知操作系统。下面我们重点来介绍MCE/CMCI。

MCE/CMCI

Intel从奔腾4开始的CPU中增加了一种机制,称为MCA——Machine Check Architecture,它用来检测硬件(这里的Machine表示的就是硬件)错误,比如系统总线错误、ECC错误等等。这套系统通过一定数量的MSR(Model Specific Register)来实现,这些MSR分为两个部分,一部分用来进行设置,另一部分用来描述发生的硬件错误。 

当CPU检测到不可纠正的MCE(Machine Check Error)时,就会触发#MC(Machine Check Exception),通常操作系统会来处理#MC,它通过读取MSR来收集MCE的错误信息,并产生上面第一个蓝屏。当然由于发生的MCE可能是非常致命的,CPU直接重启了,没有办法完成MCE处理函数;甚至有可能在MCE处理函数中又触发了不可纠正的MCE,也会导致系统直接重启。

当然CPU还会检测到可纠正的MCE,当可纠正的MCE数量超过一定的阈值时,会触发CMCI(Corrected Machine Check Error Interrupt),此时软件可以捕捉到该中断并进行相应的处理。CMCI是在MCA之后才加入的,算是对MCA的一个增强,在此之前软件只能通过轮询可纠正MCE相关的MSR才能实现相关的操作。

1

MC BANK

每个逻辑CPU实现了一整套错误属性、状态和控制寄存器。

它分为左右两个部分,左边的是全局的寄存器,右边表示的是多组寄存器(Banks)。全局相关的寄存器组定义了如何开启 MCA 的能力。Bank的数目由IA32_MCG_CAP MSR里面的Count来决定

每一个BANK则具体对应一类错误源,如 CPU,MEMORY,CACHE,CHIPSET 等等。每一个BANK都可以进行单独的控制,这样软件就能够针对每一个BANK使用特定的方式进行处理。

随着越来越多的器件被整合进入CPU,Bank的数目也有越来越多的趋势,详细可以参阅芯片的Spec。

2

CMCI

Corrected machine-check error interrupt (CMCI) 是在酷睿CPU时引入的新特性,叫做eMCA。不同于原先需要操作系统来轮询(Polling)MC Bank的方式,CMCI 提供了一种机制,当corrected error发生侧次数到达阀值的时候,就会发送一个信号给本地的CPU来通知系统软件。当然,系统软件可以通过IA32_MCi_CTL2 MSRs来控制该特性的开关。

操作系统可以选择合适的Error count从而在问题严重了才让硬件报告,并在CMCI的local APIC的LVT Entry中填入合适的中断向量号码和模式等(中断介绍传输门

WHEA和APEI

看过了可纠正的错误,那么其他错误的处理呢?其实,更重要的问题是,可纠正和不可纠正错误发生了,不能简单的重启了事,错误的原因应该被记录和报告出来,便于管理员找出问题点。可纠正的错误我们可以记录在系统日志中,因为系统还可以使用。但是发生不可纠正的致命错误后,系统处于不稳定状态,谁来记录呢?这是个大问题。

因为服务器系统对可靠性的要求,微软很早就提出Windows Hardware Error Architecture(WHEA),主要用于服务器操作系统Windows Server系列。它一改以往由BIOS和BMC对错误进行单独处理,OS不知情的状态:

WHEA通过扩展ACPI,加入了四个table,用于固件向OS报告错误源,记录错误和注入错误,改进后的系统框图如下:

注意PCI和CPU都有自己的LLHEH来出来MCE和AER。

由于WHEA的成功,ACPI 4.0引入了它的几乎全部,只是给了个新的身份证(GUID)并起了个新的名字:APEI(ACPI Platform Error Interface)。毕竟WHEA里面的Windows并不合适作为工业标准的名字。

WHEA/APEI十分复杂,我们会在今后单独撰文介绍。

结论

硬件的纠错机制会让细微的偶然错误化于无形,看来依靠宇宙射线属性+100000的美梦并不现实。但同时也避免了数据的错误,帮助计算机系统健康稳定运行。也许我们可以打开Windows的系统日志看一下,你可能会发现计算机真是雷锋,做好事不留名!


我要推荐
转发到

友情链接