ECC内存是如何发现错误并纠正
艾恩凝
简介
上层软件工作做多了,硬件方面的知识都不怎么学习了解了,本文学习了解ECC
ECC是什么
全称:Error Correcting Code,纠错校验码
核心作用:自动发现数据出错,还能自己修正错误,防止数据损坏、死机、文件丢包
错误检查
如果想要检测一组数据是否发生了错误,最简单的方法是 相同数据发送三次,如果其实有1bit出问题,通过对比数据就可以发现问题

如果同时发生两个bit翻转,那么就会把错误的数据,当成正确的

这个概率很低了, 这种方式最致命的不是纠错,而是带宽,如果要传输数据,有效的数据只有总量的三分之一,三分之二的数据都是纠错码,由此纠错码来了
奇偶校验
我们知道,数据都是二进制,只有0和1,我们通过在数据的开头增加一位纠错码

数出数据中1的个数,如果1的个数是偶数,那么纠错码就置为0,在所有数据中,使1的个数为偶数

如果数据中1的个数为奇数,那么纠错码就置为1,使所有数据保持1的个数为偶数

当接收方收到数据以后,如果数据中1的个数为偶数,数据就是正确的,如果1的个数为奇数,那么数据就是错的,需要重新传输一遍。
还有一种可能,如果纠错码发生了比特翻转,其实纠错码的作用是保证整个数据1的个数为偶数,纠错码不仅保护了数据,也保护了她自己本身,纠错码出错,1的个数的奇偶性也就变了,如下图,1的个数为奇数,所以数据错了。

奇偶校验不是用一个数据保护其他数据,而是通过一个数据改变整组数据的奇偶性,纠错码本身就存在这组数据中,但是这种方法存在一个问题,当数据错误后,需要发送方重新发送数据,会造成延迟,同时如果数据同时发生了多位比特翻转,单纯的奇偶性无法错处理两位比特翻转的数据错误,由此汉明码出现了
汉明码
汉明码是经典的线性分组纠错码,由理查德・汉明发明,也是ECC 纠错码里最基础、最常用的一种,主打检测 + 纠正 1 位错误、检测 2 位错误,目前大多数ecc内存使用的纠错码就是汉明码,用很少的纠错码对大量的数据进行错误的查找和纠正
接下来我们使用16bit的数据进行说明,为了方便理解,我们把他排列成4*4的数据矩阵

为了找到错误的数据,我们需要把这组4*4的数据分成几组,从交集中确认错误的数据位置在哪,一般来说,如果想要定位错误的数据,最常用的方法就是二分法,只对一半的数据检测,如果没有错误,则在另一半有错误数据,比如我们可以使用下图位置不作为原始数据,作为奇偶校验位,并且对右半边的位置进行奇偶校验

如果,右半边是正确的,那么错误就在左半边,我们还需要对错误进一步缩小范围,我们使用下图,位置作为校验位,并对二四列进行奇偶校验

这样你就会发现,通过这两组校验,就能知道哪一列的数据出错了
- 三四列数据校验通过,二四列数据校验通过, 错误在第一列
- 三四列数据校验通过,二四列数据校验不通过,错误在第二列
- 三四列数据校验不通过,二四列数据校验通过,错误在第三列
- 三四列数据校验不通过,二四列数据校验不通过,错误在第四例
这个时候,你会发现,错误数据的列确定了,那么同理,确定行的错误也是这样

一旦确定行和列的错误位置,通过交集就能锁定错误数据的位置信息,现在有一个新问题,我们是假设这些数据中有错误,但是我们并不知道数据里是否有错误,我们用左上角的位置,对全部数据进行奇偶校验,这样我们就可以知道所有数据是不是有错误

当然上面说的都是一个数据位发生了错误,如果有两个错误呢,其实我们可以通过确定行列的位置寻找错误数据位,并和全部数据进行校验就可以确定是不是有两位错误数据了,如果冲突就代表有两个数据位信息错了,那么就需要重新传输数据了,如果数据错误超过3位及以上,汉明码是不能够解决的
则移山填海之难,
终有成功之日!
——孙文
评论