随着嵌入式技术的普及,电子产品的结构和功能得到了逐步优化。由于NandFlash具有高密度、非易失和可擦写特性,在数码产品中被广泛用于数据保存,我们设计的车载娱乐系统中也采用其保存影音资料。但NandFlash也有不足,就是存储单元擦除次数有一定的限制。针对车载娱乐系统中数据基本上是只读、更新操作非常集中的特点,结合NandFlah特性,设计出了适合于车载娱乐系统的NandFlash管理模式。
1NandFlash概述
NandFlash的基本特点:
◆ 以资料页(Page)为单位进行读取和编程操作,1个资料页为512字节(单元组)或2 KB;以区块(Block)为单位进行擦除,1区块为16 KB或128 KB。
◆ 晶片尺寸小,引脚少。
◆ 晶片包含损坏区块,其数目上限达到NandFlash容量的1%。
NandFlash两个电气上的限制:不能直接复写;擦除(erase)次数有限。不能直接复写是指在新资料存储之前,原位置的资料区块必须先被擦除;而擦除次数的限制方面,一般而言NandFlash的擦除次数为100万次,由制造商设定。这两个缺点导致传统式硬盘管理策略不适用于NandFlash,因此NandFlash管理系统应运而生。
由于NandFlash具有不能直接复写的缺点,所以必须考虑如何更新区块资料及管理可用自由空间,进而延长其使用寿命。对于更新方式,为了提高写入效率,必须分离写入和擦除操作。更新时须将更新资料写入新自由区块空间中,且将原区域旧资料宣称为“无效”,等到回收条件被触发时启动擦除运算,回收无效资料占用的空间,以提供足够使用的自由空间。
均匀擦除是将常被更新的资料配置于擦除次数较少的区块中,不常更新的资料则安置于擦除次数较多的区块中,使得所有区块几乎同时达到擦除极限。由此可以看出在擦除成本与均匀擦除行为上,两者是相互冲突的。如果将NandFlash管理重心集中在降低擦除成本上,会导致区块间擦除次数分布情况呈现出过于倾斜,系统可靠度严重受影响;而过度注重均匀擦除将增加擦除成本,缩短闪存寿命。
为此提出一个公式,它能随着擦除次数的增加动态地调节对均匀擦除的重视程度,从而动态地调节对擦除成本的关注。
2基本原理
2.1存储空间分配
根据车载娱乐系统的要求,在此系统中使用NandFlash,只有很少的区块需要更新,而大多数区块只有写入和擦除两种操作。因此为了提高写入速度和降低擦除成本,在NandFlash中开辟若干区块专门用来存放更新扇区,称此区为“备用区”。因此把NandFlash分3个主要区块:可更新区,静态数据区和备用区(注意这些是逻辑地址)。此方法就是将所有更新资料写入备用区,取代直接更新的方法。若有更新资料动作,只需将旧扇区标记为无效(invalid),在某一特定时机启动擦除机制,把资料还原到原区块中。
2.2NandFlash管理架构
NandFlash的必要管理机制包括:坏块管理,均匀擦除和无效资料页回收。如图1所示,NandFlash管理由3个主要策略元素构成: 分配(allocation),清除(clean)和均匀擦除(wearleveling)。“分配”工作主要负责管理可用自由空间和决定自由空间区块的分配;“清除”工作负责回收无效的区块以及产生新的自由空间;“均匀擦除”工作旨在平均使用每个区块。
图1 NandFlash管理构架图
3具体设计
3.1坏块管理(bad block management)
首次使用NandFlash时,因为NandFlash可能有约1%的坏区块,所以必须对NandFlash区块依次扫描,将坏区块一一记录下来,避免日后资料写入坏区块,造成资料错误或任何不正常状态发生。一般的NandFlash在出厂时,厂家将坏区块记号标志在每个区块第1或第2个扇区共享区的第6个字节(不是0xFF),厂家能保证每块NandFlash的第一个区块不是坏区(这个区块正好用来存放区块状态信息)。
以三星公司生产的K9K2G08X0M为例来说明,它含有2 048个区块,每个区块由64个扇区组成,每个扇区有2 KB的空间。此时可以用闪存的第1块的第1个扇区的前512字节来存放坏块信息。当对每个区块进行检验,检测到坏区块时,把缓存中的相应位清零(是零的标记为坏块),直到检测到最后一个区块。最后把缓存中的数据写到第1个区块的第1个扇区中,当出现新的坏块时,再把此扇区读入缓存进行更新。
有了上面的记录,在程序运行时就可以根据区块情况来确定是否将该区块映射到逻辑区块地址中。显然坏区块是不会被映射的,由此可以看出坏区块是不会被写入数据的。
3.2均匀擦除
NandFlash擦除次数是有限的,仍以K9K2G08X0M为例,其擦除次数为100万次。若某个区块中,存在着永远不被更新的资料扇区,此时非均匀擦除情况将非常严重。若系统中存在着多数冷资料(即存放在存储器中很少变动的资料)区块,则整体上,NandFlash将因轮替擦除的候选区块变少而增加擦除次数,使得存储器容量因擦除次数的限制而失去可用的空间。
例如,某一NandFlash有100个擦除片段,每一个区块擦除次数为100万次。若其储存区块空间中包含着25个永不更新的区块,则仅剩下75个区块轮流使用擦除。假设在一个高写入的情况下,每天有20 000个区块擦除回收需求(不考虑均匀擦除),则其存储器100%可用的使用寿命为:
由上式不难看出,当经过10.27年后,其存储器的空间仅剩下25%。也就是说,只有存储静态资料的区块可再被使用,而这25%的区块使用空间也将会因为存储器空间不足,进行频繁的擦除。更严重的情况是,更新只集中在这一小部分区块上,这些区块会很快到达擦除极限。这样就严重地损坏了系统的稳定性,而且当容量满足不了系统的要求时,此产品就宣布报废了,也就是说产品的寿命受到很大的限制。
式(1)中没有考虑均匀擦除,使得空间急速减少。若在系统中考虑均匀擦除,则此100个区块的擦除次数差异将会被控制在一定的范围内,使其几乎同时达到擦除极限。在存储器使用上,也会有较大的空间弹性,假设均匀擦除必须额外付出8%的擦除费用,此时的使用寿命为:
虽然均匀擦除需要付出额外的成本,但是提高了数据可靠度、增大了存储器使用空间且延长了使用寿命,所以这种花费是相当值得的。
3.2.1动态均匀擦除算法
假设NandFlash其擦除极限值为100万次,在区块被擦除100万次之前,不必担心其擦除次数限制,因此均匀擦除可采用渐进严谨策略,此方式的特点在于可提供更大的配置弹性。采用动态方式,可以降低均匀擦除所需付出的额外成本。均匀擦除的执行是发生在分配阶段,当系统要求一个区块进行数据写入时,就需要有一个参考量,决定什么时候启动均匀擦除。把这个参考量用N表示,而启动的条件是: “自由块最少擦除次数-使用块最少擦除次数>N”是否成立。也就是说,当其差大于N值时,擦除过度倾斜,需要进行调整;而小于N时说明擦除倾斜还在可容忍的范围内,不需要进行调整。空间分配的流程如图2所示。
图2空间分配流程
3.2.2N值的计算
由前面的算法设计可知,N值的计算是此算法的关键,它决定着此算法偏向降低擦除成本,还是偏向均匀擦除。N值的计算也是此算法的难点之一。
仔细观察不难发现,当一块NandFlash刚被使用时,每个区块的擦除次数都很少。算法如果此时过于偏向均匀擦除,便会带来很多无意义的数据搬移,因为此时即使某个区块擦除次数很多,也不会由于达到擦除极限而损坏。但是当某个NandFlash使用了很久,很多区块已经被擦除很多次后,如果均匀擦除策略过于松懈,那么很多模块就会由于达到擦除极限而损坏,那么闪存的寿命就会受到限制。
因此,在闪存初始使用阶段算法要偏向于降低擦除成本,而在NandFlash越接近擦除极限时,算法越要偏向于均匀擦除。可见N值是一个浮动的值,并且是与NandFlash整体擦除次数相关的。下式可以体现出上述思想:
式中: K为一个常数,一般是大于或等于区块擦除极限的数;a、b为常数;Mmin为NandFlash上擦除次数最少区块的擦除次数;Mmax为NandFlash上擦除次数最多区块的擦除次数;Mtop为NandFlash区块的最大擦除次数。
3.3区块分配策略
为达到NandFlash的均匀擦除效果,要付出一定的擦除费用,而减少这种擦除费用是均匀擦除算法不能完全控制的。因为可能出现由于均匀擦除,需要调整的冷资料被写入到擦除次数很少的区块上,不久这些区块可能又需要调整,因而增加了擦除的费用。因此,必须有一个适当的区块分配策略。
区块分配时有3种不同情况: 一是可更新区和备用区申请新的区块;二是静态区申请新的自由区块;三是为了均匀擦除需要搬移冷资料时而申请新的自由区块。
在理想情况下,当然希望可更新区和备用区在申请物理区块时,得到的是擦除次数最少的块,而冷资料所存放的物理块是擦除次数最多的物理块。在算法中不能完全实现理想中的要求,但是可以做出一些努力向理想靠近。
对于前两种情况,根据N的计算公式不难想到这样的策略:当可更新区和备用区申请时,可以适当增大常数a的值,减小N的值采用一种比较严谨的均匀擦除策略;相反在静态区申请时,则加大b的值,增大N值采用比较宽松的均匀擦除策略。
由上面的策略可知,大多数的搬移都会发生在可更新区和备用区申请新的自由区块时。这样在选择搬移区块时,就可以区分是静态区还是可更新区和备用区的。所以能够使所选的搬移区块基本上是存有冷资料的区块,此时要把这些冷资料搬移到擦除次数最多的物理块上,然后释放原来的区块供轮换使用。
3.4清除策略
清除即包括对可更新区和备用区的无效资料页回收策略,也包括静态区资料的删除。当然静态区资料的删除比较简单,主要工作是集中在无效资料页的回收上。
无效资料页回收策略的主要目的是在于擦除无效资料,释放自由空间,以保持足够的使用空间。此机制启动的时机如下:当备用区空间只剩下25%(可调整)时,空间回收标志将被置位;当更新区区块的使用率不足25%(可调整)时,启动空间回收机制。
当M值小于1时,启动无效区块回收策略。其中,备用区区块的数目是程序员根据实际需要自己调整的,例如可以设置成50或者80。P表示一个加权值,会因所设定的空间不足百分比而有所调整。
而更新区的空间回收,则完全是为了缩短扇区访问时间而设定的。因为当更新区区块被更新的扇区过多时,也就是访问更新区时,由于访问扇区无效而去访问备用区,这样就延长了访问的时间。
区块包含的扇区数一般为32~128,根据厂家和容量的不同而定。
结语
不同的嵌入式系统对NandFlash的读写要求是有区别的,所以根据特定的要求而量身定做的算法,才能显著地发挥其长处。针对车载娱乐系统中写入NandFlash中的数据基本上是只读的特点,可知其更新操作非常集中,这样就可以很有针对性地对更新区域进行处理,不但克服了NandFlash不能直接复写的缺点,而且在一定程度上降低了擦除成本。针对NandFlash擦除次数有限的缺点,设计出了动态的均匀擦除策略: 在区块没有接近擦除极限时,采取比较宽松的策略;而在接近擦除极限时,则采用比较严谨的策略。这样不但降低了擦除成本,实现了均匀擦除,也在一定程度上延长了NandFlash的寿命。