一.基本概念
Flash Memory中文名字叫闪存,是一种长寿命的非易失性(Non-volatile Memory Device,在断电情况下仍能保持所存储的数据信息)的存储器。闪存按功能特性可分为两种,一种是NOR Flash,以编码应用为主,其功能多与运算相关;另一种为NAND Flash,主要功能是存储资料,如固态硬盘中所用的颗粒。二.存储结构
NAND Flash由block(中文称为“块”)构成,block的基本单元是page(中文成为“页”)。通常来说,每一个block由多个page组成。NAND Flash每一个page内包含Data area(数据存储区)。每一个page内包含有一个扩展的Spare area(备用区)。所以每一个page的大小为Data area+Spare area。
NAND Flash结构示意图
三.读取和写入
NAND Flash的读写以page为单位,在写入前(在这里称之为编程),需要先擦除,擦除以block为单位,这些操作都会减少器件的寿命。由于NAND Flash的这种特性,使得它在编程时带来了写放大的副作用,并且管理算法更复杂,例如需要垃圾回收算法。所以一般我们对NAND Flash编程的步骤是,先把其中的有效数据page搬移到内存或者其他block中,然后擦除这个block,再把有效数据和新数据写回去。这个过程造成了多余的写入和擦除,这就是所谓的写放大。四.坏块管理
Bad block(中文成为坏块)指的是这个器件中一些不能正常工作的block,有的是出厂的时候就存在了,有的是使用寿命到了从好块转变而来的,成为新增坏块。由于工艺和成本的限制,标准规范中出厂时器件是允许存在bad block的,只要它的容量小于总容量的2%就是允许的,这些被称之为原始坏块。这些原始坏块会被厂商检测出来并且做好标记,坏块数量符合标准的便可以当作good die出售,不符合标准的被标上标记,称之为ink die。ink die一般不太稳定,一般被买去做低端的产品,如山寨U盘。NAND Flash使用前,会进行全盘扫描,把坏块检测出来生成一张表,称之为坏块表,用于记录原始坏块,后续可以用来记录新增坏块。五.使用寿命
NAND flash的每一次读写擦都会对减少自身的寿命。为了提高容量降低成本,NAND Flash从最初的SLC,向MLC,TLC还有QLC演变,单元存储密度从1bit,向2bit,3bit和nbit递增,但是擦写次数却不断递减,从100000次,向5000和1000次递减。如果一个block寿命到了,写入这个block的数据就会出现无法处理的bit反转,这个block就不能再被使用了,需要管理算法使用保留的好块去把这个新增坏块替换下来,如果保留的好块使用完了,那么就不能再往里面写入数据了。所以管理算法需要具有平衡磨损模块,用于记录每个block的擦写次数,尽量保证每个block的擦写次数基本持平,从而提高整个器件的使用寿命。顺便说一下,当一个器件被使用了很久以后,清空平衡磨损表重新建立,每个block的磨损寿命信息就已经丢失,这时候再使用这个器件就非常危险,因为可能某个block的磨损度已经很高了,但是却没有被记录下来,这个block会突然出现无法处理的数据出错。六.产品与量产
NAND Flash一般不单独使用,需要和专用控制器搭配组成一个系统。目前常见的使用NAND Flash的产品主要有固态硬盘(SSD),eMMC,SD记忆卡,U盘等。其中SSD和eMMC稳定性和性能要求比较高,一般需要使用品质优良的NAND Flash。以SSD来说明生产过程,其他产品流程类似。首先是量产,接着是检测,合格后便可以作为正式产品出售。量产:①检测NAND Flash和主控型号,找出对应的固件包和配置信息。②加载代码到主控,启动扫描flash流程。扫描完成后读回坏块表。③根据配置生成参数,和固件数据一起按照主控要求写入NAND flash中。④启动固件,并做基本的量产参数检测,量产完成。检测:①读取设备固件数据信息。②把固件数据和设置的做匹配。