睿达资讯
坏块来源主要包括:
出厂坏块(Factory Bad Block):
闪存从工厂出来,就或多或少的有一些坏块。
增长坏块(Grown Bad Block):
随着闪存的使用,一些初期好块也会变成坏块。变坏的原因,主要是擦写磨损。
闪存厂商在闪存出厂时,会对出厂坏块做特殊标记。一般来说,刚出厂的闪存都被擦除,里面的数据是全0xFF。但是对坏块来说,闪存厂商会打上不同的标记。
铠侠(KIOXIA)会在出厂坏块的第一个闪存页和最后一个闪存页的数据区第一个字节和Spare区第一个字节写上一个非0xFF的值。
用户在使用闪存的时候,首先应该按照闪存文档,扫描所有的闪存块,把坏块剔除出来、建立一张坏块表。
还有些闪存厂商,它会把坏块信息存储在闪存内部某个地方(掉电不丢失),用户在建立坏块表的时候,没有必要扫描所有的闪存块来识别坏块,只需读取闪存的那个特定区域。比如Micron,它的闪存内部有个叫OTP(One Time Programming)的区域,出厂坏块信息可以存在里面。
对增长坏块而言,它的出现会通过读写擦等操作反映出来。比如读到UECC(Uncorrectable Error Correction Code,数据没有办法通过ECC纠错恢复)、擦除失败、写失败,这都是一个坏块出现的症状。用户应该把这些坏块加入坏块表,不再使用。SSD的存储空间是闪存阵列,无论是Industrial M.2 SSD还是Industrial mini mSATA SSD一般都有几个并行通道,每个通道上连接了若干个闪存,看下图Agrade M.2 SSD,该SSD有四个通道,每个通道上挂了一个闪存Die。
SSD向四个Die 依次写入。假设 Die 1上有个 Block B是坏块,若固件采取坏块略过策略,则写完 Block A时,接下来便会跨过Block B写到Die2的Block C上面去。
与略过策略不同,当某个Die上发现坏块时,它会被该Die上的某个好块替换。用户在写数据的时候,不是跨过这个Die,而是写到替换块上面去。采用此策略,除正常用户使用的闪存块,还需额外保 留一部分好的闪存块,用于替换用户空间的坏块。整个Die上闪存块就划分为两个区域:用户空间和预留空间。
还是以上面的情况为例:用户写入数据时,当碰到坏块B,它不会略过 Die1不写,而是写到Block B的替换者 Block B’上面去。采用替换策略,SSD内部需维护一张重映射表(Remap Table):坏块到替换块的映射,比如B→B’。当SSD需要访问Block B时,它需要查找重映射表,实际访问的物理Block应该是B’。
我们看看两者策略的优劣 。
略过策略的劣势在于性能不稳定。以4个Die为例,略过策略可能导致Die的并行度在1和4个Die之间,而替换策略并行度总是4个Die,毋庸置疑,前者性能表现不如后者。但替换策略有木桶效应,如果某个Die质量比较差,则整个SSD可用的闪存块则受限于那个坏的Die。加入我们