爱子日志

内存纠错:奇偶性校验、ECC、Chipkill

内存纠错技术的发展过程

90年代初,内存体系采用奇偶性校验(Parity Verifying)技术。奇偶校验内存在每一字节(8位)外又额外增加了一位作为错误检测之用,BIOS中的监控程序会将存入内存中的数据位相加,并将结果存于校验位中。比如一个字节中存储了某一数值10011110,每一位加起来的结果为奇数(1+0+0+1+1+1+1+0=5),校验位存入1。当CPU读取储存的数据时,监控程序再次相加存储的8位数据,并将计算结果与校验位相比较。如果发现二者不同,系统就会产生出错信息。奇偶校验技术仅能粗略地检查内存错误,并不具备纠错能力。

另一种内存纠错技术叫做ECC(Error Correct Code,纠错码),它也是在原来的数据位上外加位来实现的,增加的位用来重建错误数据。在ECC纠错体系中,如果数据为n个字节,则外加的ECC位为log2n + 5。例如对于64位数据,需要外加log28 + 5 = 8个ECC位。

当出现一个存储位错误时,ECC体系可以自动进行纠错。当出现2个数据位错误时,可以检测出来,但不能纠错,这种行为通常称作“单错纠正/双错检测(Single Error Correction/Double Error Detection ,简称SEC/DED)。一次存取中有2个以上的数据位出错时,由于SEC/DED体系检测不出来了,致使数据的完整性受损。采用这种结构的存储器,当检测出多位错误时,系统就会报告出现了致命故障(Fatal fault),之后系统崩溃。

随着RAM芯片的集成度的提高和内存容量的增大,内存发生错误的概率也随之增加。几年前被认为很可靠的SEC/DED内存体系,今天已经力不从心了,寻求具有多位纠错能力的内存体系结构一直是众多厂商追求的目标。

1996年,Compaq公司的Advanced ECC技术实现了纠正单一内存芯片上的多位错误,也可以纠正内存条上单芯片的失效。1998年,惠普在LH3服务器产品中提出的自修复概念,主要内容也是内存的多位纠错能力。

Chipkill内存是IBM为NASA(美国太空总署)计划于2003年向火星发射的 “火星漫游者”探测器而设计的,2001年,IBM将这种Chipkill技术移植到“蓝色基因”服务器产品中,成为其面向电子商务的电子蜥蜴计划中的一个重要行动。接着DELL等厂商也纷纷在服务器中采用了这种内存体系。

Chipkill是一种具有自愈(Self-healing)能力的内存体系结构,在工作过程中进行自我测试(self-test)和自我诊断(self-diagnosis),如果某个RAM芯片或内存条损坏,可以向管理员报告出错信息,但机器仍可继续运行,管理人员可在适当的时候更换故障的零件。