- 相關推薦
嵌入式系統(tǒng)中的線性Flash文件系統(tǒng)設計
在嵌入式系統(tǒng)中,為了便于對閃存(Flash)空間進行管理,會采用文件的形式來訪問Flash。目前,可以購買到的Flash文件系統(tǒng)一般都是兼容DOS的文件系統(tǒng)(Flash File System,F(xiàn)FS),這對需要一個具有復雜的目錄層次,并且DDS文件兼容的系統(tǒng)來說是必要的;但是對大多數(shù)的嵌入式應用來說,這種文件系統(tǒng)太過奢侈。筆者在參與嵌入式系統(tǒng)項目的時候,設計了一種線性文件系統(tǒng),它適用于大多數(shù)的嵌入式應用對Flash文件系統(tǒng)的需求。
線性文件系統(tǒng)設計基于三個目標:一是提供給應用程序通過文件名而不是物理地址訪問系統(tǒng)Flash的能力;二是文件系統(tǒng)的設計獨立于實時操作系統(tǒng)(RTOS),這樣可以很容易移植到不同的嵌入式應用中;三是設計統(tǒng)一的底層接口,適應不同的Flash類型。本文設計的線性文件系統(tǒng)為典型的嵌入式系統(tǒng)提供了所需的類文件系統(tǒng)能力。需要注意的是,本文件系統(tǒng)不支持復雜的Flash扇區(qū)擦寫次數(shù)均衡算法,沒有目錄層次,并且和其它的文件系統(tǒng)不兼容。
1 線性文件系統(tǒng)
線性文件系統(tǒng)的設計思路是這樣的:文件分為文件頭和文件數(shù)據(jù)區(qū)兩個部分,每個文件按照順序存放在Flash中,以單向鏈表來鏈接文件。文件的起始部分是文件頭,包含文件的屬性、指向下一個文件頭的指針、文件頭和文件數(shù)據(jù)區(qū)的32位循環(huán)冗余校驗和(CRC32)等。文件頭用一個32位的字來表示文件屬性,每位表示一種屬性,如數(shù)據(jù)文件或者是可執(zhí)行文件,是否已刪除的文件等,具體可以根據(jù)應用的需要來定義文件的屬性;文件頭和文件數(shù)據(jù)區(qū)維護獨立的CRC32校驗,使文件系統(tǒng)能更精確檢測文件的完整性。文件的起始地址沒有特殊需求,分配給文件系統(tǒng)的Flash大小限制了文件的大小。另外,線性文件系統(tǒng)作為嵌入式系統(tǒng)的一個功能模塊,它為應用程序提供與標準文件系統(tǒng)類似的API接口,如:read()、write()、open()、close()、stat()和seek()等。對于同時在多片F(xiàn)lash的系統(tǒng)而言,每片F(xiàn)lash相當于一個目標,文件都可存儲在任何一片中(當然受物理空間限制),但不能跨片存儲。
圖1 Flash文件系統(tǒng)空間
在第一個文件創(chuàng)建之前,必須進行初始化,將所有分配給文件系統(tǒng)的Flash空間擦除。當創(chuàng)建第一個文件時,起始位置從文件系統(tǒng)的起始地址開始,文件頭指針指向下一個空文件的起始位置(鏈表尾部);第二個文件的位置從當前的鏈表尾部開始,同時文件頭中的鏈表指針指向新的尾部。刪除文件時,僅僅是簡單地把文件頭的標識位中的活動文件標識位置0,表示刪除。這樣,在經(jīng)過多次刪除之后,就有必要運行碎片整理模塊來進行文件系統(tǒng)Flash空間的碎片整理。碎片整理模塊還需要在文件系統(tǒng)Flash空間尾部留一個扇區(qū)來數(shù)據(jù)備份,以便當碎片整理被打斷時(如下電或者復位)可以恢復文件系統(tǒng)。這個保留的扇區(qū)稱空閑扇區(qū)。它必須放在文件系統(tǒng)空間之后,這樣可以保證文件系統(tǒng)的所有文件在所占用的Flash空間是連續(xù)的。整個文件空間的分配如圖1所示。
陰影部分是文件頭,數(shù)據(jù)結構如下:
struct hdr{
unsigned short hdrsize; /*文件頭字節(jié)數(shù)*/
long filsize; /*文件頭版本*/
long filsize; /*文件大小*/
long flags; /*描述文件的標識*/
unsigned long filcrc; /*文件數(shù)據(jù)的CRC32的值*/
unsigned long hdrcec; /*文件的最后修改時間*/
struct hdr *next; /*指向下一個文件頭的指針*/
char name[NAMESIZE]; /*文件名*/
char info[INFOSIZE]; /*文件描述信息*/
};
碎片整個記錄區(qū)包含兩種數(shù)據(jù)類型:碎片整理文件頭信息表defraghdr和文件區(qū)扇區(qū)整理前后的CRC值備份表sectorcre。具體的地址分配從空閑扇區(qū)的起始地址減1開始,往前分配文件系統(tǒng)扇區(qū)數(shù)乘以4字節(jié)作為sectorcrc的空間;從sectorcrc起始地址減1開始,往前分配活動文件個數(shù)乘以64字節(jié)作為碎片整理文件頭信息表。這兩個結構定義如下:
struct defraghdr{
struct hdr *ohdr; /*文件頭的原始位置指針*/
struct hdr *nextfile; /*指向下一個文件的指針*/
long filsize; /*文件大小*/
unsigned long crc; /*這個頭的CRC32值*/
unsigned long ohdrcrc; /*原始文件頭CRC32值的拷貝*/
long idx; /*碎片整理表頭的索引*/
long nesn; /*新的文件尾的扇區(qū)號*/
long neso; /*新的文件尾的扇區(qū)偏移量*/
char *nda; /*新的文件起始地址*/
char fname[NAMESIZE]; /*文件名*/
};
struct sectorcrc{
unsigned long precrc; /*碎片整理前扇區(qū)數(shù)據(jù)CRC32的值*/
unsigned long postcrc; /*碎片整理后扇區(qū)數(shù)據(jù)CRC32的值*/
};
從上面介紹可知,除了文件數(shù)據(jù)之外,文件系統(tǒng)還需要如下4種額外的開銷。
①文件頭:這是每個文件必須的開銷,如果文件名和信息域各24字節(jié),那么整個文件頭共76字節(jié)。
②碎片整理文件頭信息表:每個活動(非刪除)的文件在進行碎片整理時在這個表里創(chuàng)建一個表項,每個表項64字節(jié)。
③碎片整理前后的扇區(qū)CRC32值表:保存文件整理前后的CRC32值,總的字節(jié)數(shù)約為文件所占扇區(qū)數(shù)的4倍。
④空閑塊:用來在碎片整理過程中備份當前整理扇區(qū)數(shù)據(jù)。
【嵌入式系統(tǒng)中的線性Flash文件系統(tǒng)設計】相關文章:
一個嵌入式系統(tǒng)的Petri網(wǎng)模型與CPLD實現(xiàn)05-29
Openprocess在熱網(wǎng)監(jiān)控系統(tǒng)中的應用06-04
關于公寓式建筑工程系統(tǒng)中弱電系統(tǒng)的劃分論文05-22
嵌入式系統(tǒng)以太網(wǎng)卡控制器LAN91C9605-30
探析Openprocess在熱網(wǎng)監(jiān)控系統(tǒng)中的應用05-29
談Openprocess在熱網(wǎng)監(jiān)控系統(tǒng)中的應用06-09
crm中的決策支持系統(tǒng)與貿(mào)易智能02-23
學生信息管理系統(tǒng)設計開題報告07-20
藝術設計中的設計思維論文(精選7篇)05-21