闪存的一个特性就是随着闪存的使用以及数据存储时间的变长,存储在闪存里面的数据容易发生比特翻转,出现随机性错误。这个问题随着闪存制程的变小越发严重。因此使用闪存作为存储介质的固态硬盘,需要采用一些数据完整性的技术来确保用户数据可靠不丢失。常见的技术有:
-
ECC 纠错
-
RAID 数据恢复
-
重读(Read Retry)
-
扫描重写技术(Read Scrub)
-
数据随机化
读错误来源
闪存数据发生错误,主要有以下几个原因:
1.擦写次数增多
随着闪存块擦写次数增多,氧化层逐渐老化,电子进出存储单元越来越容易,因此存储在存储单元的电荷容易发生异常,导致数据读错误
2. 数据保留
随着时间的推移,存储在存储单元的电子会流失,整个阈值电压分布向左移动,导致读数据的时候发生误判
3.读干扰
读一个 Wordline 数据时,需要施加Vpass电压在其他 Wordline上,导致其他闪存页发生轻微写。如果读的次数过多,轻微写累积起来就会使阈值电压分布发生右移,导致读数据时候发生误判,即读数据错误
4.存储单元之间干扰
由于存储电子的浮栅极是导体,两个导体之间构成电容,一个存储单元电荷的变化会导致其他存储单元电荷变化,而受影响最大的就是它与相邻的存储单元。周围的单元是不同的状态时,中心单元的阈值电压是不一样的。
5. 写错误
写错误一般发生在MLC或者TLC 2-Pass(先写Lower Page,然后再写Upper page)写过程中。写Upper page的时候,它是基于之前Lower page的状态,然后再写每个存储单元到目标状态。如果写Upper page的时候,Lower page数据已经出错(注意写Upper的时候,Lower Page的数据是不会经过控制器ECC纠错的,写过程发生在闪存内部),就会导致存储单元写到一个不期望的状态,即发生写错误。
数据一开始就写错了,当然就别指望读对了。
TLC 1-Pass program则没有这个问题,因为Lower Page和Upper page是一次性同时写入,写Upper page不依赖于Lower Page数据。当然,如果一开始擦除状态就不对,那么还是会发生写错误。