摘 要:針對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年出生,東南大學電子工程系博士研究生、講師。