关于yaffs2文件系统坏块产生总结报告

    前段时间一直在跟踪9000系列设备的坏块产生问题;异常设备为9000 3.0和解码器。
    两类异常设备均是由于异常访问而造成大量的坏块产生。

    针对异常设备的Flash数据(9000 3.0)主要进行了如下分析:
    1、检测坏块数据是否有出现过ECC纠正或者错误;
    2、检测坏块数据中OOB区关于yaffs2参数部分是否有出现过ECC纠正或者错误;
    3、检测坏块中是不是所有的页都有数据;        

    针对异常设备搭建环境拷机(9000 3.0和解码器)主要进行如下分析:
    1、检测访问yaffs2文件系统时是否出现ECC纠正或者错误(做为yaffs2坏块产生的条件,累加超过3次,回收时标记为坏块);
    2、检测访问yaffs2文件系统时是否出现读mtd接口异常(不做为yaffs2坏块产生的条件);
    3、检测访问yaffs2文件系统时是否出现写mtd接口异常(做为yaffs2坏块产生的条件,和ecc异常一起累加,超过3次,回收时标记为坏块);
    4、检测访问yaffs2文件系统时是否出现擦除mtd接口异常(做为yaffs2坏块产生的条件,擦除失败立马标记为坏块,除非标记也失败);
    5、检测访问yaffs2文件系统时第一次申请一块的一个页时是否出现写接口异常(做为yaffs2坏块产生的条件, 这个条件与条件3类似,但这个条件比较苛刻,一经出现,回收时标记为坏块,都不用累加);
    注:以上需要累加的标志对于同一个块来说,所有需要累加项均会累加到一个参数上,也就是说只要ECC异常和写异常一起累加超过3次,当前块就会被垃圾回收处理时标记为坏块。   

    Yaffs2文件系统中产生坏块的原因之一:读chunk数据时,ECC出现过纠正或者错误达到三次以上。
    Yaffs2文件系统在读页操作过程中,如果出现ECC纠正或者错误(包括整个页的数据区和OOB区),当前块就会被标记为优先回收块,同时也会标识当前系统下有要优先回收的块。垃圾回收进程回收垃圾块时会检测到当前系统有优先回收的块,垃圾回收机制对于优先回收块(一般标识为优先回收的块基本上都是有异常的块)回收必须满足两个条件:一是回收块为优先回收块;另一个是该优先回收块必须是最老的脏块。但对于运行中的文件系统来说,直接出现这种条件的可能性极低,所以垃圾回收机制对于这类型的块回收时采用的是优先回收最老的脏坏;只有当当前系统中所有的比这个优先回收块老的脏块都被回收过后,这个优先回收块才能变成最老脏块,也就是达到了优先回收的最老的脏块条件,从而被回收。从这里可以看出,垃圾回收机制并不是立马回收优先回收块,因为优先回收的块基本上都是出现过ECC纠正、错误或者写访问异常的块,这样的块本身访问就有可能出现异常,回收再复用的风险相对较大,所以yaffs2文件系统虽然标识其为优先,但实际操作中只有到没有可回收的最老的脏块时才回收它。
    如果一个块因三次以上的ECC纠正或者错误而被标记为坏块,那么说明当前这个块有出现过位反转,这里有两种情况:一是某些位一直位反转;二是某些位只是偶尔反转。针对第一种情况,我们可以直接检查坏块中的数据,看是不是产生过ECC纠正或者错误;针对第二种情况则无法进行有效的检测,因为我们不知道它什么时候会出现ECC异常,唯一的方法就是长时间的拷机检测。针对第一种情况,我有编写了一个检测ECC纠正与错误检测的工具,通过工具分析,9000 3.0设备所有的坏块中并没有出现任何ECC纠正与错误的情况(初步认定坏块不是由ECC异常造成);针对第二种情况,解码器拷机时并没有出现任何ECC异常的现象。

    Yaffs2文件系统中产生坏块的原因之二:写chunk数据时,底层接口访问异常(这种异常一般与控制器出现异常有关)。
    Yaffs2文件系统在写页操作过程中,如果出现底层接口访问错误,会分成两种情况处理。
    第一种情况:某一个块第一次被申请的情况。(注:这里有强调是第一次申请页,而不是当前块的第一个页被申请)
    当一个块第一次被申请时,yaffs2文件系统会检测当前申请的页的数据是不是全FF(包括OOB区数据);如果检查通过,则开始写数据,当写数据调用底层接口出错时,当前块就会被标记为优先回收块,同时也会标识当前系统下有要优先回收的块,此外标识当前块的其它chunk不再被分配出去,还有一个更重要的操作,就是标识当前块为坏块;回收的原则按照优先回收块的原则回收,只是最终这个块会被标记为坏块。出现这种情况会有一个很重要的特点:这个块很大机率只会在第一个页上有数据(可以作为检测的一个方向)。对于第一次申请chunk写成功的块,后续chunk出现异常按照第二种情况处理。
    第二种情况:某一个块非第一次被申请的情况。
    这种情况类似于ECC异常,当一个块调用底层写接口失败后(非第一次申请),当前块就会被标记为优先回收块,同时也会标识当前系统下有要优先回收的块,此外写异常次数会累加;情况同ECC异常,当前块写异常次数累加超过3次以上,垃圾回收时最终会标记为坏块。
    注意:ECC异常次数与写异常次数累加的是同一个值。
    针对第一种情况,在bootloader下使用nand dump命令查看9000 3.0设备中的坏块中的数据,在1400多个块中,有少部分坏块中只有第一个页上有数据,初步认定部分坏块是由写底层接口异常造成。
    针对第二种情况,解码器长时间拷机,yaffs2文件系统调用底层写接口经常出现错误调用,返回值为-5,表示IO访问出错。整个拷机过程中只有3个块是因为累积写访问次数超过三次而被标记为坏块的。
    关于上面的第二种情况,为什么经常出现底层写接口错误调用,但是因这种情况产生的坏块确很少?
    这是因为当某一个块出现写异常后,yaffs2文件系统会将这个块标记为优先回收,优先回收的块在没有被回收之前是不会再被使用的,这一点就减少了它的访问机会;另外,在讨论ECC异常的时候有说明,yaffs2文件系统的垃圾回收机制对于优先回收的块并不是立马回收,而是要等到所有最老脏块被回收后才回收优先回收的块;这种条件更加限定了优先回收块的访问机率;两者,如果还没有回收就出现关机(强制断电关机),那么先前的异常累积参数会被清零,必须重新开始累加。综合以上三点内容就可以很好的解释上面的问题了。对于长期运行且不会被断电的设备来说,这种情况下产生大量坏块可能性比较大。(注:ECC异常出现坏块也是同样的原理)

    Yaffs2文件系统中产生坏块的原因之三:垃圾回收块时的擦除操作失败。(这种异常一般也与控制器出现异常相关)。
    对于Yaffs2文件系统来说,只要当前Flash上有脏数据,就可以认为有垃圾回收操作;垃圾回收基本动作就是将回收块中的有效数据搬移到申请块中,再将回收块擦除;整个过程可以说是一个先写后擦除的操作,写的是新申请块,擦除的是回收块;如果擦除时出现异常,Yaffs2文件系统会立马将回收块标记为坏块(一个伪坏块产生)。
    通过解码器长时间拷机,Yaffs2文件系统调用底层擦除接口经常出现错误调用,返回值为-5,表示IO访问出错。整个拷机过程中因为擦除失败而出现了大量的坏块。        

    对于我们的系统来说,操作Flash的地方主要有以下几个方面(写与擦除):
    1、设置配置参数;
    2、执行同步命令sync,主要是刷新Yaffs2文件系统的checkpt机制信息;
    3、升级程序运行;
    4、垃圾回收程序回收脏块;垃圾回收时,将脏块中的有效数据搬移到新申请的块中,然后再擦除脏块;这个过程中同时出现了写和擦除访问。垃圾回收可以说是前三种的总和,前三种只要是执行了,那么必定会有要进行垃圾回收的脏块。
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值