第五章 NAND闪存—闪存可靠性问题解决方案

        由于闪存存在不可靠因素,因此在系统层面的SSD软硬件上需要采取一些手段来解决闪存的不可靠问题。

5.3.1 ECC纠错

使用闪存ECC纠错引擎来纠正闪存数据出错位。

  1. 将数据A写入闪存前,先进行ECC编码,并把数据A+校验数据A一起写入闪存。
  2. 假如由于某些原因,闪存的数据发生了bit翻转,数据A变成了数据B。
  3. 读取用户数据的时候,数据B+校验数据B会经过纠错引擎,假如翻转的个数没有超过ECC的纠错能力,经过ECC纠错可以得得原始的数据A;假如翻转的个数超过了ECC的纠错能力,解码出来的将会是其他数据,此时假如没有其他纠错手段,用户数据A将会丢失。

        主流的纠错算法有,BCH、LDPC,BCH只支持硬解码,LDPC不仅支持硬解码,还支持软解码,纠错能力更强。

5.3.2 重读

        重读即为,当纠错算法通过ECC纠正不过来的时候,固件就采取改变施加在控制极的参考电压的方法进行若干次的读取。

        比如读干扰,会导致闪存页阈值电压整体向右偏移。以MLC为例,假设采用之前的参考电压每个状态都可能与参考电压发生重叠,导致读取的时候发生状态判别错误。如果这时候,将读取到的电压增大,各个状态不会和读取电压发生重叠,因此能正确读取数据。

        在实际场景中,阈值电压的分布不会像读干扰只是简单的右移,因此厂家会提供若干种读重读电压选项来帮助用户应对各种复杂场景。尽管如此,重复也非万能,假如相邻状态如果重叠在一起,就很难通过重读来恢复了。

5.3.3 刷新

        刷新是固件算中一种防患于未然的手段,一旦检测某个闪存页或闪存块上的出错个数比较多,ECC也能纠正的过来,但也会将这个闪存页或闪存块的数据搬移到新的地方避免以后发生更多的bit翻转ECC纠错模块无法纠正。刷新的具体步骤:

  1. 确定需要刷新的块:ECC纠错阈值触发:主控检测到某块的ECC错误率超过设定值(如SLC允许1bit/1KB,TLC允许40bit/1KB);定时触发:企业级SSD可能定期(如每月)扫描冷数据块。读干扰(Read Disturb):频繁读取相邻块可能导致电荷泄漏,需刷新受影响块。
  2. 读取原始数据:主控从目标块读取数据到DRAM缓存,同时进行ECC校验。若ECC可纠正,直接修复数据;若不可纠正(UE错误),尝试RAID式恢复。
  3. 擦除目标块:发送 NAND Erase Block命令(通常需要50-100ms/block)。块内所有位变为 0xFF(擦除后状态);磨损均衡:优先选择PE(Program/Erase)周期较少的块;坏块处理:标记无法擦除的块为坏块(更新BBT表)。
  4. 重新写入数据:原位写入:若块健康,直接写入修正后的数据(需确保无其他有效数据);异地写入(更常见):选择新块写入,更新FTL映射表(逻辑LBA → 新物理PBA)。
  5. 更新元数据:块健康状态(PEC、错误率);FTL映射表(逻辑到物理地址映射);TRIM标记:若刷新后原块数据无效,通知主机可回收(通过 fstrim 或自动GC)。

5.3.4 RAID独立磁盘冗余阵列

        假如闪存数据位翻转得过多,运用各种手段,ECC还是无法纠正,只能放大招,使用RAID独立磁盘冗余阵列,固态硬盘一般采用RAID5。

        假如,闪存有4个DIE构成,写入数据A~G时,采用异或生成校验数据:

Parity = A+B+C+D+E+F+G(其中+为异或操作)

        存储数据的时候,会将数据A~G联通Parity数据一并存储到闪存:

        假如后续读取C失败了,就可以使用其他数据来恢复C:

C = Parity+A+B+D+E+F+G

        采用RIAD5只能恢复单个ECC不可纠错的数据,假如出现多个ECC不可恢复的数据RAID也是无能为力的。RAID需要软硬件共同实现:

  1. SSD控制器需要支持RAID操作,即硬件需要支持异或功能。
  2. SSD需要利用控制器的RAID模块,综合闪存失效特征、硬件RAM资源、闪存资源的冗余空间等因素,设计合适的RAID算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值