1.读错误来源
- 擦写次数增多
- Data Retension
- 读干扰
- cell之间的耦合电容的干扰
- 写错误
写错误主要发生在MLC或者TLC 2-pass的过程中,先写Lower Page,然后再写Upper Page,因为在写Upper Page的时候,它是基于之前的Lower Page的状态,如果Lower Page已经出错,写Upper的时候,Lower Page数据是不会经过ECC纠错的,就会导致写错误。有写错误自然会出现读错误。
2.重读(Read Retry)
发生电压平移的问题后,如果还用之前的参考电压去读取的话,就可能出现读取数据失败的情况,使用重读之后,可以不断更改参考电压,来找到正确的电压点。
3.ECC纠错
ECC纠错模块在SSD的主控上面,常用的ECC纠错算法有BCH和LDPC,后面会学。
用户数据都是写在页上面,页的空间除了用户空间,还有OP(Over Provisioning预留空间),这部分空间用于写ECC校验数据;
静态ECC纠错
ECC纠错单元和ECC校验数据的大小固定,所以纠错能力始终保持不变。
动态ECC纠错
根据需要的ECC能力调整ECC校验数据的在Page里面站的比例大小
4.RAID
当闪存中数据bit发生翻转的个数超出ECC纠错能力范围后,ECC纠错就无能为力了。这个时候就可以使用RAID来纠错,原理如下:
一块固态硬盘有5个Die,只需要将用户数据分成4份(每一份都不同)和校验数据同时写入5个Die中,Die 0~3存储的是用户数据,Die P则存储校验数据,为Die 0、Die 1、Die 2 和Die 3数据之“异或”。假设Die 1上出现ECC不可纠的错误,那么可以 通过读取Die 0、Die 2、Die 3和Die P对应位置上的数据,然后做“异 或”,就能恢复出Die 1上的数据。
5.数据随机化
在刚开始写Flash的时候,如果只是简单的把数据+纠错码写进去,就会遇到很多错误,有时候是写失败,有时候是读出来的数据数据失误率高,那就很有可能是数据没有随机化,Flash是通过控制栅极施加电压来存储数据的,不断的输入全0或者全1,容易导致Flash内部电子不均衡,从而导致信号抗干扰性下降,导致这些数据在Flash中的可靠性变差。
原因:
让0和1的分布充分隔离。
虚线是没有随机化的分布,会发现有些状态的分布变宽了,很容易和周边发生交集。实线是随机化后的分布,每个状态都充分隔离。
降低相邻单元Cell之间耦合电压产生的影响
对一个单元影响最大的是周围4个直接相邻的单元,这些单元会影响到中间单元的阈值电压,所以在SSD主控或者Flash中有数据随机化模块,对用户数据加入扰码,使“0”和“1”均衡。
数据随机化的存放位置
数据随机化放置于数据最终写到闪存之前,ECC加校验数据之后;在ECC纠错之前还需要数据去随机化。