和远程电子信息处理系统需要从闪存器件中读写海量数据,因此这些器件必须能长期可靠、无错地保存数据。例如,嵌入到汽车导航系统中的闪存芯片必须在若干年的频繁使用条件下可靠工作。用户不希望丢失数据以及很长的启动时间,或者忍受很长的数据恢复时间。这些都对控制闪存芯片中数据的文件系统技术提出了非常严格的要求。
使问题更加复杂的是,汽车嵌入式设计必须使成本绝对最低。材料清单中通常不能增加管理电源波动或不受控关断的硬件,而这两种情况中的任何一种都会导致闪存损坏,并导致业务丢失。因此,闪存文件系统技术不能简单地提供高吞吐量的读/写功能;它还必须具有自恢复功能,并且在启动之后的若干毫秒之内能被完全访问。(参见“快速启动技术可以满足汽车信息娱乐/远程信息系统的需求”一文)
基于事务的文件系统
解决这些需求的方法之一是采用基于纯事务的模型。例如QNX嵌入式事务文件系统(ETFS)就遵循这种模型,完全是由事务组成。无论是文件系统的元数据还是用户数据的每一次写操作都是由一个“原子”事务组成。一个事务要么获得成功,要么就当成什么事也没有发生。
这种方法可以确保文件系统在电源故障的条件下也能完好无损,即使电源故障发生在闪存写入或块删除期间。为避免文件破坏,事务从来不会覆盖现有的“有效”数据。在文件升级中间的写入操作总是会写入到一个新的未用区域。因此如果这次操作因为突发事故或电源故障不能完成,现有的数据将保持不变。重新启动后,文件系统可以重新执行和正确完成写操作,这样就可以从可能损坏传统文件系统的状态中恢复过来。
事务文件系统可以通过处理设备中的事务日志来动态建立文件系统的层次结构。这种操作发生在系统启动之时,应设计成只有很少部分的数据需要读取和CRC校验。这样一来,文件系统可以获得高的数据完整性和快速的重启时间。例如QNX ETFS可以在数十毫秒内恢复,而传统的文件系统需要数百毫秒。
图1:这种车载导航系统是要求大容量可靠闪存文件系统(用于三维映射、动态路由等)的一个实例。
如图2所示,在纯粹基于事务的文件系统中,每个事务由头和用户数据组成。事务头被放在闪存阵列的空闲字节中。例如,一个具有2112字节页的NAND器件可以由64字节的头和2048字节的用户数据组成。事务头标识数据所属的文件以及其逻辑偏移,并包含一个序列号来确定事务的顺序。头部还包括CRC和 ECC字段,用于误码检测和纠正。
图2:这张器件图表明了它相对于纯事务文件系统中物理媒介的独立性。
在系统启动时,文件系统扫描这些事务头来快速重构存储器中的文件系统结构。除了确保高的数据完整性和快速的重新启动时间,一个闪存文件系统还必须具有可以延长闪存寿命的特性,进而增加整个嵌入式系统的长期可靠性。这些特性包括读取性能劣化监测、动态和静态损耗平衡以及避免文件碎片的技术。
恢复丢失的比特
在NAND闪存块内的每一次读操作都会使保持数据位的电荷减弱。因而,在大约10万次读操作后闪存块就会丢失数据。为了解决这个问题,一个设计完善的文件系统会跟踪读操作,并在块的读次数达到极限之前标记出弱电荷块以便进行刷新。文件系统随后执行一次刷新操作,该操作将数据拷贝到一个新的闪存块,并擦除该弱块。这种擦除实现了对闪存块的再充电。
文件系统还应该对所有的读写操作执行ECC运算,以便从可能发生的任何单比特差错中恢复。然而,尽管ECC对于那些本身丢失了单个比特的闪存效果很好,但是对于在写操作期间因为电源故障而导致的很多比特损坏则无能为力。因此,文件系统应该对每个事务执行一次CRC检验,以快速检测出损坏的数据。如果CRC 检测到一个错误,文件 系统就可以使用ECC纠错功能将数据恢复到一个新块上,然后标记出弱电荷块以便擦除。
#p#副标题#e#动态和静态损耗平衡
每个闪存块在其失效之前的擦除次数是有限的。在某些器件中,这个数字可以低到10万次擦除。为了解决这个问题,文件系统必须实现动态损耗平衡,它通过将擦除次数均匀地分散到设备中来延长闪存寿命。
差异可能很大:从没有损耗平衡几天就产生故障的使用情形到利用损耗平衡超过40年的情形。为实现动态损耗平衡,文件系统会跟踪每个块的擦除次数,然后优先使用那些较少使用的块。
通常,闪速存储器包含大量的静态文件,这些文件经常被读取,但不会再写入。这些文件占用的闪存块没有理由被擦除。如果闪存中大部分文件是静态的,剩余部分包含动态数据的块的损耗将戏剧性地加快。对于NAND存储器来说这方面的问题更大,因为NAND每个块的读次数相当有限。
因此,一个设计优秀的文件系统应提供静态损耗平衡功能,它将较少使用的静态块中的数据拷贝到过量使用的块中,从而实现块的平衡使用。这种方法可以让过量使用的块休息,因为它们现在存储的是静态数据,并将使用较少的静态块移动到动态块组中。
尽量减少文件碎片
文件碎片也是闪存器件的一个问题。然而,支持去碎片技术只是解决方案的一部分。因为NAND闪存具有有限的写次数,文件系统必须尽可能避免碎片产生,以延长闪存的寿命。
基于日志的文件系统经常受碎片的影响,因为对已有的文件进行刷新或写入会产生一个新的事务。为减少很多小事务产生的碎片,QNX ETFS使用写缓冲来将小的写入合并成大的写入事务。文件系统还能监视每个文件的碎片水平,并对那些已经严重碎片化的文件进行后台去碎片处理。这种后台活动应该总是能被用户活动占先,以便确保对正在进行去碎片处理的文件进行立刻访问。
正确的组合
完全可能构建一个能提供高吞吐量、高可靠性和快速启动时间的闪存文件系统。通过整合事务级的设计、成熟的纠错以及损耗平衡方法,闪存文件系统完全可以解决当前嵌入式设备提出的复杂要求。
获取更多评论