<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式系統中的線(xiàn)性Flash文件系統設計

嵌入式系統中的線(xiàn)性Flash文件系統設計

作者: 時(shí)間:2004-12-11 來(lái)源:網(wǎng)絡(luò ) 收藏

作者: WuYJ@263.net.cn

摘要:一種能夠在典型環(huán)境下應用的,為空間的管理提供一種非常有效的手段。它包裝和通用類(lèi)似的API接口,的實(shí)現獨立于實(shí)時(shí)操作系統(RTOS)和具體的典型,可方便移植到不同的應用中。

在嵌入式系統中,為了便于對閃存()空間進(jìn)行管理,會(huì )采用的形式來(lái)訪(fǎng)問(wèn)Flash。目前,可以購買(mǎi)到的Flash文件系統一般都是兼容DOS的文件系統(Flash File System,FFS),這對需要一個(gè)具有復雜的目錄層次,并且DDS文件兼容的系統來(lái)說(shuō)是必要的;但是對大多數的嵌入式應用來(lái)說(shuō),這種文件系統太過(guò)奢侈。筆者在參與嵌入式系統項目的時(shí)候,了一種文件系統,它適用于大多數的嵌入式應用對Flash文件系統的需求。

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

1 線(xiàn)性文件系統

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

圖1 Flash文件系統空間

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

陰影部分是文件頭,數據結構如下:

struct hdr{

unsigned short hdrsize; /*文件頭字節數*/

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

long filsize; /*文件大小*/

long flags; /*描述文件的標識*/

unsigned long filcrc; /*文件數據的CRC32的值*/

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

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

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

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

};

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

struct defraghdr{

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

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

long filsize; /*文件大小*/

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

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

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

long nesn; /*新的文件尾的扇區號*/

long neso; /*新的文件尾的扇區偏移量*/

char *nda; /*新的文件起始地址*/

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

};

struct sectorcrc{

unsigned long precrc; /*碎片整理前扇區數據CRC32的值*/

unsigned long postcrc; /*碎片整理后扇區數據CRC32的值*/

};

從上面介紹可知,除了文件數據之外,文件系統還需要如下4種額外的開(kāi)銷(xiāo)。

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

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

③碎片整理前后的扇區CRC32值表:保存文件整理前后的CRC32值,總的字節數約為文件所占扇區數的4倍。

④空閑塊:用來(lái)在碎片整理過(guò)程中備份當前整理扇區數據。它必須不小于文件系統其它所有扇區。

可以用下面方程計算系統開(kāi)銷(xiāo)的總和:

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

其中:

FTOT是總的文件數;

HDRSIZE是文件頭字節數(目前為76字節);

SPARESIZE是空閑塊的大??;

SECTORCOUNT是分配給文件系統的Flash扇區數,不包括空閑塊。

圖2 文件碎片整理

2 碎片整理

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

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

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

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

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

3 應用分析

Flash的扇區有最大擦寫(xiě)次數。當前的Flash芯片一般支持10萬(wàn)~100萬(wàn)次的擦除。文件系統的應用各不相同,所以這里不能下結論說(shuō)采用線(xiàn)性文件系統Flash的壽命會(huì )有多長(cháng)。下面解釋文件系統訪(fǎng)問(wèn)Flash的方法。這樣用戶(hù)可以根據應用來(lái)判斷Flash的預期壽命。

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

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

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

在一個(gè)典型的嵌入式應用里,文件系統中的可執行文件本身就是應用程序??蓤绦形募话闶亲畲蟮奈募?,也是最不可能經(jīng)常改變的文件。這意味著(zhù)執行文件所占用的空間是相對固定的,將會(huì )減少空閑扇區因為碎片整理而進(jìn)行的擦寫(xiě)次數。另外一方面,如果有任何文件需要定期改動(dòng),碎片整理將會(huì )更加頻繁運行。

結語(yǔ)

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

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>