极详细的ECC讲解

本文详细解析了Linux内核2.6.27版本中的ECC(Error Correction Code)实现,主要关注预计算的1字节列校验表nand_ecc_precalc_table的使用和计算过程,包括列极性和行极性的计算方法。通过理解ECC算法,可以用于提高数据存储的可靠性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ECC的全称是Error Checking and Correction,是一种用于 Nand 的差错检测和修正算法。如果操作时序和电路稳定性不存在问题的话, NAND Flash 出错的时候一般不会造成整个 Block 或是 Page 不能读取或是全部出错,而是整个 Page (例如 512Bytes )中只有一个或几个 bit 出错。 ECC 能纠正1 比特错误和检测2 比特错误,而且计算速度很快,但对 1 比特以上的错误无法纠正,对 2 比特以上的错误不保证能检测。
校验码生成算法:ECC 校验每次对 256 字节的数据进行操作,包含列校验和行校验。对每个待校验的 Bit 位求异或,若结果为 0 ,则表明含有偶数个 1 ;若结果为 1 ,则表明含有奇数个 1 。列校验规则如表 1 所示。 256 字节数据形成 256 行、 8 列的矩阵,矩阵每个元素表示一个 Bit 位。

其中CP0 ~ CP5 为六个 Bit 位,表示 Column Parity (列极性),
CP0 为第 0 2 4 6 列的极性, CP1 为第 1 3 5 7 列的极性,
CP2 为第0、 1 4 5 列的极性, CP3 为第2、 3 6 7 列的极性,
CP4 为第 0 1 2 3 列的极性, CP5 为第 4 5 6 7 列的极性。
用公式表示就是: CP0=Bit0^Bit2^Bit4^Bit6, 表示第 0 列内部 256 Bit 位异或之后再跟第 2 256 Bit 位异或,再跟第 4 列、第 6 列的每个 Bit 位异或,这样, CP0 其实是 256*4=1024 Bit 位异或的结果。 CP1 ~ CP5 依此类推。
行校验如下图所示



其中RP0 ~ RP15 为十六个 Bit 位,表示 Row Parity (行极性),
RP0 为第 0 2 4 6 ….252、 254 个字节的极性
RP1-----1、 3 5 7……253、 255
RP2----0 1 4 5 8 9…..252、 253 (处理 2 Byte ,跳过 2 Byte
RP3---- 2 3 6 7 10 11…..254 255 (跳过 2 Byte ,处理 2 Byte
RP4---- 处理 4 Byte ,跳过 4 Byte
RP5---- 跳过 4 Byte ,处理 4 Byte
RP6---- 处理 8 Byte ,跳过 8 Byte
RP7---- 跳过 8 Byte ,处理 8 Byte
RP8---- 处理 16 Byte ,跳过 16 Byte
RP9---- 跳过 16 Byte ,处理 16 Byte
RP10----处理 32 Byte ,跳过 32 Byte
RP11---- 跳过 32 Byte ,处理 32 Byte
RP12----处理 64 Byte ,跳过 64 Byte
RP13---- 跳过 64 Byte ,处理 64 Byte
RP14----处理 128 Byte ,跳过 128 Byte
RP15---- 跳过 128 Byte ,处理 128 Byte
可见,RP0 ~ RP15 每个 Bit 位都是 128 个字节(也就是 128 行)即 128*8=1024 Bit 位求异或的结果。
综上所述,对 256 字节的数据共生成了 6 Bit 的列校验结果, 16 Bit 的行校验结果,共 22 Bit 。在 Nand 中使用 3 个字节存放校验结果,多余的两个 Bit 位置 1 。存放次序如下表所示:



K9F1208 为例,每个 Page 页包含 512 字节的数据区和 16 字节的 OOB 区。前 256 字节数据生成 3</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值