ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:152.12KB ,
资源ID:16053974      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-16053974.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(NANDFlash的坏块处理要点.docx)为本站会员(b****6)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

NANDFlash的坏块处理要点.docx

1、NANDFlash的坏块处理要点NAND Flash 的坏块处理产生坏块的原因是因为NANtFlash的工艺不能保证NAN啲MemoryArray 在其生命周期中保持性能的可靠, 所以,在NAN的生产中及使用过程中会产生 坏块。一、 坏块的具体表现:当编程 / 擦除这个块时,不能将某些位拉高,这会造成 Page Program 和 Block Erase 操作时的错误,相应地反映到 Status Register 的相应位。二、 坏块的种类:1. 先天性坏块这种坏块是在生产过程中产生的,一般芯片原厂都会在出厂时都会将坏块第一个page的spare area的第6个byte标记为不等于Oxff的

2、值。2. 后天性坏块这种坏块是在NAND Flash使用过程中产生的,如果 Block Erase或者Page Program 错误,就可以简单地将这个块作为坏块来处理,这个时候需要把坏块 标记起来。为了和先天性坏块信息保持一致,将新发现的坏块的第一个page的 spare area 的第 6 个 Byte 标记为非 Oxff 的值。三、坏块的处理理解了先天性坏块和后天性坏块后,我们已明白 NAND Flash出厂时在spare area 中已经反映出了坏块信息,因此,如果在擦除一个块之前,一定要 先 check 一下 spare area 的第 6个 byte 是否是 Oxff ,如果是就证

3、明这是一个 好块,可以擦除;如果是非 Oxff ,那么就不能擦除。不过,这样处理可能会错 杀伪坏块,因为在芯片操作过程中可能由于电压不稳定等偶然因素会造成 NAND 操作的错误。但是,为了数据的可靠性及软件设计的简单化,坏块一个也不能 放过。四、错杀坏块的补救方法如果在对一个块的某个page进行编程的时候发生了错误就要把这个 块标记为坏块,首先就要把其他好的page里面的内容备份到另外一个空的好块 里面,然后,把这个块标记为坏块。当发生 错杀 之后,我们可以在进行完页 备份之后,再将这个块擦除一遍,如果 Block Erase 发生错误,那就证明这个 块是个真正的坏块,放心的做好标记吧!最后需

4、要补充说明的是, 之所以要使用 spare area 的第六个 byte 作为坏块 标记,是因为NAND Flash生产商的默认约定,例如: Samsung,Toshiba,STMicroelectronics 都是使用这个 Byte 作为坏块标记的。NAND Flash 大容量存储器 K9F1G08U 的坏块管理方法 在进行数据存储的时候,我们需要保证数据的完整性,而 NAND Flash 大容量 存储器K9F1G08U芯片由于工艺上问题,不可避免就会出现有的 Block中就是某个位或某些位是块的,就是用块擦除命令也是无法擦除的, K9F1G08U 数据 手册也讲了坏块是存在的,对于 K9F

5、1G08U 最多有 20个坏块。如果数据存储 到这个坏块中,就无法保证该数据存储的完整性。对于坏块的管理 K9F1G08U 数据手册也有它的方法去处理该坏块的方法,我根据实际经验总结出自己的一 种方法。首先我们要定义一个坏块管理表: unsigned char BadBlockTable128,此数组可以存储 1024个 Block 状态,即每一个字节存储 8个 Block 状态。我们 要存储一批数据到 NAND Flash 中去某个 Block 时,先执行 Block 擦除操作, 然 后分析该Block的1st Page和2st Page中的每个位是否全是FFH,如果全是FFH, 则在Bad

6、BlockTable数组当前Block对应的字节位给置0,否则置1。如果是1 表示当前的块是不能存储数据的, 这时需要更换下一个 Block 来存储这些数据, 这样我们重复上面的动作分析再进行分析是否可以存储数据,该块能存储就存 储到该块中去。具体实现的算法程序如下:Flag=TRUE; while(TRUE=Flag) Erase_K9F1G08U_Block(K9F1G08U.HighAddress,K9F1G08U.LowAddress);Flag=Check_K9F1G08U_Block(K9F1G08U.HighAddress/64); if(TRUE=Flag)/is invali

7、d blockBadBlockTableK9F1G08U.HighAddress/512|= (1(K9F1G08U.HighAddress%8);K9F1G08U.HighAddress+=64;/Point to Next Blockelse/ is valid block ,record to BadBlockTableBadBlockTableK9F1G08U.HighAddress/512&= (1(K9F1G08U.HighAddress%8); for(i=0;iSIZEOF(BADBLOCKTABLE);I+)    & NBSP;&NB

8、SP;       &NBS P;      Write_RAM(RAM_BANK_0,K9F1G08U_BAD_BLOCK+i,BadBlockTablei);Nand Flash ECCNAND FLASH EC校验原理与实现ECC简介由于NANDFIash的工艺不能保证 NAN啲MemoryArray在其生命周期中保持 性能的可靠,因此,在NAND勺生产中及使用过程中会产生坏块。为了检测数据 的可靠性,在应用NANIFIash的系统中一般都会采用一定的坏区管理

9、策略,而 管理坏区的前提是能比较可靠的进行坏区检测。如果操作时序和电路稳定性不存在问题的话, NAND Flash出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个 Page (例如 512Bytes)中只有一个或几个bit出错。对数据的校验常用的有奇偶校验、 CRC校验等,而在NAND Flash处理中,一 般使用一种比较专用的校验一一ECCECC能纠正单比特错误和检测双比特错误, 而且计算速度很快,但对1比特以上的错误无法纠正,对 2比特以上的错误不 保证能检测。ECC原 理ECC 一般每256字节原始数据生成3字节ECC校验数据,这三字节共24比特 分成两部分

10、:6比特的列校验和16比特的行校验,多余的两个比特置 1,如下 图所示:I/O 7I-0 6I/O 5I/O 4I/O 3I/O 21/01l/OOP64P64r p32P32P16P16P8P8P1024P1024P512P512P256P256P128P128P4P4P2P2“P1PT11P8 P1024 : Line parity P1 P4 : Column parityECC的列校验和生成规则如下图所示:可而冋 网 |FT| 而 而用数学表达式表示为:P4=D7(+)D6(+)D5(+)D4 P4=D3(+)D2(+)D1(+)D0P2=D7(+)D6(+)D3(+)D2 P2=D5

11、(+)D4(+)D1(+)D0P1= D7(+)D5(+)D3(+)D1 P1=D6(+)D4(+)D2(+)D0这里(+)表示“位异或”操作ECC的行校验和生成规则如下图所示:1st bytebit7bitsbitsbit4bit3bit2bit1bitOpMP161-2nd bytebit7bit6bit5bit4bit3bit2bit1bitOP8P32 3rd bytebit7bitGbitsbit4bit3bit2billbitOP8*r iP16faP1C4th bytebit7bitebit5bit4bit3bit2bit1bitOIPSJ9Z253th bytebit7bite

12、bit5bit4bit3bit2bit1bitOP8P16254th bytebit7bitebitsbit4bit3bit2bit1bitOP8P32 P1C255th bytebit7bitebit5bit4bit3bit2bit1bitOP16256th bytebit7bitebitsbit4bit3bit2bit1bitOLbsJ匕 JpY pi1 p? |_piJ Hl I1B If lUP2 II P21 Ir P2 i丨巴1P4P41用数学表达式表示为:P8 = bit7(+)bit6(+)bit5(+)bit4(+)bit3(+)bit2(+)bit1(+)bit0(+)P8

13、J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J这里(+)同样表示“位异或”操作当往NAND Flash的page中写入数据的时候,每256字节我们生成一个ECC 校验和,称之为原ECC校验和,保存到PAGE勺00(out-of-band )数据区中。当从NAND Flash中读取数据的时候,每256字节我们生成一个ECC校验和, 称之为新ECC校验和。校验的时候,根据上述ECC生成原理不难推断:将从OOB区中读出的原ECC 校验和新ECC校验和按位异或,若结果为0,则表示不存在错(或是出现了 ECC 无法检测的错误

14、);若3个字节异或结果中存在11个比特位为1,表示存在一 个比特错误,且可纠正;若3个字节异或结果中只存在1个比特位为1,表示 OOB区出错;其他情况均表示出现了无法纠正的错误。ECC的英文全称是“ Error Checking and Correcting ”(错误检查和纠正), 从这个名称就可以看出它的主要功能就是“发现并纠正错误”。奇偶校验技术 一样,ECC纠错技术也需要额外的空间来储存校正码,但其占用的位数跟数据 的长度并非成线性关系。具体来说,它是以 8位数据、5位ECC码为基准,随后每增加一个8位数据只需另增加一位ECC码即可。通俗地讲就是,一个 8位 的数据产生的ECC码要占用5

15、位的空间,而一个16位数据ECC码只需在原来基 础上再增加一位,也就是6位;而32位的数据则只需再在原来基础增加一位, 即7位的ECC码即可,如此类推。ECC码将信息进行8比特位的编码,米用这种方式可以恢复 1比特的错误。 每一次数据写入内存的时候,ECC码使用一种特殊的算法对数据进行计算,其 结果称为校验位(check bits )。然后将所有校验位加在一起的和是“校验和” (checksum),校验和与数据一起存放。当这些数据从内存中读出时,采用同 一算法再次计算校验和,并和前面的计算结果相比较,如果结果相同,说明数 据是正确的,反之说明有错误,ECC可以从逻辑上分离错误并通知系统。当只

16、出现单比特错误的时候,ECC可以把错误改正过来不影响系统运行。工作原理 见图1。竝写入内再单无40 1(4 I0C蒐祈计校验和.并与2坯:家的昵诵U世讦比较lift1!0 11 -图1除了能够检查到并改正单比特错误之外,ECC码还能检查到(但不改正) 单DRAM芯片上发生的任意2个随机错误,并最多可以检查到4比特的错误。当 有多比特错误发生的时候,ECC内存会生成一个不可隐藏(non-maskable interrupt )的中断(NM),会中止系统运行,以避免出现数据恶化。显然ECC码的长度跟数据的长度是成对数关系,当数据长度在 64位以 上的时候,ECC码在空间占用上就会凸现优势。此外,E

17、CC校验最大的优点是如 果数据中有一位错误,它不但能发现而且可以对其更正, ECC校验还可以发现24位错误(不能更正),当然这样的情况出现的几率是非常低的。但 ECC码的校验算法比奇偶校验复杂不少,需要专门的芯片来支持,所以普通的电脑主 板不一定支持。而且因为系统需要时间来等待校验的结果,所以 ECC校验会降低系统速度 2%-3%左右,但这小小的代价换来系统稳定性的大大提高可以说事 非常值得的。注意:ECC不是一种内存类型,只是一种内存技术,不仅以前的 EDO内存可以有、SD内存也可有,现在主流的DDF内存同样可以有,所以在现在服务 器配置中我们都可见到“ 512MB ECC DD-R400

18、内存”之类的字样。那是因为它 并不是一种影响内存结构和存储速度的技术, 可以应用到不同的内存类型之中, 就象我们经常到的“奇遇校正”内存技术一样。ECC内存技术虽然可以同时检测和纠正单一比特错误,但如果同时检测 出两个以上比特的数据有错误,则无能为力。但随着基于 Intel 处理器架构服 务器的CPU生能呈几何级的倍数提高,而硬盘驱动器的性能同期只提高了 5倍。 因此为了获得足够的性能,服务器需要大量的内存来临时保存在 CPU上读取的数据。这样大的数据访问量就导致单一内存芯片上每次访问时通常要提供 4(32位)或 8( 64位)比特以上的数据。一次性读取这么多数据,出现多位数据错 误的可能性会

19、大大地提高,而 ECC又不能纠正双比特以上的错误,这样就很可 能造成全部比特数据的丢失,系统就很快崩溃了。 IBM的Chipkill技术是利用内存的子结构方法来解决这一难题。ECC算法的实现static const u_char nand_ecc_precalc_table =0x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a, 0x5a, 0x0f, 0x0c,0x59, 0x03, 0x56, 0x55, 0x00,0x65, 0x30, 0x33, 0x66, 0x3c, 0x69, 0x6a, 0x3f, 0x3f, 0x6a, 0x69,0x

20、3c, 0x66, 0x33, 0x30, 0x65,0x66, 0x33, 0x30, 0x65, 0x3f, 0x6a, 0x69, 0x3c, 0x3c, 0x69, 0x6a,0x3f, 0x65, 0x30, 0x33, 0x66,0x03, 0x56, 0x55, 0x00, 0x5a, 0x0f, 0x0c, 0x59, 0x59, 0x0c, 0x0f, 0x5a, 0x00, 0x55, 0x56, 0x03,0x69, 0x3c, 0x3f, 0x6a, 0x30, 0x65, 0x66, 0x33, 0x33, 0x66, 0x65, 0x30, 0x6a, 0x3f,

21、0x3c, 0x69,0x0c, 0x59, 0x5a, 0x0f, 0x55, 0x00, 0x03, 0x56, 0x56, 0x03, 0x00, 0x55, 0x0f, 0x5a, 0x59, 0x0c,0x0f, 0x5a, 0x59, 0x0c, 0x56, 0x03, 0x00, 0x55, 0x55, 0x00, 0x03, 0x56, 0x0c, 0x59, 0x5a, 0x0f,0x6a, 0x3f, 0x3c, 0x69, 0x33, 0x66, 0x65, 0x30, 0x30, 0x65, 0x66, 0x33, 0x69, 0x3c, 0x3f, 0x6a,0x6a

22、, 0x3f, 0x3c, 0x69, 0x33, 0x66, 0x65, 0x30, 0x30, 0x65, 0x66, 0x33, 0x69, 0x3c, 0x3f, 0x6a,0x0f, 0x5a, 0x59, 0x0c, 0x56, 0x03, 0x00, 0x55, 0x55, 0x00, 0x03, 0x56, 0x0c, 0x59, 0x5a, 0x0f,0x0c, 0x59, 0x5a, 0x0f, 0x55, 0x00, 0x03, 0x56, 0x56, 0x03, 0x00, 0x55, 0x0f, 0x5a, 0x59, 0x0c,0x69, 0x3c, 0x3f, 0

23、x6a, 0x30, 0x65, 0x66, 0x33, 0x33, 0x66, 0x65, 0x30, 0x6a, 0x3f, 0x3c, 0x69,0x03, 0x56, 0x55, 0x00, 0x5a, 0x0f, 0x0c, 0x59, 0x59, 0x0c, 0x0f, 0x5a, 0x00, 0x55, 0x56, 0x03,0x66, 0x33, 0x30, 0x65, 0x3f, 0x6a, 0x69, 0x3c, 0x3c, 0x69, 0x6a, 0x3f, 0x65, 0x30, 0x33, 0x66,0x65, 0x30, 0x33, 0x66, 0x3c, 0x69

24、, 0x6a, 0x3f, 0x3f, 0x6a, 0x69, 0x3c, 0x66, 0x33, 0x30, 0x65,0x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a, 0x5a, 0x0f, 0x0c, 0x59, 0x03, 0x56, 0x55, 0x00;/ Creates non-inverted ECC code from line parity static void nand_trans_result(u_char reg2, u_char reg3,u_char *ecc_code)u_char a, b, i, tmp1, t

25、mp2;/* Initialize variables */a = b = 0x80;tmp1 = tmp2 = 0;/* Calculate first ECC byte */for (i = 0; i ecc_code0 */ tmp1 |= b;b = 1;if (reg2 & a) /* LP14,12,10,8 - ecc_code0 */ tmp1 |= b;b = 1;a = 1;/* Calculate second ECC byte */b = 0x80;for (i = 0; i ecc_code1 */ tmp2 |= b;b = 1;if (reg2 & a) /* L

26、P6,4,2,0 - ecc_code1 */ tmp2 |= b;b = 1;a = 1;/* Store two of the ECC bytes */ ecc_code0 = tmp1;ecc_code1 = tmp2;/ Calculate 3 byte ECC code for 256 byte blockvoid nand_calculate_ecc (const u_char *dat, u_char *ecc_code) u_char idx, reg1, reg2, reg3;int j;/* Initialize variables */ reg1 = reg2 = reg

27、3 = 0;ecc_code0 = ecc_code1 = ecc_code2 = 0;/* Build up column parity */ for(j = 0; j 256; j+)/* Get CP0 - CP5 from table */ idx = nand_ecc_precalc_tabledatj;regl A= (idx & 0x3f);/* All bit XOR = 1 ? */if (idx & 0x40) reg3 A= (u_char) j; reg2 A= (u_char) j); /* Create non-inverted ECC code from line

28、 parity */ nan d_tra ns_result(reg2, reg3, ecc_code);/* Calculate final ECC code */ ecc_code0 = ecc_code0; ecc_code1 = ecc_code1; ecc_code2 = (reg1) 1) & 0x55;b = (d2 a (d2 1) & 0x55;c = (d3 a (d3 i) & 0x54;/* Found and will correct sin gle bit error in the data正好有ii个i*/if (a = 0x55) & (b = 0x55) & (c = 0x54)I/O 7I-0 6I/O 5I/O 4I/O 3I/O 2I/O1l/OOP64P64r p32P32P16P16P8P8JP1024

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2