全部博文(685)
分类: LINUX
2014-09-21 14:50:04
在讨论这个问题之前,我们先了解一下ECC原理。
上图是ECC原理图。
其中P1,P2,P4为列校验,其余为行校验.
校验的时候,根据上述ECC生成原理不难推断:将原ECC校验和新ECC校验和按位异或,若结果为0,则表示不存在错;若异或结果中存在11个比特(如是512B,则12个比特,以此类推)位为1,表示存在一个比特错误,且可纠正;若只存在1个比特位为1,表示原ECC出错;其他情况均表示出现了无法纠正的错误。
为了简单起见,我们先讨论只一个字节的情形,假设有一个字节,它的ECC较验码为:
p1=1,p1'=0, p2=1,p2'=0, p4=1,p4'=0,
现在假设它的Bit3出错,则新的ECC较验码为:
p1=0,p1'=0, p2=0,p2'=0, p4=1,p4'=1, (因为p1,p2,p4'包含了Bit3)
将新的p4,p2,p1与原始的p4,p2,p1异或,结果为011B,得知是Bit3出错.
同理,在多个字节的情形下,可以通过P8,p16,p32...找到出错的哪个字节.
下表是2440的ECC位示意:
当被校验的数据为512B时,只用到P1~P2048;
当被校验的数据为1024B时,用到了P1~P4096;
当被校验的数据为2048B时,则用到了P1~P8192;
在纠正时,根据P4,P2,P1组成一个字节,即为出错的位。将P8192,P4096,P2048,P1024,P512,P256...P8组成一个字,即为出错的字节.
知道哪个字节及哪一位出错后,就可以纠正了。