周翔
(中國電波傳播研究所 第四研究部,山東 青島 266107)
摘要:介紹了嵌入式VxWorks的TrueFFS(True Flash File System)文件系統(tǒng)的結(jié)構(gòu)和算法,針對項(xiàng)目開發(fā)中遇到的問題提出了非2的n次冪大小的TFFS文件系統(tǒng)的構(gòu)建,描述了該理論的實(shí)現(xiàn)過程。經(jīng)實(shí)踐證明該方法可行,并且為Flash存儲器的充分利用和通過TFFS加載鏡像提供了參考。
關(guān)鍵詞:嵌入式;VxWorks;TFFS;存儲器
中圖分類號:TP316.2文獻(xiàn)標(biāo)識碼:ADOI: 10.19358/j.issn.1674--7720.2017.06.007
引用格式:周翔. 非2的n次冪大小的TrueFFS文件系統(tǒng)的構(gòu)建[J].微型機(jī)與應(yīng)用,2017,36(6):19-21.
0引言
Flash存儲器以其體積小、耗電省、非易失的特性,越來越廣泛地應(yīng)用于嵌入式系統(tǒng)開發(fā)中,成為重要的程序和數(shù)據(jù)載體。TrueFFS 文件系統(tǒng)是M-systems 公司推出的Flash管理軟件,它為種類繁多的Flash 提供了標(biāo)準(zhǔn)的塊設(shè)備接口,因此被包括VxWorks在內(nèi)的很多嵌入式操作系統(tǒng)所采用。建立TFFS 后,用戶可以像操作標(biāo)準(zhǔn)磁盤一樣實(shí)現(xiàn)對Flash的管理。
1TrueFFS文件系統(tǒng)結(jié)構(gòu)
圖1TrueFFS結(jié)構(gòu)及其在系統(tǒng)中的位置TrueFFS位于DOS文件系統(tǒng)和Flash存儲器之間,可以實(shí)現(xiàn)對底層Flash的讀寫操作,同時(shí)對上層提供應(yīng)用接口,使Flash像標(biāo)準(zhǔn)磁盤設(shè)備一樣由操作系統(tǒng)和文件系統(tǒng)所管理。其在整個(gè)系統(tǒng)中的位置和結(jié)構(gòu)如圖1所示。
核心層為文件系統(tǒng)提供完整的塊設(shè)備功能;翻譯層負(fù)責(zé)管理文件系統(tǒng)和Flash各個(gè)塊的關(guān)系,實(shí)現(xiàn)邏輯塊到物理塊的映射,另外它還實(shí)現(xiàn)設(shè)備模擬算法和Flash管理算法,如壞塊管理、碎片回收、損耗均衡等;MTD(Memory Technology Driver) 層實(shí)現(xiàn)Flash底層驅(qū)動,如讀、寫、擦除等;Socket層提供TFFS與硬件之間的接口服務(wù),如向系統(tǒng)注冊Socket設(shè)備、檢測插拔、硬件寫保護(hù)等[1]。
2TrueFFS文件系統(tǒng)算法
TrueFFS能均勻使用Flash,用冗余數(shù)據(jù)結(jié)構(gòu)保證可靠的數(shù)據(jù)操作,能排除損壞以避免錯(cuò)誤,實(shí)現(xiàn)了FTL(Flash Translation Layer)標(biāo)準(zhǔn)[2]。
(1)損耗均衡算法
Flash存儲器的擦除壽命有限,隨著使用次數(shù)的增多,它最終會變成只讀狀態(tài)。為延長其壽命,行之有效的方法就是平衡使用所有的存儲單元,而不讓某一單元過度使用。TrueFFS使用一種基于動態(tài)維護(hù)表的blocktoflash(塊對應(yīng)于Flash)傳輸系統(tǒng)來實(shí)現(xiàn)損耗均衡技術(shù)。當(dāng)塊數(shù)據(jù)被修改、移動或碎片回收后,這張維護(hù)表會自動調(diào)整。
?。?)碎片回收
塊數(shù)據(jù)的修改使得Flash的一些塊區(qū)域被填滿無效數(shù)據(jù),這些區(qū)域在擦除之前變得不可寫。TrueFFS使用一種碎片回收(garbage collection)機(jī)制來回收這些塊。該機(jī)制從一個(gè)預(yù)擦除單元內(nèi)拷貝所有的有效數(shù)據(jù)塊到一個(gè)新的單元,然后更新blocktoflash映射表,最后擦除廢舊的預(yù)擦除單元。
?。?)塊分配和關(guān)聯(lián)數(shù)據(jù)集結(jié)
TrueFFS會將關(guān)聯(lián)的數(shù)據(jù)(如出自同一個(gè)文件)集結(jié)到同一個(gè)單獨(dú)擦除單元(erase unit)內(nèi)的一段連續(xù)的區(qū)域中。為此,TrueFFS盡量在同一個(gè)擦除單元(erase unit)內(nèi)維持一個(gè)由多個(gè)物理上連續(xù)自由的塊組成的存儲池。這就提高了數(shù)據(jù)的讀取效率,減少碎片的產(chǎn)生。
(4)錯(cuò)誤恢復(fù)
TrueFFS使用了一種“先寫后擦”的策略。當(dāng)更新Flash一個(gè)扇區(qū)的數(shù)據(jù)時(shí),只有在更新操作完成并且新存儲的數(shù)據(jù)校驗(yàn)成功后,先前的數(shù)據(jù)才會被允許擦掉。操作成功,新扇區(qū)的數(shù)據(jù)才有效,否則老扇區(qū)的數(shù)據(jù)有效。
3開發(fā)背景介紹
在開發(fā)中使用的硬件電路板焊接了64 MB SDRAM,兩片NOR Flash,每片8 MB。嵌入式VxWorks開發(fā)時(shí)生成bootrom.bin文件為256 KB,VxWorks鏡像文件為5.13 MB。計(jì)劃借助TrueFFS創(chuàng)建兩個(gè)磁盤C和D,C中存放bootrom.bin和VxWorks鏡像文件,D中存放數(shù)據(jù)文件和工作日志。但創(chuàng)建TFFS時(shí),F(xiàn)lash大小必須以2的正整數(shù)次冪對齊,即C盤空間只能為1 MB、2 MB、4 MB或8 MB。由于bootrom.bin是直接固化到第一片NOR Flash中,所以無法實(shí)現(xiàn)將該Flash全部創(chuàng)建TFFS,導(dǎo)致不僅無法存放VxWorks鏡像文件,而且還造成Flash空間的浪費(fèi)。
4實(shí)現(xiàn)過程
將第一片NOR Flash(Intel公司生產(chǎn)的JS28F640J3)起始處的2 MB空間用于固化bootrom.bin文件,上電后可自動運(yùn)行bootrom;另外6 MB空間創(chuàng)建TFFS文件系統(tǒng)。構(gòu)建TFFS的過程中涉及5個(gè)文件的修改:config.h、Makefile、sysTffs.c、tffsConfig.c、i28f640.c。各文件改動如下:
(1)config.h:加入必要的定義
#defineINCLUDE_TFFS
#defineINCLUDE_TFFS_DOSFS
#defineINCLUDE_TFFS_SHOW
#defineINCLUDE_DOSFS
#defineINCLUDE_TL_FTL
/* 包含需要使用的翻譯層 */
?。?)Makefile:將生成的i28f640.o編譯進(jìn)系統(tǒng)映像,加入定義
MACH_EXTRA = i28f640.o
?。?)sysTffs.c:配置TFFS各項(xiàng)參數(shù)
#defineINCLUDE_MTD_I28F640
/* 可以調(diào)用i28f640Identify函數(shù) */
#defineINCLUDE_TL_FTL
/* 包含需要使用的翻譯層 */
#undefINCLUDE_TL_SSFDC
/* 去掉不使用的翻譯層 */
#defineFLASH_BASE_ADRS0
/* TFFS空間從0地址開始 */
#defineFLASH_SIZE0x00800000
/* 共8MB */
改寫sysTffsFormat函數(shù),完成格式化過程。此處必須弄清tffsDevFormatParams中各個(gè)參數(shù)的定義[3]。
typedef struct {
long int bootImageLen;
/*bootImage需要從flash開始處預(yù)留的長度*/
unsignedpercentUse;
/*Flash被格式化的百分率,為了提高TrueFFS的性能,不要設(shè)為100%,以便任何時(shí)候都有空余空間。默認(rèn)值為99%*/
unsignednoOfSpareUnits;
/*空余擦除單元數(shù)目,目的在于flash出現(xiàn)壞塊時(shí)可以用它來替代,默認(rèn)為1*/
unsigned long vmAddressingLimit;
/* FTL 在RAM中映射的大小,默認(rèn)為61Kbytes*/
FLStatus (*progressCallback)(int totalUnitsToFormat, int totalUnitsFormattedSoFar);
/* 回調(diào)函數(shù),用來監(jiān)測flash擦除過程,如果返回值為OK,則繼續(xù),否則停止擦除*/
char volumeId[4];
/*Dos卷標(biāo)號*/
char FAR1 * volumeLabel;
/*Dos卷標(biāo)字符串,如果為NULL,則沒有卷標(biāo)*/
unsigned noOfFATcopies;
/* 文件分配表(FAT)的拷貝數(shù),正常情況下只使用一個(gè)FAT,而另一個(gè)只有在使用的FAT被破壞的情況下用來恢復(fù)分配表,默認(rèn)為2*/
unsigned embeddedCISlength;
/* CIS 嵌在單元頭部(unit header)之后的字節(jié)長度*/
char FAR1 * embeddedCIS;
/* 單元頭部被結(jié)構(gòu)化用來作為一個(gè)PCMCIA''tuple'' 鏈(a CIS)的起始,它包含了一個(gè)數(shù)據(jù)組織tuple,通常用16進(jìn)制的0xFF來標(biāo)示上一個(gè)單元頭部結(jié)束的位置(''endoftuplechain'')。*/
} FormatParams;
實(shí)際使用的格式化參數(shù)為 {0x00200000l, 99, 1, 0x10000l , NULL, {0,0,0,0}, NULL, 2, 0, NULL} 。此文件的改寫是實(shí)現(xiàn)非2的n次冪TFFS文件系統(tǒng)創(chuàng)建的關(guān)鍵。在設(shè)置Flash地址和空間大小時(shí)依據(jù)NOR Flash的實(shí)際參數(shù)配置,而在對Flash格式化時(shí)修改bootImageLen參數(shù),將2 MB空間給bootrom,而TFFS只使用后面6 MB空間。
?。?)tffsConfig.c:在MTDidentifyRoutine mtdTable[]中加入定義
#ifdefINCLUDE_MTD_I28F640
i28f640Identify,
#endif
?。?)i28f640.c:實(shí)現(xiàn)MTD層的功能
根據(jù)js28f640j3數(shù)據(jù)手冊編寫FLFlash結(jié)構(gòu)體的各項(xiàng)成員,包括i28f640Write、i28f640Erase、i28f640Identify、lv28f640MTDMap。
程序中需要注意以下幾點(diǎn):
?、賹τ贜OR Flash,不需要編寫i28f640Read函數(shù);
?、谌绻?jiǎng)?chuàng)建多于1個(gè)TFFS文件系統(tǒng),需要對每個(gè)文件系統(tǒng)編寫lv28f640MTDMap函數(shù);
?、凼状蝿?chuàng)建時(shí),最好#define DEBUG_PRINT printf,可以觀察整個(gè)創(chuàng)建過程,便于查找問題;
?、苄枰诓脸蛯懖僮髦衅帘沃袛?,因?yàn)镕lash在擦除、讀寫ID狀態(tài)時(shí),不能正常讀取Flash中的數(shù)據(jù)。而VxWorks的異常入口位于Flash存儲器的開始處,異常發(fā)生時(shí)不能得到正常的入口指令,會導(dǎo)致系統(tǒng)跑飛。
5文件系統(tǒng)創(chuàng)建
第一次啟動時(shí)設(shè)置通過網(wǎng)絡(luò)加載映像,當(dāng)系統(tǒng)啟動成功后在Shell中執(zhí)行以下命令:
-> tffsShowAll
TFFS Version 2.2
0: socket=RFA: type=0x17, unitSize=0x20000, mediaSize=0x800000
1: socket=RFA: type=0x17, unitSize=0x20000, mediaSize=0x800000
value = 48 = 0x30 = '0'
-> sysTffsFormat
value = 0 = 0x0
-> sysTffsFormat
-> usrTffsConfig 0,0,"/tffs"
value = 0 = 0x0
-> devs
drv name
0 /null
1 /tyCo/0
5 host:
6 /vio
3 /tffs
value = 25 = 0x19
此時(shí)可以看到“3 /tffs”,說明設(shè)備掛接已經(jīng)成功。執(zhí)行dosFsShow “/tffs/”命令,/tffs空間5.68 MB可用。
6結(jié)束語
通過對TrueFFS相關(guān)函數(shù)的配置,可實(shí)現(xiàn)嵌入式VxWorks中非2的n次冪TFFS文件系統(tǒng)的構(gòu)建。本文詳細(xì)描述了創(chuàng)建過程及注意事項(xiàng)。這種方式已經(jīng)應(yīng)用到某發(fā)射系統(tǒng)的顯控技術(shù)上,設(shè)備運(yùn)行穩(wěn)定、可靠,具有較大的實(shí)用價(jià)值。
參考文獻(xiàn)
[1] 曹桂平,等. VxWorks設(shè)備驅(qū)動開發(fā)詳解[M]. 北京:電子工業(yè)出版社,2011.
?。?] Wind River systems Inc. VxWorks reference manual[Z]. 1999.
?。?] Wind River Systems Inc. VxWorks drivers API reference[Z]. 2006.