rocoa
驱动牛犊
驱动牛犊
  • 注册日期2008-08-28
  • 最后登录2008-09-22
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3395回复:6

请教一个Nand Flash坏块管理的问题

楼主#
更多 发布于:2008-08-28 13:50
没找到合适的版块,所以发到了这里。不合适之处望版主留情。

Nand Flash使用过程中会产生坏块,坏块的检测和坏块表的生成现在都没问题。
就是说标记坏快生成一张表记录了那些块好,那些块是坏的。

但有个问题始终不知道怎么处理。就说这个坏块表到底要存在哪儿?
如果我把这个表放在某个地方,而这个块刚好也坏了怎么办?那不就全完了,连坏块表都找不到了
如果保存多个坏块表(比如4个)在不同位置,但怎么去定位这些位置呢?毕竟起初需要一个入口,至少要保证读到一个正确位置然后索引出其他各种表及数据。
但所有的块都有可能坏,该怎么办?
axdududu
驱动牛犊
驱动牛犊
  • 注册日期2008-03-22
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望5点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-10-22 10:03
不好意思,看了nand_bbt.c代码,发现存放bbt的block每页的oob存放的不是ecc内容,这样我也不好判断了。

不过即便FLASH_BASED_BBT读取不正确,还有MEMORY_BASED_BBT,而且FLASH_BASED_BBT建立时也是根据MEMORY_BASED_BBT来生成的。

我的驱动里面只使用了MEMORY_BASED_BBT, lz如果有其他理解麻烦贴出来我也学习一下。 :)
axdududu
驱动牛犊
驱动牛犊
  • 注册日期2008-03-22
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望5点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-10-21 15:53
引用第4楼rocoa于2008-09-09 17:59发表的  :


厂商是只能保证出厂的时候block 0一定是好的吧,以后的使用过程中他们是不能保证的,多次擦写每个block都是有可能坏的,难道不是吗?


先贴一段英文
 A block should be marked bad if it cannot reliably hold data, i.e. if the block refuses to write or erase properly.

Normally, uncorrectable errors occur after there have been correctable errors for a while. When correctable errors start occurring, this is a sign that the block should be erased and rewritten.

你担心使用过程中block 0 会变为坏块,  坏块只有在写或擦失败时才会产生,而我们的block 0 只有在一种情况下会被擦、写:
你发现ecc correctable errors,为避免累积成为uncorrectable errors,你会把block 0 里面的内容读出来(或者直接在NAND FLASH内部copy back),这个时候你仍然能够读取bbt的正确内容。 然后擦完block0 把读出来的block 0数据写回去,这时可能会检测到block 0 为坏块,没关系,你手里有原block 0 正确的数据, block 0写不进去了,接着被标记坏块了,咱再往block 1 写就是了(当然这有可能牵扯到往上好几层的东西),对吧?

另外,存放bbt的块是不能用来存放数据的,它是bbt专用的。
rocoa
驱动牛犊
驱动牛犊
  • 注册日期2008-08-28
  • 最后登录2008-09-22
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-09-09 17:59
引用第2楼axdududu于2008-09-05 10:44发表的  :
厂商须要保证block 0 不是坏块,bbt可以存放在这里,当然也可以指定NAND_BBT_LASTBLOCK放在最后一个非坏块中。 看来是有些厂商保证最后一块不是坏块,个人理解。

如果使用了NAND_BBT_PERCHIP选项当然是分别为每片芯片建立bbt,存放在特定的块中(0 /LASTBLOCK /其他)。

其实如果没有使用NAND_USE_FLASH_BBT选项的话bbt是存放在内存中的,这种情况下bbt在设备初始化时建立, 可以看看nand_ecc.c中nand_scan_bbt函数
.......


厂商是只能保证出厂的时候block 0一定是好的吧,以后的使用过程中他们是不能保证的,多次擦写每个block都是有可能坏的,难道不是吗?
axdududu
驱动牛犊
驱动牛犊
  • 注册日期2008-03-22
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望5点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-09-05 10:46
我是做linux下的nand flash驱动,楼主在哪个系统下?
axdududu
驱动牛犊
驱动牛犊
  • 注册日期2008-03-22
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望5点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-09-05 10:44
厂商须要保证block 0 不是坏块,bbt可以存放在这里,当然也可以指定NAND_BBT_LASTBLOCK放在最后一个非坏块中。 看来是有些厂商保证最后一块不是坏块,个人理解。

如果使用了NAND_BBT_PERCHIP选项当然是分别为每片芯片建立bbt,存放在特定的块中(0 /LASTBLOCK /其他)。

其实如果没有使用NAND_USE_FLASH_BBT选项的话bbt是存放在内存中的,这种情况下bbt在设备初始化时建立, 可以看看nand_ecc.c中nand_scan_bbt函数

个人理解,共同学习
rocoa
驱动牛犊
驱动牛犊
  • 注册日期2008-08-28
  • 最后登录2008-09-22
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-09-02 10:37
没有人赐教一下吗?

高手帮忙解答下
游客

返回顶部