本文阐述了嵌入式文件系统若干相关问题,即嵌入式为什么选择FLASH作为存储器,为什么通常被设计成日志文件系统,最后结合FLASH特性重点介绍了设计FLASH文件系统需要考虑的问题。

嵌入式设备存储器FLASH与PC机硬盘,有着本质的区别,这也决定了设计FLASH文件系统需要考虑FLASH固有特性,有必要对FLASH相关理论知识有个了解,看了一上午,已整理成博文《Flash相关理论知识:SLC与MLC、NOR与NAND FLASH、闪存卡》。接下来,分析嵌入式文件系统若干问题。

1. 为什么是Flash

为什么嵌入式设备、传感器节点几乎都采用FLASH作为存储器?嵌入式设备具有体积小、可移动特点,硬盘抗震效果差(还有体积、功耗、成本因素),显然不适合作为嵌入式设备的存储器。闪存存储器作为一种非易失性存储器,由于具有体积小、功耗低、抗震性好等优势[4],使得FLASH在嵌入式系统中广泛应用。

2. 为什么需要文件系统

一言以蔽之,为了更好地组织和管理数据,提供更友好的编程接口(屏蔽了硬件的细节)。

3. 为什么是日志文件系统

要回答这个问题,得先看下非日志文件系统(如ext2、FAT、NTFS、UFS)存在哪些致命的弱点。一般文件系统采用异步方式工作(如PC的硬盘采用DMA传送方式),在对文件存储器进行操作时,如果出现异常中断(如系统崩溃、掉电、强制关机),很可能会导致数据丢失。

传统文件系统(非日志文件系统),尽管有些文件系统(如ext2),可以在重新启动时通过调用文件扫描工具(如ext2 fsck)试图恢复损坏的元数据信息。利用文件系统保存有冗余的关键元数据信息的备份计算出被损坏的数据的位置,然后或者是通过恢复冗余的元数据信息,或者是直接删除被损坏或是元数据信息损毁的文件。但是这种文件扫描恢复方式的开销(主要时耗时)会随着文件系统的增大而迅速增大[5]。极端情况下,重要文件被删除,造成系统无法启动。

解决这个问题方法,就是记录文件系统的变化(增删改),以便出错时快速、有效地恢复(根据日志记录),这就是日志文件系统。从而文件的安全性提高了,系统的可靠性也提高了。

如此看来,嵌入式设备采用日志文件系统也就没什么奇怪了,况且,嵌入式设备更具不稳定性。

日志式文件系统的思想来自于大型数据库系统。数据库操作由多个相关的、相互依赖的子操作组成,任何一个子操作的失败都意味着整个操作的无效性,所以,对数据的任何修改都要求回复到操作以前的状态[6](即回滚)。

日志文件系统有多种工作日志模式(Ext3有3种,即日志、预定、写回)。日志Journal日志模式对文件系统所有数据和元数据的改变都记入日志,而预定和写回模式只对文件系统元数据的改变记入日志。具体是这样工作的:在对元数据(Metadata,定义文件系统中数据的数据,即数据的数据)做任何改变以前,文件系统驱动程序会向日志中写入一个条目,这个条目描述了它将要做些什么,然后,它继续并修改元数据[6]。每隔一定时间,文件系统会将更新后的文件metadata及文件内容写入磁盘,之后删除这部分日志。重新开始新日志记录[6]。

4. 基于Flash文件系统需考虑的问题

从FLASH特点出发,讨论设计基于FLASH文件系统需要需要特别解决的问题。关于FLASH相关理论知识,可参考博文《Flash相关理论知识:SLC与MLC、NOR与NAND FLASH、闪存卡》。

4.1 块擦除次数--损耗均衡

NAND Flash 每块的擦除次数都是有限的。对于 SLC NAND Flash,一般为 10 万次左右,而 MLC NAND Flash 的擦除次数仅有大约 1 万次,具体数据参考所使用 NAND Flash 的产品手册。如果某块频繁擦除而超过擦除次数限制,该块内的数据将不可靠,进而影响整个存储器的使用,所以需要采用损耗均衡算法使各个块近似均衡使用[2]。

4.2 坏块--映射机制

NAND FLASH在出厂的时候就有坏块(也曾有过消除坏块的努力,但发现成品率太低,代价太高,划不来),使用过程难免会有坏块产生。因为绝不能向坏块写入数据,这就意味着在NAND器件上自始至终都必须进行虚拟映射。

NAND FLASH是块-页两级的结构,映射可以采用块映射和页映射。前者占用较少的RAM,但垃圾回收消耗大、空间利用率低[2]。后者恰恰相反。事实上,也可以采取其他映射机制。

PCMCIA 组织推出的适用于Flash存储器的FTL规范,提供了一套比较全面的管理机制,规定建立Flash存储器中的物理块和上层应用系统使用的逻辑块之间的映射机制。但对于NOR FLASH会一定程度上影响数据存储的效率和FLASH空间利用率[2]。

4.3 坏块--坏块管理

NAND FLASH在出厂的时候就有坏块,在第一次使用时,必须扫描全盘建立坏块表,并存储到Flash的保留区中,避免坏块标记被擦除[2]。使用过程难免会有坏块产生,对于坏块,要么文件系统应该屏蔽之,要么用保留块替换。

4.4 异位更新--垃圾回收

由于 NAND Flash 先擦后写的物理特性(写的时候只能由1变成0),NAND Flash一般采用异位更新,即将要更新的数据读入RAM中修改后写入其他空闲空间,在适当的时候擦除修改前数据所在块,修改逻辑地址到新的物理地址映射[2]。又因NAND FLASH是按页写,按块擦除,也就不可能每次把失效的页及时擦除(有些页可能还没失效,则需要转移这些页的数据,才能擦除),只能在适当时候才擦除,这就是垃圾回收。这就需要精心垃圾回收算法了:-)

4.5 掉电保护

嵌入式设备电源供应更具不稳定性,所以文件系统应能保证在系统突然断电的情况下,最大限度地恢复(保护)有用数据[2]。

附:存储器金字塔

为解决存储器容量、速度、价格的矛盾,提出存储器金字塔[1](利用局部性原理),高一层的存储器缓存低一层的存储器。其从上到下依次是寄存器、L1 Cache、L2 Cache、主存、外存。PC上外存是硬盘,嵌入式系统的外存通常是Flash,到了传感器节点有的甚至连外存都没有。

storage pyramid

图1 存储器金字塔

参考资料:

[1] 图片来源:存储器金字塔 (也可参考经典书《深入理解计算机系统》)

[2] 董永帅.Flash文件系统及存储管理技术研究与实现[D].华中科技大学.2008

[3] 维基百科词条:

[4] 俄立波.文件系统在无线传感器网络中的应用研究[D].上海交通大学.2009

[5] 姚紫阳.嵌入式文件系统的研究--基于uC/OS的日志文件系统[D].江南大学.2005

[6] 文章《》

本文系Spark & Shine原创,转载需注明出处本文最近一次修改时间 2022-03-21 10:41

results matching ""

    No results matching ""