基于NAND Flash 固态硬盘的坏块管理方法

2022-12-01 06:00李中周加谊曹睿
电子设计工程 2022年23期
关键词:结构图基准线固态

李中,周加谊,曹睿

(中国兵器装备集团自动化研究所有限公司,四川 绵阳 621000)

在大数据时代的今天,数据传输量越来越大,数据传输速度要求越来越高,机械硬盘的传输速度已经不能满足现状,固态硬盘迎来了发展机会,使用场景越来越多。固态硬盘存储介质NAND Flash 与传统磁性存储介质相比,具有低功耗、抗震动、无噪声的特点。但是NAND Flash 存在擦除寿命限制,当擦除次数超过阈值时,NAND Flash 变得不可靠;MLC NAND Flash 的Block 最大擦除次数仅3 000 次,TLCNAND Flash Block 擦除寿命只有1 000 次;同时由于制造工艺和使用环境等因素,NAND Flash 出厂时就存在坏块,随着使用过程中擦除Block 次数的增加,产生了新的坏块,导致坏块不断增加。这些坏块不能可靠存放数据,因此在使用时需要先对坏块进行管理。

1 固态硬盘结构

从固态硬盘结构图可知,固态硬盘(solid state disk)[1]由控制单元(主控芯片)和存储单元(NAND Flash)组成,主控芯片和NAND Flash 之间一般采用多通道(channel)连接,数据最终存放在NAND Flash颗粒中。固态硬盘存储数据,在NAND Flash 颗粒上体现为电荷的存储。固态硬盘对数据的读、写、擦操作,其最终在NAND Flash 颗粒上表现为颗粒单元的充电放电;而颗粒单元不断的充电放电会导致颗粒单元绝缘层被击穿,不能可靠存储电荷,从而出现坏块。坏块不能可靠地存储数据,需要进行管理。为避免数据存储在坏块中,该文提出NAND Flash 坏块管理算法,通过在固态硬盘主控芯片内部RAM 中分配空间,采用1 位信息与一个Block 对应(“0”表示好块,“1”表示坏块),建立坏块表标记所有Block 状态的方法,对固态硬盘的高速传输、多通道传输进行了改进和优化,可以避免在读写过程中操作到坏块。固态硬盘结构图如图1 所示。

图1 固态硬盘结构图

2 NAND Flash物理结构

图2 所示是镁光一款NAND Flash 颗粒结构图,以此为基础简单介绍NAND Flash,仅用作参考,不同型号的NAND Flash 颗粒存在差异[2]。

图2 NAND Flash 颗粒结构图

由图2 NAND Flash 结构图可知,NAND Flash 由Logic Unit(LUN)、plane、Block、page 组成。page:对于固态硬盘,page 是读和写操作的最小单位,一个page 大小等于4 K 加224 byte;224 byte 数据空间又名spare data 区域,用于存放ECC 校验数据和固态硬盘算法信息,同时标记NAND Flash 的出厂坏块信息和使用过程中该Block 的属性;Block:NAND Flash擦除是以Block 为单位,一个Block 中存放着256 个page;固态硬盘软件算法采用逻辑Block 和物理Block 映射,能够解决NAND Flash 读写单位和擦除单位不对称的问题,同时也能提高固态硬盘的读写性能。plane:是将LUN 中所有Block 分为两个部分,1 plane 有2 048 个Block,偶数部分为plane0,奇数部分为plane1;plane 通过“乒乓操作”原理,提高NAND Flash 接口的读写性能;LUN:是Logic Unit NAND Flash 的一个逻辑单元,一个LUN 有4 096 个Block,一个NAND Flash 有多个LUN。

3 坏块管理

固态硬盘对读写速度的要求,使得固态硬盘主控芯片都支持多通道(Channel)操作,可以提高读写性能。但是坏块的出现会影响固态硬盘的读写性能和数据的一致性。多通道操作实际上是操作RaidBlock,提高接口数据的并发能力。该文提出的固态硬盘坏块管理方法,主要针对多通道、多NAND Flash 的坏块管理,致力于减少坏块出现对读写性能的影响和保护硬盘数据的一致性。该文提出的坏块管理方法主要包括四个部分:出厂坏块的统计、坏块表的建立和RaidBlock 的建立、RaidBlock 更新和坏块表的更新。

3.1 出厂坏块统计

NAND Flash 的坏块包括出厂坏块和使用过程中新增的坏块。出厂坏块由NAND Flash 厂商标记。不同的NAND Flash 厂商存放的位置可能存在差异。对于Micron MT29F32G08CBABB 颗粒,是用每个Block 的第一个page spare 区域的第一个byte 来表示该Block 是坏块还是好块,00 表示该Block 是坏块,0xFF 表示该Block 是好块。对于使用过程中新增坏块有三个产生源头:1)编程(program)过程中发生错误;2)擦除(erase)过程中发生错误;3)读(read)过程中出现ECC 无法纠正的错误[3-5]。

3.2 坏块表和RaidBlock的建立

初始化坏块表的建立是在固态硬盘量产时,通过扫描全盘Block 的方法实现的;初始化坏块表建立之后,固态硬盘在使用过程中,新增的坏块采用增量方式,向初始化坏块表进行添加。固态硬盘完成上电后,坏块表会读取到主控芯片内存,当坏块表更新时,先更新主控芯片内存中的坏块表,再把内存中的坏块表备份到NAND Flash 颗粒的固定位置;这种策略可以保证坏块表的准确性和实时性不受固态硬盘上、下电的影响,不用每次都采用扫描全盘来建立坏块表。坏块表建立流程图如图3 所示。

图3 坏块表建立流程图

由图3 坏块表的建立流程可知,通过扫描固态硬盘所有的Block,读取每个Block 第一个page 的spare data 区域的第一个byte 的值与0xFF 进行比较;从而确定该Block 是好块还是坏块,并建立坏块表[6-8]。坏块表以byte 数组形式进行保存,数组的每一个元素表示相邻的8 个Block,每个Block 块属性用一个bit表示,bit 值1 表示该Block 是坏块,bit 值0 表示该Block 是好块;这样一个byte 可以对应8 个Block,采用每个bit 来映射一个Block,可以减小坏块表的大小,节约存储资源。

RaidBlock 是由每个通道(channel)、每个CE 的Block 共同组成的逻辑Block 层,是一个抽象的Block[9-10]。由图4 RaidBlock 与物理Block 映射图可知,该固态硬盘有两个通道,每个通道连接的NAND Flash 有4 个CE,每个CE 有8 196 个Block。因此一个RaidBlock 组成元素有{Block(0,0),Block(0,1),Block(0,2),Block(0,3),Block(1,0),Block(1,1),Block(1,2),Block(1,3)},其中Block(0,1)表示通道0的CE 1 的Block,元素0 表示通道,元素1 表示CE。在实际使用时,RaidBlock 表存储的是不规则的RaidBlock 元素,规则的RaidBlock 元素不作记录,可以减少RaidBlock 表大小,节约内存空间。同时RaidBlock 命名通常都是以Channel 0 和CE 0 的Block 为基准。如RaidBlock 表中存在如下内容:{3,3,100,3,3,3,3,235},该内容表示RaidBlock 3 中Block3(0,2)和Block3(1,3)的Block 都是坏块,分别采用各自Block100(0,2)和Block235(1,3)来替换。在固态硬盘向RaidBlock3 读写数据时,先查询RaidBlock 表,再对应RaidBlock 表操作Block100(0,2)和Block235(1,3),然后读写数据;RaidBlock 构建的原理是依据NAND Flash 各个通道和各个CE 之间读写数据相对独立互不干扰,同时还能最大程度地提高通道并发能力,提高固态硬盘的读写性能,不受坏块影响。

RaidBlock 的建立是在固态硬盘量产时和坏块表建立同时完成的[11]。先将所有通道和CE 没有坏块的组建成RaidBlock,并统计所有存在坏块的通道和CE,以数组形式进行保存;找到坏块最多的通道和CE,确定最多组成RaidBlock 的个数;以通道0 和CE 0 为基准,建立RaidBlock表[12-13],如图5 RaidBlock结构图所示。从行上看,有5 个行存在坏块,分别分布在不同CE 与通道上。从列上看,通道0 与CE 2 上存在最多坏块,个数为3;通过计算可知,最多形成8 193(8 196-3)个RaidBlock;其中8 191(8 196-5)个RaidBlock 是默认状态,不需要保存到RaidBlock 表,仅两个RaidBlock 需要建立RaidBlock 表,表中数据如{3,3,2,3,3,3,3,3}{200,200,895,200,200,200,200,895}。

RaidBlock 的个数会随着使用过程中坏块的增加而减少,但是存在一个阈值,当RaidBlock 个数小于这个阈值时,固态硬盘不能正常工作。该阈值一般由固态硬盘容量决定,超出阈值的RaidBlock 可以称作spare RaidBlock,该类Block主要用于提高固态硬盘垃圾回收(Garbage Collection)和磨损均衡(Wear-Leveling)效率。由图5 可知,基准线一的RaidBlock阈值是16,表示RaidBlock 总个数不能小于8 180(8 196-16)个,剩余的是spare RaidBlock 和坏块;基准线二表示该固态硬盘的某个通道和CE 存在最大的坏块数;基准线二的阈值是3,表示在通道0、CE 2上存在三个坏块。随着固态硬盘的使用,坏块增加基准线二逐渐向基准线一靠扰,当二者重合时,表示该固态硬盘已经不能正常使用。

图5 RaidBlock结构图

3.3 坏块表和RaidBlock表的更新

固态硬盘在使用过程中,新增坏块可以分为以下三种情况[14-15]:

1)当操作NAND Flash 出现page program 操作失败时,先把有效数据转移到spare RaidBlock,然后进行erase RaidBlock,若在erase 操作过程中出现错误,找到擦除失败的Block,记录好通道数和CE 数,标记为坏块;若擦除RaidBlock 完成,表示该RaidBlock 不存在坏块;

2)当操作NAND Flash 出现erase RaidBlock 失败时,找到擦除失败的Block,记录好通道数和CE 数,标记为坏块;

3)当read 操作出现ECC 无法纠正的错误,先把RaidBlock 有效数据转移到spare RaidBlock,然后进行erase RaidBlock,再进行program 数据并校验,若操作过程中出现失败,表示RaidBlock 存在坏块,再擦除RaidBlock,找到擦除失败的Block,标记为坏块;若操作成功,表示该RaidBlock 不存在坏块

当确定某个Block是坏块时,先标记坏块,更新坏块表;然后确认Block 所在的通道和CE,并确认通道和CE 的坏块数;如果大于最大通道和CE 的坏块数,则最大通道和CE 的坏块数增加1,spare RaidBlock 减少1;如果小于最大通道和CE 的坏块数,则更新Raid Block 表;最后将更新的表同步到NAND Flash[16]。

4 结束语

该文提出的坏块处理方法主要针对于主控芯片连接多通道NAND Flash 架构的固态硬盘。依据坏块表区分坏块和好块,达到管理Block 的目的。通过RaidBlock 的操作,可以确保在不操作到坏块的前提下,满足固态硬盘数据的并发需求,提高固态硬盘的读写效率。坏块表和RaidBlock 表的相互配合可以到达坏块管理的基本要求,确保数据的可靠性。

猜你喜欢
结构图基准线固态
中国共产党第二十届中央组织结构图
碳交易市场体系中的碳排放基准线:应用实践、研究进展与展望
PCle 4.0平台的性价比之选!WD_BLACK SN770固态硬盘
Sn掺杂石榴石型Li7La3Zr2O12固态电解质的制备
透明陶瓷在固态照明中的应用进展
L波段kw级固态功放测试技术
P-3C“奥利安”反潜机结构图
中产直九型多用途直升机结构图
卡-60轻型突击运输直升机结构图