當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]嵌入式系統(tǒng)中的線性Flash文件系統(tǒng)設(shè)計(jì)

作者: WuYJ@263.net.cn

    摘要:設(shè)計(jì)一種能夠在典型嵌入式環(huán)境下應(yīng)用的線性文件系統(tǒng),為嵌入式系統(tǒng)Flash空間的管理提供一種非常有效的手段。它包裝和通用文件系統(tǒng)類似的API接口,設(shè)計(jì)的實(shí)現(xiàn)獨(dú)立于實(shí)時(shí)操作系統(tǒng)(RTOS)和具體的Flash典型,可方便移植到不同的嵌入式應(yīng)用中。

在嵌入式系統(tǒng)中,為了便于對(duì)閃存(Flash)空間進(jìn)行管理,會(huì)采用文件的形式來訪問Flash。目前,可以購(gòu)買到的Flash文件系統(tǒng)一般都是兼容DOS的文件系統(tǒng)(Flash File System,F(xiàn)FS),這對(duì)需要一個(gè)具有復(fù)雜的目錄層次,并且DDS文件兼容的系統(tǒng)來說是必要的;但是對(duì)大多數(shù)的嵌入式應(yīng)用來說,這種文件系統(tǒng)太過奢侈。筆者在參與嵌入式系統(tǒng)項(xiàng)目的時(shí)候,設(shè)計(jì)了一種線性文件系統(tǒng),它適用于大多數(shù)的嵌入式應(yīng)用對(duì)Flash文件系統(tǒng)的需求。

線性文件系統(tǒng)設(shè)計(jì)基于三個(gè)目標(biāo):一是提供給應(yīng)用程序通過文件名而不是物理地址訪問系統(tǒng)Flash的能力;二是文件系統(tǒng)的設(shè)計(jì)獨(dú)立于實(shí)時(shí)操作系統(tǒng)(RTOS),這樣可以很容易移植到不同的嵌入式應(yīng)用中;三是設(shè)計(jì)統(tǒng)一的底層接口,適應(yīng)不同的Flash類型。本文設(shè)計(jì)的線性文件系統(tǒng)為典型的嵌入式系統(tǒng)提供了所需的類文件系統(tǒng)能力。需要注意的是,本文件系統(tǒng)不支持復(fù)雜的Flash扇區(qū)擦寫次數(shù)均衡算法,沒有目錄層次,并且和其它的文件系統(tǒng)不兼容。

1 線性文件系統(tǒng)

線性文件系統(tǒng)的設(shè)計(jì)思路是這樣的:文件分為文件頭和文件數(shù)據(jù)區(qū)兩個(gè)部分,每個(gè)文件按照順序存放在Flash中,以單向鏈表來鏈接文件。文件的起始部分是文件頭,包含文件的屬性、指向下一個(gè)文件頭的指針、文件頭和文件數(shù)據(jù)區(qū)的32位循環(huán)冗余校驗(yàn)和(CRC32)等。文件頭用一個(gè)32位的字來表示文件屬性,每位表示一種屬性,如數(shù)據(jù)文件或者是可執(zhí)行文件,是否已刪除的文件等,具體可以根據(jù)應(yīng)用的需要來定義文件的屬性;文件頭和文件數(shù)據(jù)區(qū)維護(hù)獨(dú)立的CRC32校驗(yàn),使文件系統(tǒng)能更精確檢測(cè)文件的完整性。文件的起始地址沒有特殊需求,分配給文件系統(tǒng)的Flash大小限制了文件的大小。另外,線性文件系統(tǒng)作為嵌入式系統(tǒng)的一個(gè)功能模塊,它為應(yīng)用程序提供與標(biāo)準(zhǔn)文件系統(tǒng)類似的API接口,如:read()、write()、open()、close()、stat()和seek()等。對(duì)于同時(shí)在多片F(xiàn)lash的系統(tǒng)而言,每片F(xiàn)lash相當(dāng)于一個(gè)目標(biāo),文件都可存儲(chǔ)在任何一片中(當(dāng)然受物理空間限制),但不能跨片存儲(chǔ)。

圖1 Flash文件系統(tǒng)空間

    在第一個(gè)文件創(chuàng)建之前,必須進(jìn)行初始化,將所有分配給文件系統(tǒng)的Flash空間擦除。當(dāng)創(chuàng)建第一個(gè)文件時(shí),起始位置從文件系統(tǒng)的起始地址開始,文件頭指針指向下一個(gè)空文件的起始位置(鏈表尾部);第二個(gè)文件的位置從當(dāng)前的鏈表尾部開始,同時(shí)文件頭中的鏈表指針指向新的尾部。刪除文件時(shí),僅僅是簡(jiǎn)單地把文件頭的標(biāo)識(shí)位中的活動(dòng)文件標(biāo)識(shí)位置0,表示刪除。這樣,在經(jīng)過多次刪除之后,就有必要運(yùn)行碎片整理模塊來進(jìn)行文件系統(tǒng)Flash空間的碎片整理。碎片整理模塊還需要在文件系統(tǒng)Flash空間尾部留一個(gè)扇區(qū)來數(shù)據(jù)備份,以便當(dāng)碎片整理被打斷時(shí)(如下電或者復(fù)位)可以恢復(fù)文件系統(tǒng)。這個(gè)保留的扇區(qū)稱空閑扇區(qū)。它必須放在文件系統(tǒng)空間之后,這樣可以保證文件系統(tǒng)的所有文件在所占用的Flash空間是連續(xù)的。整個(gè)文件空間的分配如圖1所示。

陰影部分是文件頭,數(shù)據(jù)結(jié)構(gòu)如下:

struct hdr{

unsigned short hdrsize; /*文件頭字節(jié)數(shù)*/

long filsize; /*文件頭版本*/

long filsize; /*文件大小*/

long flags; /*描述文件的標(biāo)識(shí)*/

unsigned long filcrc; /*文件數(shù)據(jù)的CRC32的值*/

unsigned long hdrcec; /*文件的最后修改時(shí)間*/

struct hdr *next; /*指向下一個(gè)文件頭的指針*/

char name[NAMESIZE]; /*文件名*/

char info[INFOSIZE]; /*文件描述信息*/

};

碎片整個(gè)記錄區(qū)包含兩種數(shù)據(jù)類型:碎片整理文件頭信息表defraghdr和文件區(qū)扇區(qū)整理前后的CRC值備份表sectorcre。具體的地址分配從空閑扇區(qū)的起始地址減1開始,往前分配文件系統(tǒng)扇區(qū)數(shù)乘以4字節(jié)作為sectorcrc的空間;從sectorcrc起始地址減1開始,往前分配活動(dòng)文件個(gè)數(shù)乘以64字節(jié)作為碎片整理文件頭信息表。這兩個(gè)結(jié)構(gòu)定義如下:

struct defraghdr{

struct hdr *ohdr; /*文件頭的原始位置指針*/

struct hdr *nextfile; /*指向下一個(gè)文件的指針*/

long filsize; /*文件大小*/

unsigned long crc; /*這個(gè)頭的CRC32值*/

unsigned long ohdrcrc; /*原始文件頭CRC32值的拷貝*/

long idx; /*碎片整理表頭的索引*/

long nesn; /*新的文件尾的扇區(qū)號(hào)*/

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種額外的開銷。

①文件頭:這是每個(gè)文件必須的開銷,如果文件名和信息域各24字節(jié),那么整個(gè)文件頭共76字節(jié)。

②碎片整理文件頭信息表:每個(gè)活動(dòng)(非刪除)的文件在進(jìn)行碎片整理時(shí)在這個(gè)表里創(chuàng)建一個(gè)表項(xiàng),每個(gè)表項(xiàng)64字節(jié)。

③碎片整理前后的扇區(qū)CRC32值表:保存文件整理前后的CRC32值,總的字節(jié)數(shù)約為文件所占扇區(qū)數(shù)的4倍。

④空閑塊:用來在碎片整理過程中備份當(dāng)前整理扇區(qū)數(shù)據(jù)。它必須不小于文件系統(tǒng)其它所有扇區(qū)。

可以用下面方程計(jì)算系統(tǒng)開銷的總和:

overhead=(FTOT*(HDRSIZE+64))+SPARESIZE+(SECTORCOUNT*8)

其中:

FTOT是總的文件數(shù);

HDRSIZE是文件頭字節(jié)數(shù)(目前為76字節(jié));

SPARESIZE是空閑塊的大??;

SECTORCOUNT是分配給文件系統(tǒng)的Flash扇區(qū)數(shù),不包括空閑塊。

圖2 文件碎片整理

2 碎片整理

創(chuàng)建新文件需要占用文件系統(tǒng)空間;但是,由于Flash的底層技術(shù)不允許Flash中的任意地址空間被刪除,而是按照扇區(qū)為單位刪除,為此在刪除一個(gè)文件的時(shí)候,暫時(shí)沒有把整個(gè)文件所占的空間刪除,僅僅是在文件頭的標(biāo)識(shí)里作一個(gè)刪除標(biāo)識(shí),并保留在Flash中。這樣,被刪除文件積累到一定的數(shù)量時(shí),就會(huì)占用相當(dāng)大的空間。因此,需要整理文件系統(tǒng)Flash空間,使被刪除文件占用的空間重新使用。圖2顯示了碎片整理過程。文件F1、F2和F5已經(jīng)被刪除,并且在碎片整理之后從Flash中被清除。

進(jìn)行碎片整理的方法可以有多種。對(duì)于嵌入式系統(tǒng)來說,選擇哪種方法,衡量的依據(jù)是復(fù)雜性和功能之間的平衡。下面討論兩種不同的方法:第一種方法相當(dāng)簡(jiǎn)單,但是有缺陷;第二種方法功能強(qiáng)大得多,筆者在線性文件實(shí)現(xiàn)中即采用這種方法。當(dāng)然,存在更加復(fù)雜的解決辦法,但通常的情況是,所添加的復(fù)雜性會(huì)使整個(gè)文件系統(tǒng)的實(shí)現(xiàn)更加復(fù)雜。目標(biāo)是保持文件存儲(chǔ)的簡(jiǎn)單和線性,保證所有的文件都是以連續(xù)的空間存儲(chǔ)在Flash中。

最簡(jiǎn)單的方法是將活動(dòng)的文件備份在RAM中,刪除分配給文件系統(tǒng)的Flash空間,然后將RAM中備份的所有文件拷貝回Flash。這種方法很簡(jiǎn)單,并且不需要分配一個(gè)扇區(qū)作為空閑區(qū);但問題是,需要有一整塊和分配給文件系統(tǒng)的空間一樣大的RAM來完成這項(xiàng)工作。更糟的是,如果此時(shí)系統(tǒng)被復(fù)位,或者在刪除扇區(qū)內(nèi)容卻還沒有將文件拷貝回Flash的時(shí)候被斷電,文件系統(tǒng)將會(huì)崩潰。因?yàn)镽AM中的內(nèi)容會(huì)隨之選擇,文件內(nèi)容會(huì)被破壞掉。

我們?cè)谖募到y(tǒng)實(shí)現(xiàn)設(shè)計(jì)了一種碎片整理方法,可以防止在碎片整理過程中系統(tǒng)復(fù)位導(dǎo)致文件崩潰的情況。采用這種方法,不需要大塊的RAM,但是需要預(yù)選先分配給碎片整理過程一個(gè)Flash扇區(qū)作為備份區(qū)。這個(gè)扇區(qū)的字節(jié)數(shù)不小于任何分配給文件系統(tǒng)的扇區(qū)。在整個(gè)文件系統(tǒng)中,這個(gè)扇區(qū)位于分配給文件系統(tǒng)最后一個(gè)扇區(qū)的下一個(gè)扇區(qū)。因?yàn)樯葏^(qū)可能比需要分配給非刪除文件的備份的空間要小,所以它必須逐個(gè)扇區(qū)進(jìn)行處理,而不是一下就把所有的碎片整理完。采用備份扇區(qū)的好處是,在碎片整理過程中,無論斷電或者復(fù)位都不會(huì)破壞文件系統(tǒng)。當(dāng)下次系統(tǒng)重新恢復(fù)時(shí),會(huì)根據(jù)在碎片整理前記錄的每個(gè)扇區(qū)碎片整理前后CRC值,來判斷當(dāng)前的文件碎片整理狀態(tài)。如果上次文件整理沒有完成,就會(huì)繼續(xù)上次的整理。這種技術(shù)的一個(gè)缺陷是空閑扇區(qū)的擦寫次數(shù)會(huì)較多。這樣空閑扇區(qū)就可能因?yàn)檫_(dá)到擦寫壽命而失敗。達(dá)到這一點(diǎn)的關(guān)鍵依賴于使用的Flash、所分配給文件系統(tǒng)的扇區(qū)數(shù)、文件刪除和重建的頻率。一個(gè)可行的解決辦法采用電池備份的RAM來替換空閑扇區(qū),可以增加Flash的整體壽命,但是對(duì)那些預(yù)算緊張的應(yīng)用來說太過奢移。

具體的碎片整理過程是,首先建立碎片整理區(qū)。①為每個(gè)扇區(qū)建立2個(gè)CRC32表項(xiàng);第一個(gè)CRC32是這個(gè)扇區(qū)在碎片整理前的CRC值;第二個(gè)CRC32值是計(jì)算出來的碎片整理后的CRC32值。這些CRC是當(dāng)碎片整理過程被打斷時(shí),用來重新恢復(fù)整理用的。②創(chuàng)建碎片整理文件頭信息表,每個(gè)活動(dòng)的文件占用一個(gè)表項(xiàng)。③計(jì)算①和②的CRC值,并保存。①~③的數(shù)據(jù)保存在圖1中的碎片整理記錄區(qū)。第二步是文件重定位;遍歷文件系統(tǒng)的每個(gè)扇區(qū),處理重新定位后存儲(chǔ)空間和該扇區(qū)相覆蓋的文件。在每個(gè)扇區(qū)被重寫之前,扇區(qū)原來的信息被保存在空閑扇區(qū)里。第三步,擦除Flash;遍歷未使用的扇區(qū),確認(rèn)所有的扇區(qū)被刪除。第四步,完整性檢測(cè):對(duì)新的文件進(jìn)行檢測(cè),保證所有重定位的文件都是完整的。

3 應(yīng)用分析

Flash的扇區(qū)有最大擦寫次數(shù)。當(dāng)前的Flash芯片一般支持10萬~100萬次的擦除。文件系統(tǒng)的應(yīng)用各不相同,所以這里不能下結(jié)論說采用線性文件系統(tǒng)Flash的壽命會(huì)有多長(zhǎng)。下面解釋文件系統(tǒng)訪問Flash的方法。這樣用戶可以根據(jù)應(yīng)用來判斷Flash的預(yù)期壽命。

我們所設(shè)計(jì)的線性文件系統(tǒng)并不進(jìn)行扇區(qū)刪除次數(shù)均衡,以延長(zhǎng)Flash的使用壽命。如果所需要的文件系統(tǒng)頻繁修改并需要扇區(qū)刪除次數(shù)均衡,可以購(gòu)買現(xiàn)成的Flash文件系統(tǒng)。扇區(qū)刪除均衡算法大大增加了底層實(shí)現(xiàn)的復(fù)雜性,并且超出本文的討論范圍。一般來說,通過文件系統(tǒng)來管理Flash的需求遠(yuǎn)大于對(duì)Flash扇區(qū)擦寫次數(shù)均衡的需求,特別是現(xiàn)在越來越多的Flash扇區(qū)都支持100萬次的擦寫。

如上面所提到的,文件系統(tǒng)本身提供給編程者的接口API與標(biāo)準(zhǔn)OS提供的接口類似。這可能誤導(dǎo)開發(fā)者認(rèn)為文件系統(tǒng)可以看作是一個(gè)硬盤,以任意的頻率進(jìn)行讀寫操作。事實(shí)并不是這樣,線性文件系統(tǒng)碎片整理同制并沒有進(jìn)行擦寫次數(shù)均衡,這意味著空閑扇區(qū)可能會(huì)是最早損壞的Flash扇區(qū)。因?yàn)樵谒槠磉^程中,空閑扇區(qū)被用作其它所有扇區(qū)的暫時(shí)存放扇區(qū)。例如在設(shè)計(jì)里,有13個(gè)扇區(qū)Flash用來作線性文件系統(tǒng)區(qū),有1個(gè)扇區(qū)作為空閑扇區(qū)。假設(shè)對(duì)于最壞情況的碎片整理(13個(gè)扇區(qū)都影響到),如果每天進(jìn)行1次碎片整理,對(duì)于100 000次擦寫次數(shù)的Flash而言,可用期能夠超過20年(100 000/13/365=21)。20年是基于每天進(jìn)行1次碎片整理,并且所有扇區(qū)都影響到的情況。碎片整理的頻率和整理所影響到的扇區(qū)數(shù)受應(yīng)用程序使用文件的限制。用戶可以根據(jù)文件系統(tǒng)的應(yīng)用來估算Flash扇區(qū)的磨損情況,并作相應(yīng)的處理。

下面討論文件系統(tǒng)是如何使用扇區(qū)的。Flash扇區(qū)僅僅在碎片整理時(shí)候才被擦除。當(dāng)刪除文件的時(shí)候,只是簡(jiǎn)單地作一個(gè)標(biāo)識(shí)(文件頭的一個(gè)位)。如果一個(gè)存在的文件以寫的方式打開,實(shí)際的修改步驟是,刪除原有的文件,并在當(dāng)前文件系統(tǒng)的最后一個(gè)文件之后重寫該文件。最后,這個(gè)過程會(huì)使文件系統(tǒng)的Flash空間被耗盡,這要就需要運(yùn)行碎片整理程序。碎片整理程序會(huì)使已被刪除文件所占用的空間被清除,所有活動(dòng)的文件在Flash中的位置以連續(xù)的方式存放。每個(gè)扇區(qū)的整理過程是,扇區(qū)被拷貝到空閑扇區(qū)作備份,然后原來的扇區(qū)被刪除,計(jì)算出該扇區(qū)在文件整理后的內(nèi)容,寫入扇區(qū),之后刪除空閑扇區(qū)的備份。文件系統(tǒng)從頭到尾每個(gè)扇區(qū)重復(fù)這樣作。在碎片整理時(shí),如果一個(gè)扇區(qū)不需要進(jìn)行碎片整理,碎片整理程序就不會(huì)動(dòng)這個(gè)扇區(qū)因此,受碎片整理程序影響的扇區(qū)數(shù)目依賴于當(dāng)前被文件系統(tǒng)占用的Flash扇區(qū)數(shù)和被刪除文件在Flash中的位置。

在一個(gè)典型的嵌入式應(yīng)用里,文件系統(tǒng)中的可執(zhí)行文件本身就是應(yīng)用程序。可執(zhí)行文件一般是最大的文件,也是最不可能經(jīng)常改變的文件。這意味著執(zhí)行文件所占用的空間是相對(duì)固定的,將會(huì)減少空閑扇區(qū)因?yàn)樗槠矶M(jìn)行的擦寫次數(shù)。另外一方面,如果有任何文件需要定期改動(dòng),碎片整理將會(huì)更加頻繁運(yùn)行。

結(jié)語

本文所設(shè)計(jì)的線性文件系統(tǒng)已經(jīng)成功應(yīng)用在筆者參加的嵌入式系統(tǒng)的產(chǎn)品,并且在實(shí)踐中證明是一種比較有效的管理Flash的方式。當(dāng)然,線性文件系統(tǒng)不是解決所有嵌入式應(yīng)用管理Flash空間問題的答案,但是它對(duì)于那些不能判斷是否要購(gòu)買現(xiàn)成的Flash文件系統(tǒng)的項(xiàng)目提供了一個(gè)非常有用的選擇方案。有關(guān)線性文件系統(tǒng)實(shí)現(xiàn)的C源代碼,可以通過E-Mail:WuYJ@263.net.cn直接與筆者聯(lián)系。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉