加快Windows CE下FAT文件系统加载速度的方法及实现
摘 要:针对Windows CE应用于大容量NAND FLASH时文件系统加载速度慢的问题,分析NAND FLASH驱动程序的结构和FAT文件系统的加载过程,提出以块为单位存储部分文件系统信息的创新优化方案。在Xscale PXA270的平台上测试表明,经优化后文件系统加载速度大约可以提高50%。此方案对类似的嵌入式系统研究也有借鉴作用。
关键词:嵌入式系统;FAT文件系统;加载速度;NAND FLASH
中图分类号:TP311文献标识码:B
文章编号:1004-373X(2008)22-074-04
Analysis and Implementation of Accelerating the Loading Process for
FAT File System in Windows CE
LIU Jilin,ZHANG Zhe
(National ASIC System Engineering Center,Southeast University,Nanjing,210096,China)
Abstract:Aiming at the problem of low loading velocity of file system in Windows CE when applying for high capacity NAND FLASH,this paper analyzes the structure of driver for NAND FLASH and the loading process of FAT file system,and proposes a solution for accelerating the loading process which saving information of file system for per block instead of per page.According to experimental results from platform based Xscale PXA270,the loading velocity can be increased by about 50% after applying proposed solution.It may be a reference to some similar embedded systems.
Keywords:embedded system;FAT file system;loading velocity;NAND FLASH
NAND FLASH具有体积小、功耗低、速度快、容量大及抗震动等优异特性,已经广泛应用于便携式产品中。 Windows CE平台下默认的FAT文件系统已经通过分层结构提供了对NAND FLASH的存储管理,方便了开发和应用,但由于设计结构的特点,其加载速度会随着NAND FLASH容量增加而减慢,特别是在配备大容量NAND FLASH的嵌入式系统中已经严重影响了系统的启动速度。在当前嵌入式应用对存储容量需求增长的情况下,已经成为一个很普遍的问题。
1 FAT文件系统结构及加载过程分析
在Windows CE中,FAT文件系统下的NAND FLASH驱动程序采用分层结构。驱动程序的上层是FLASH抽象层,是物理操作无关层,该层对NAND FLASH的操作进行抽象,并采用一定的策略平衡NAND FLASH的擦写。NAND FLASH驱动程序的结构如图1所示。
在图1中,File System即文件系统。Windows CE采用的是FAT文件系统。FAT文件系统是一种采用链式分配方式的文件系统。并没有对NAND FLASH的特点优化,因此需要在下层的驱动程序做优化。FLASH Driver为NAND FLASH驱动程序。对上层的文件系统提供以DSK为前缀的流驱动接口。该层驱动程序本身分为2层:FAL(FLASH Abstraction Layer)层、FMD(FLASH Media Driver)层。前者主要提供对上层提供抽象接口、逻辑地址转换成物理地址和损耗平衡(“Wear-level”)三个功能,后者实现FAL层的请求,对FLASH物理扇区进行操作。FLASH Hardware即NAND FLASH物理芯片。
1.1 文件系统中FAL层
FAL层由类FAL、类MappingTable、类SectorMgr、类Compactor组成。整个FAL层由3个功能部分组成。如图2所示。
类FAL提供的功能包括读、写、删除和建立映射表函数;
类MappingTable提供给FAL相关的映射功能;
类SectorMgr主要用于管理空闲(free)扇区、脏(dirty)扇区信息;
类Compactor,即垃圾回收器,用于将NAND FLASH上的垃圾块回收加入空闲链表。
1.2 FAL层映射表建立过程
FAT文件系统加载过程中重要的一步是建立映射表,这也是FAL层最重要的功能之一,文件系统访问的是逻辑扇区,而在FAL层内部对逻辑扇区进行映射转换成实际要操作的物理扇区。而逻辑扇区到物理扇区转换的重要手段就是映射表,即前面所述的MappingTable,所以在驱动初始化时,必须对NAND FLASH中已经存在的数据建立映射,空白区也要建立相关的维护信息,而这个映射表的建立是通过扫描NAND FLASH的所有扇区来实现的。
Windows CE加载NAND FLASH的驱动程序时调用DSK_Init()函数进行初始化,该函数调用FAL类的启动函数Fal::StartupFAL()启动FAL的功能。该函数首先对MappingTable进行相关的初始化,紧接着就调用FAL类的Fal::BuildupMappingInfo()函数建立映射表。因此,这个建立过程是在文件系统加载之前,驱动程序初始化阶段完成。驱动程序是在Windows CE系统启动的时候由设备管理器Device.exe加载的,所以如果NAND FLASH扫描过程太慢,会直接影响到系统的启动速度。FAL层的扫描过程如下:
(1) 调用FMD_GetBlockStatus函数获取块信息,判断是不是坏块。如果是坏块则继续扫描下一个块,否则对此块上所有扇区进行扫描。
(2) 调用FMD_ReadSector函数读每个块的第一个扇区的Spare space区。如果该扇区是空扇区,则将该块内所有扇区都加入空闲扇区链表。FAL层的垃圾回收器Compactor总是一整个块回收,也即如果一个块的第一个扇区是空的,则表明该块的所有扇区都是空的。如果该块的第一个扇区不是空扇区,则要继续扫描该块其他扇区。
(3) 如果所读的扇区不是空扇区,而是一个脏(dirty)扇区,则将该扇区添加到脏(dirty)扇区链表中。
(4) 如果所读的扇区是已经映射的扇区,则以读出的逻辑扇区号为索引在映射表的相应位置填入此扇区的物理地址。
(5) 如果扫描到扇区的逻辑扇区号已经存在并填入映射表中,则将此扇区丢弃,并标记为脏(dirty)扇区。
(6) 循环扫描直到扫描结束。
扫描过程的具体流程图如图3所示。
从上文可以看出,在NAND FLASH容量较小时,扫描建立映射表的时间并不明显,但是容量达到1 GB以上之后,扫描时间非常可观。
1.3 FLASH中的文件系统信息
在NAND FLASH中,每个物理扇区的Spare区都保存一个SectorInfo的数据结构,当文件系统加载时,读入分散于每个扇区的SectorInfo的数据结构,获得相应的逻辑序号和版本号。SectorInfo的数据结构如下所示:
typedef struct _SectorInfo
{
DWORD logicalSectorAddr;
BYTEbOEMReserved;
BYTEbBadBlock;
WORDwSignature;
} SectorInfo,*PSectorInfo;
其中logicalSectorAddr用来表示此物理扇区对应的逻辑序号;bOEMReserved为保留字节;bBadBlock为坏块标识;wSignature为扇区属性标识,有保留扇区、只读扇区、已写扇区、空扇区4种类型。
2 优化方法和实现
对于大容量Nand FLASH,扫描每个扇区获得文件系统信息无疑是效率很低的,所以如果能将更多的文件系统信息集中存放,减少读FLASH的次数,将能使文件系统加载速度提高。为此需要解决以下问题:
(1) 获得需要保存的文件系统信息数据的大小;
(2) 文件系统信息集中存放的位置;
(3) 文件系统信息在集中保存位置的更新方法;
(4) 尽量减小对原文件系统性能的影响。
本文设计了如下方法:将每一个块的最后一个扇区(称为特殊扇区)用于保存整个块中所有扇区的spare信息,即SectorInfo的数据结构。文件系统加载时对于每个块只需读取1个扇区,从而大大提高了加载速度。原理示意图如图4所示。
首先,文件系统信息数据的大小。以SAMSUNG K9G8G08U0M为例,这个FLASH每个扇区大小为2 kB,并有64 kB的Spare空间,每个块有128个扇区。由上文可知每个扇区的文件系统信息由8 B的结构保持,所以对于一个块需要1 kB空间来存储所有扇区的Spare信息,一个扇区足够存放。
其次,文件系统信息保存在块的最后一个扇区。这是针对FLASH擦除和FAL层垃圾扇区回收都是以块为单位的,这样可以使优化方法对原来的文件系统影响很小。
最后,文件系统信息在写满一个块后才将所有扇区Spare信息更新到最后一个扇区。由于NAND FLASH每次更新扇区数据的操作需要先擦除整个块,实时更新每个扇区的信息会严重影响系统性能,同时也会增加FLASH的损耗。而根据FAL层均衡策略和垃圾回收策略的特点,数据会将一个块的空扇区用完再跳至下一个块,这就保证了本文提出的方法可以最大程度地集中存储文件系统信息以提高加载速度。
本文论述方案实现方法如下:
为文件系统信息添加新的扇区标识:特殊扇区,用于标识每块最后一个扇区,并修改FAL层代码使得被标识为特殊扇区的扇区不能用于存放其他数据,主要修改类SectorMgr和类Compactor中相关函数。
当文件写入FLASH时,如果一个块除最后一个扇区外其他扇区已经写满,则读出其他所有扇区的Spare信息,将其存储于最后一个扇区,并将扇区标识为特殊扇区。具体流程见图5,虚线部分表示为优化方案添加的部分。
在文件系统加载时,首先检查每个块是否存在特殊扇区,如果存在,则利用特殊扇区所记录的文件系统信息建立映射表;如果没有,则按原程序流程进行加载。具体流程如图3所示,虚线部分表示为优化方案添加的部分。
3 实验结果及分析
本文选用了基于Xscale PXA270的Windows CE5.0平台,64 MB RAM,同时选取3种大小的Nand FLASH作为测试对象,分别为三星公司的K9K4G08U0M(512 MB),K9G8G08U0M(1 GB),K9GAG08U0M(2 GB),测试时满载定义为FLASH所有可用存储空间写满数据。因为文件系统加载时间是系统启动时间的很重要的一部分,所以这里直接测试系统启动时间。其测试结果参见图6和图7。
可以看出,优化后启动速度明显提高,尤其对于大容量FLASH,效果更加明显。同时也使得文件系统的加载速度基本和存储数据大小无关。
优化方法对文件系统的性能影响也应该考虑在内。本文对1 GB FLASH进行了读写测试,每次读写的数据大小为860 MB。测试结果参见表1。
可以看出,优化后,读出数据的速度基本没有变化,但是写入数据的速度有所降低,这是由于每写一个块数据多了读出所有Spare信息的过程,从结果也可以看出优化后对原系统的整体性能影响很小。
在实际应用中,文件系统的删除、拷贝等基本操作也都表现正常。
本文优化方法的缺点在于会占用一定的FLASH可用空间,以SAMSUNG K9G8G08U0M为例,每个块会占用1个扇区的空间,1 GB FLASH会被占用8 MB空间。这对一些对空间要求严格的嵌入式系统是不可忽略的。
4 结 语
FAT文件系统在Windows CE中应用广泛,适用性强,由于FAL层已经在内部实现,使得开发也相对简单。但是随着FLASH容量逐渐增大,其加载速度也线性增长,这在实际产品中不能为用户所接受。本文针对FAT文件系统提出了优化加载速度的方法,经优化后加载速度提高明显,这种方法代码移植量小,适应性广,对文件系统的性能几乎没有影响,同时也能为其他嵌入式文件系统借鉴。
参考文献
[1]傅曦.Windows CE嵌入式开发入门基于Xscale架构[M].北京:人民邮电出版社,2006.
[2]Microsoft.Microsoft Windows CE .NET HLEP[S].2003.
[3]Intel Corporation.IntelRPXA27x Processor Family Developer′s Manual[S].2004.
[4]Intel Corporation.IntelRFLASH File Systems Overview[S].2006.
[5]SAMSUNG Electronics Corporation.K9K4G08U0A Product Manual[Z].2003,2.
[6]SAMSUNG Electronics Corporation.K9G8G08U0M Product Manual[Z].2005,4.
[7]SAMSUNG Electronics Corporation.K9GAG08U0M Product Manual[Z].2006,3.
[8]Douglas Boling .Programming Microsoft Windows CE.NET[M].Third Edition.Microsoft Press,2003.
[9]陈向群,王雷,马洪兵,等.Windows CE.NET 系统分析及实验教程 [M].北京:机械工业出版社,2003.
[10]SAMSUNG Electronics Corporation .Nand Flash ECC Algorithm[S].2004.
作者简介 柳吉林 男,1983年出生,江苏泰州,东南大学电子科学与工程学院国家专用集成电路工程技术研究中心硕士研究生。研究方向为微电子与固体电子学、嵌入式系统设计 。
张 哲 男,1976年出生,东南大学电子工程系博士研究生、讲师。