本發(fā)明涉及嵌入式文件系統(tǒng)領(lǐng)域,具體涉及一種適用于ic卡的文件系統(tǒng)的實現(xiàn)方法,本發(fā)明的適用范圍包括但不限于ic卡,同樣適用于其它與ic卡類似的存儲器的文件系統(tǒng)的實現(xiàn)。
背景技術(shù):
隨著電子技術(shù)、計算機技術(shù)的飛速發(fā)展,不管是pc系統(tǒng)還是嵌入式系統(tǒng),存儲和管理大量數(shù)據(jù)的應用需求愈加廣泛。ic卡是專門為大容量存儲設計的閃存卡,具有成本低、兼容性好等優(yōu)點。在某些行業(yè)應用中,為了ic卡能夠和pc系統(tǒng)、嵌入式系統(tǒng)按照特定的格式方便地進行數(shù)據(jù)交換,需要設計文件系統(tǒng),以屏蔽物理存儲器的技術(shù)細節(jié),把所管理的信息組織成文件形式,從而增加應用的可移植性和可維護性,便于用戶有效管理大量的數(shù)據(jù),同時,某些特殊行業(yè)對文件內(nèi)容和格式有一定保密性和私有定制需求,所以構(gòu)建一種適用于ic卡的專用文件系統(tǒng)具有一定的實際意義。
目前在通用計算機上已有不少成熟的文件系統(tǒng),如fat、ntfs文件系統(tǒng)及unix、linux文件系統(tǒng),但上述文件系統(tǒng)不適合ic卡直接使用,主要問題有:首先,ic卡應用于pc系統(tǒng)時通過讀寫器操作,應用環(huán)境較為惡劣,存在電源電壓不穩(wěn)、突發(fā)斷電、頻繁插拔等問題,通用文件系統(tǒng)對于可靠性的設計考慮不足;其次,ic卡應用于嵌入式設備讀寫時,通用文件系統(tǒng)基于資源豐富的pc平臺和慢速的磁盤驅(qū)動器,需要耗費大量資源,而嵌入式系統(tǒng)往往資源有限;再次,ic卡的flash存儲器芯片固有屬性決定了通用文件系統(tǒng)不適用,其通常由若干塊組成,塊由若干頁/扇區(qū)組成,而頁則包含一定數(shù)量字節(jié)的存儲單元。flash存儲器的讀操作與磁盤一致,但寫操作與磁盤不同,通用文件系統(tǒng)對此沒有相應的專門設計。flash存儲器文件所占用的存儲空間基本單位是塊,數(shù)據(jù)寫操作必須在空白區(qū)塊或者擦除后區(qū)塊中進行,擦除要求以塊block為單位進行(將oxff寫入待擦除的存儲器塊),寫操作按頁/扇區(qū)page方式進行(一次必須寫入一個page),且flash存儲器的擦除次數(shù)是有限的,flash存儲器上建立文件系統(tǒng)時必須考慮flash存儲器這些固有特性,某些塊過度擦除會導致大大降低flash存儲器的使用壽命。鑒于通用fat文件系統(tǒng)在ic卡上應用的上述缺點,亟需提出一種適用于ic卡的文件系統(tǒng)實現(xiàn)方法。
技術(shù)實現(xiàn)要素:
本發(fā)明提供一種文件系統(tǒng)的實現(xiàn)方法,以解決現(xiàn)有技術(shù)存在的問題。
本發(fā)明采用以下技術(shù)方案:
文件系統(tǒng)實現(xiàn)方法,存儲區(qū)中分配存儲在塊中的fst區(qū)、fdt區(qū)、fat區(qū)和數(shù)據(jù)簇區(qū);
所述fst區(qū)表示文件系統(tǒng)信息區(qū),用于存儲文件系統(tǒng)基本信息;fdt區(qū)表示文件描述信息區(qū),用于存儲描述文件的基本信息,所述文件的基本信息至少包括文件名稱、起始簇、大小、創(chuàng)建時間;fat區(qū)表示文件分配信息區(qū),用于存儲文件的分配信息,數(shù)據(jù)簇區(qū)存儲文件內(nèi)容;
fst區(qū)同時存儲fdt區(qū)的起始地址和fat區(qū)的起始地址;
fdt區(qū)設置fdt表,fdt表中存儲文件的文件描述信息;當對文件的操作造成文件描述信息發(fā)生改變時,fdt區(qū)生成新的fdt表并進行存儲;
fat區(qū)設置fat表,fat表中存儲文件在數(shù)據(jù)簇區(qū)的簇分配情況和簇連接關(guān)系;當對文件的操作造成文件分配信息的發(fā)生改變時,fat區(qū)生成新的fat表并進行存儲;
當對文件的操作造成文件描述信息和/或文件分配信息發(fā)生改變時,fdt區(qū)生成新的fdt表并進行存儲,fat區(qū)生成新的fat表并進行存儲;
通過fst區(qū)的起始地址索引fdt區(qū)和fat區(qū),同時通過fdt表索引文件起始簇,通過fat表索引文件各簇的鏈接關(guān)系,通過各簇的連接關(guān)系索引數(shù)據(jù)簇區(qū)存儲的整個文件內(nèi)容。
所述fst區(qū)固定存儲在塊i,fdt區(qū)和fat區(qū)存儲在不同塊,數(shù)據(jù)簇區(qū)存儲在其余塊;其中0≤i≤n-1,n表示存儲區(qū)中塊的數(shù)目,i表示存儲區(qū)的第i塊;
所述fdt區(qū)分為fdt表區(qū)和fdt表索引區(qū),fdt表存儲在fdt表區(qū),通過fdt表索引區(qū)能夠索引到fdt表;
fat區(qū)分為fat表區(qū)和fat表索引區(qū),fat表存儲在fat表區(qū),通過fat表索引區(qū)能夠索引到fat表;
當對文件的操作造成文件描述信息與文件分配信息發(fā)生改變時,對fdt區(qū)和fat區(qū)進行以下操作:
fdt區(qū):重新生成新的fdt表,并遞增追加到上一個fdt表的下一個位置,同時在fdt表索引區(qū)中遞增新的有效索引號,該有效索引號能夠索引到新的fdt表;當fdt表索引區(qū)寫滿,則分配新的塊給fdt區(qū),并擦除當前fdt區(qū)所在的塊,同時將新的fdt區(qū)的起始地址更新至fst區(qū)中;
fat區(qū):重新生成新的fat表,并遞增追加到上一個fat表的下一個位置,同時在fat表索引區(qū)中遞增新的有效索引號,該有效索引號能夠索引到新的fat表;當fat表索引區(qū)寫滿,則分配新的塊給fat區(qū),并擦除當前fat區(qū)所在的塊,同時將新的fat區(qū)的起始地址更新至fst區(qū)中;
fst區(qū)存儲的fdt區(qū)的起始地址和fat區(qū)的起始地址隨著fdt區(qū)所在塊和fat區(qū)所在塊的轉(zhuǎn)移進行更新,該更新方式為遞增追加寫的方式;當fst區(qū)存儲的塊i追加滿后,觸發(fā)整個塊i的擦除及重寫。
所述fst區(qū)存儲的文件系統(tǒng)基本信息包括系統(tǒng)扇區(qū)、簇、塊信息,所述存儲區(qū)為ic卡的flash存儲器。
所述fdt表、fat表均在內(nèi)存中設置映射副本,當對文件的操作造成文件描述信息與文件分配信息的發(fā)生改變時,首先對內(nèi)存中的fdt表和fat表進行重新生成,生成完成后,將內(nèi)存中的fdt表和fat表分別寫入到存儲區(qū)中的fdt區(qū)和fat區(qū),將fdt區(qū)和fat區(qū)中的fdt表和fat表更新為當前有效的fdt表和fat表;
所述fdt表、fat表的映射副本分別設置臟標記,所述臟標記在內(nèi)存中的fdt表、fat表發(fā)生變化時,設置該標記為真,當將fdt表、fat表回寫入存儲區(qū)后,該臟標記被清除;
將內(nèi)存中的fdt表同步寫入存儲區(qū)的fdt區(qū)時:若fdt表的臟標記已清除并且當前內(nèi)存中的fdt表與存儲區(qū)fdt區(qū)中的當前有效fdt表內(nèi)容一致,則不進行同步寫入;當任一項不滿足時,均將內(nèi)存中的fdt表同步寫入fdt區(qū)中的fdt表,作為存儲區(qū)的當前有效fdt表,同時將內(nèi)存中的fdt表的臟標記清除;
將內(nèi)存中的fat表同步寫入存儲區(qū)的fat區(qū)時:若fat表的臟標記已清除并且當前內(nèi)存中的fat表與存儲區(qū)fat區(qū)中的當前有效fat表內(nèi)容一致,則不進行同步寫入;當任一項不滿足時,均將內(nèi)存中的fat表同步寫入fat區(qū)中的fat表,作為存儲區(qū)的當前有效fat表,同時將內(nèi)存中的fat表的臟標記清除。
所述向數(shù)據(jù)簇區(qū)中指定文件寫入數(shù)據(jù)時,首先在內(nèi)存中建立寫緩沖區(qū),當寫緩沖區(qū)寫滿之后,首先從fat表中檢索當前指定文件的尾簇,同時計算該尾簇所在簇的剩余空間,如果剩余空間不小于寫緩沖區(qū)的大小,則寫入長度為寫緩沖區(qū)大小的數(shù)據(jù);否則寫入尾簇剩余空間大小的數(shù)據(jù),同時繼續(xù)申請新簇寫入剩余數(shù)據(jù)。
所述fat表由多個2字節(jié)的簇狀態(tài)組成,所述簇狀態(tài)包括未分配、已分配、臟、結(jié)束4種狀態(tài)。
碎片整理方法:
對存儲區(qū)以塊為單位進行掃描,計算每個塊中的臟簇所占的比例,當該比例超出設定的整理閾值時,對文件系統(tǒng)進行碎片整理;所述臟簇為:對文件的刪除操作使該文件所占簇成為臟簇;
對文件系統(tǒng)進行碎片整理時,首先檢查fat表,檢索待整理塊中的有效簇,找到有效簇后,立即申請空閑簇,將有效簇內(nèi)容拷貝到新申請的空閑簇中;若該有效簇為文件尾簇,則僅拷貝簇內(nèi)有效長度,否則拷貝整簇內(nèi)容;
拷貝簇內(nèi)容的同時,生成新的fat表,同時在新的fat表中寫入新的簇鏈;當前簇轉(zhuǎn)移完成后整簇置臟;
重復以上操作,直到整個塊中全是臟簇,擦除整塊,并釋放對應fat表,完成一次碎片整理。
操作位置定位方法:
在內(nèi)存中創(chuàng)建快速查找表,針對存儲同一文件的多個簇,將一段連續(xù)簇稱為一個簇片段,將所有的簇片段集中映射到快速查找表中,由文件操作位置算出對應的連續(xù)簇序號,通過快速查找表獲得對應簇號;
快速查找的實現(xiàn)步驟為:
遍歷fat表;定義操作位置連續(xù)簇個數(shù)=讀位置/簇大小;遍歷快速查找表所有簇片段,連續(xù)簇個數(shù)每次都減去當前片段中的連續(xù)簇數(shù),直到連續(xù)簇個數(shù)小于當前片段中的連續(xù)簇數(shù),返回此片段的起始簇號與剩余連續(xù)簇個數(shù)的和即為操作位置對應簇號。
本發(fā)明的有益效果:本發(fā)明在存儲器的存儲區(qū)中分配四類區(qū)域,分別為文件系統(tǒng)信息數(shù)據(jù)簇區(qū)(fst)區(qū)、文件描述信息(fdt)區(qū)、文件分配信息(fat)區(qū)、數(shù)據(jù)簇區(qū)。fst區(qū)固定存儲在某個塊中,fdt區(qū)、fat區(qū)能夠隨著文件更新輪轉(zhuǎn)所在塊位置,fdt區(qū)、fat區(qū)轉(zhuǎn)移的同時追加更新fst中的對應區(qū)起始地址,從而實現(xiàn)了fdt區(qū)、fat區(qū)、數(shù)據(jù)簇區(qū)在整個存儲空間的均衡輪轉(zhuǎn)和擦寫平衡。
附圖說明
圖1是ic卡文件系統(tǒng)管理分區(qū)示意圖。
圖2是fdt區(qū)在fdt表變化時的內(nèi)存回寫示意圖。
圖3是ic卡文件系統(tǒng)初始化示意圖。
圖4是文件操作位置所在簇的快速定位示意圖。
具體實施方式
下面結(jié)合附圖1~4和具體實施方式對本發(fā)明作進一步詳細說明。
本發(fā)明提供一種文件系統(tǒng)的實現(xiàn)方法,尤其是適用于ic卡及其與ic卡類似的存儲器的文件系統(tǒng)實現(xiàn)方法,該方法通過以下方式實現(xiàn)。
首先在存儲器的存儲區(qū)中分配存儲在塊中的fst區(qū)、fdt區(qū)、fat區(qū)和數(shù)據(jù)簇區(qū);其中fst區(qū)表示文件系統(tǒng)信息區(qū),該區(qū)用于存儲文件系統(tǒng)基本信息,例如扇區(qū)、塊、簇等信息;fdt區(qū)表示文件描述信息區(qū),該區(qū)用于存儲描述文件的基本信息,文件的基本信息至少包括文件名稱、起始簇、大小、創(chuàng)建時間、文件的狀態(tài)等;fat區(qū)表示文件分配信息區(qū),用于存儲文件的分配信息,數(shù)據(jù)簇區(qū)存儲文件內(nèi)容。fst區(qū)固定存儲在塊i,fdt區(qū)和fat區(qū)存儲在不同塊,數(shù)據(jù)簇區(qū)存儲在其余塊;其中0≤i≤n-1,n表示存儲區(qū)中塊的數(shù)目,i表示存儲區(qū)的第i塊;fdt區(qū)、fat區(qū)隨著文件更新輪轉(zhuǎn)所在塊位置。
fst區(qū)同時存儲fdt區(qū)的起始地址和fat區(qū)的起始地址,且這些地址隨著fdt區(qū)和fat區(qū)所在塊的轉(zhuǎn)移更新,其地址更新可以采用遞增追加寫方式,從而使fst區(qū)中存在多組fdt區(qū)和fat區(qū)的起始地址,但僅有最新更新的一組是當前有效的,進而確保任何時候都能從fst區(qū)中索引到fdt區(qū)和fat區(qū)。
通過fst區(qū)的起始地址索引fdt區(qū)和fat區(qū),同時通過fdt表索引文件起始簇,通過fat表索引文件各簇的鏈接關(guān)系,通過各簇的連接關(guān)系能夠索引數(shù)據(jù)簇區(qū)存儲的整個文件內(nèi)容。
fdt區(qū)設置fdt表,fdt表中存儲文件的文件描述信息;當對文件的操作造成文件描述信息發(fā)生改變時,fdt區(qū)生成新的fdt表并進行存儲。
本發(fā)明優(yōu)先采用遞增追加寫方式進行fdt表的更新,此時,fdt區(qū)分為fdt表區(qū)和fdt表索引區(qū),fdt表存儲在fdt表區(qū),通過fdt表索引區(qū)能夠索引到fdt表;fdt表區(qū)存儲多個fdt表,且任意時刻僅有一個fdt表是有效的,該有效的表通常為最新更新的表。作為一種實施方式,fdt表中可以存儲最多256個文件的描述信息,該描述信息包括文件的狀態(tài)、起始簇、名稱、大小、創(chuàng)建時間等信息。文件的讀寫、增刪、重命名等操作通常會造成上述信息的變化,從而需要及時更新fdt表。
更新fdt表時,需要首先重新生成新的fdt表,并遞增追加到fdt表區(qū)的上一個fdt表的下一個位置,同時在fdt表索引區(qū)中遞增新的有效索引號,該有效索引號能夠索引到新的fdt表;當fdt表索引區(qū)寫滿,表示fdt區(qū)所在的塊已經(jīng)寫滿,此時分配新的塊給fdt區(qū),并擦除當前fdt區(qū)所在的塊,同時將新的fdt區(qū)的起始地址更新至fst區(qū)中。
fat區(qū)設置fat表,fat表中存儲文件在數(shù)據(jù)簇區(qū)的簇分配情況和簇連接關(guān)系;當對文件的操作造成文件分配信息的發(fā)生改變時,fat區(qū)生成新的fat表并進行存儲。
當采用遞增追加寫方式進行fat表的更新時,fat區(qū)分為fat表區(qū)和fat表索引區(qū),fat表存儲在fat表區(qū),通過fat表索引區(qū)能夠索引到fat表。fat表區(qū)存儲多個fat表,且任意時刻僅有一個fat表是有效的,該有效的表通常為最新更新的表。fat表用來表征所有文件在整個數(shù)據(jù)簇區(qū)的簇分配情況和簇鏈接關(guān)系,其由多個2字節(jié)的簇狀態(tài)組成,簇狀態(tài)包括未分配、已分配、臟、結(jié)束4種狀態(tài),結(jié)束狀態(tài)表示當前簇是文件結(jié)束簇。文件的讀寫、增刪及碎片整理等操作通常會造成文件簇的新分配、置臟等狀態(tài)變化,從而需要及時更新fat表。
更新fat表時,首先重新生成新的fat表,并遞增追加到fat表區(qū)的上一個fat表的下一個位置,同時在fat表索引區(qū)中遞增新的有效索引號,該有效索引號能夠索引到新的fat表;當fat表索引區(qū)寫滿,表示fat區(qū)所在的塊已經(jīng)寫滿,則分配新的塊給fat區(qū),并擦除當前fat區(qū)所在的塊,同時將新的fat區(qū)的起始地址更新至fst區(qū)中。
在上述過程中,fst區(qū)存儲的fdt區(qū)的起始地址和fat區(qū)的起始地址隨著fdt區(qū)所在塊和fat區(qū)所在塊的轉(zhuǎn)移進行更新,該更新方式也地址遞增追加寫的方式,即在fst區(qū)存儲的上一個fdt區(qū)的起始地址和上一個fat區(qū)的起始地址的下一個位置增加新的起始地址,該起始地址能夠索引到當前有效的fdt區(qū)和fat區(qū);當fst區(qū)存儲的塊i追加滿后,由于fst區(qū)固定存儲在某一塊中,因此,不再進行輪轉(zhuǎn)更新所在快的位置,而是直接觸發(fā)整個塊i的擦除及在塊i中的重寫?;谇笆?,實現(xiàn)了fdt區(qū)、fat區(qū)、數(shù)據(jù)簇區(qū)在整個存儲空間的均衡輪轉(zhuǎn)和擦寫平衡。
由于每個對文件的操作均需要更新fat表和/或fdt表,因此為了避免存儲區(qū)中的fdt表和fat表的頻繁改寫,造成存儲區(qū)中某些塊的讀寫壽命縮短。本發(fā)明將存儲區(qū)中的fdt表、fat表均在內(nèi)存中設置格式完全相同的映射副本,當對文件的操作造成文件描述信息與文件分配信息的發(fā)生改變時,首先對內(nèi)存中的fdt表和fat表進行重新生成,生成完成后,將內(nèi)存中的fdt表和fat表分別寫入到存儲區(qū)中的fdt區(qū)和fat區(qū),將fdt區(qū)和fat區(qū)中的fdt表和fat表更新為當前有效的fdt表和fat表。
fdt表、fat表的映射副本中需要分別設置臟標記,該臟標記在內(nèi)存中的fdt表、fat表發(fā)生變化時,設置該標記為真,當將fdt表、fat表回寫入存儲區(qū)后,該臟標記被清除。
將內(nèi)存中的fdt表同步寫入存儲區(qū)的fdt區(qū)時:若fdt表的臟標記已清除并且當前內(nèi)存中的fdt表與存儲區(qū)fdt區(qū)中的當前有效fdt表內(nèi)容一致,則不進行同步寫入;當上述任一項不滿足時,均將內(nèi)存中的fdt表同步寫入fdt區(qū)中的fdt表,作為存儲區(qū)的當前有效fdt表,同時將內(nèi)存中的fdt表的臟標記清除。
將內(nèi)存中的fat表同步寫入存儲區(qū)的fat區(qū)時:若fat表的臟標記已清除并且當前內(nèi)存中的fat表與存儲區(qū)fat區(qū)中的當前有效fat表內(nèi)容一致,則不進行同步寫入;當任一項不滿足時,均將內(nèi)存中的fat表同步寫入fat區(qū)中的fat表,作為存儲區(qū)的當前有效fat表,同時將內(nèi)存中的fat表的臟標記清除。
向文件系統(tǒng)數(shù)據(jù)簇區(qū)中指定文件寫入數(shù)據(jù)時,為了避免過度頻繁寫入,同時限于當前flash存儲器的最小寫入單元,本發(fā)明采取了預先寫入緩沖區(qū)的方式。首先在內(nèi)存中建立寫緩沖區(qū),當寫緩沖區(qū)寫滿之后,首先從fat表中檢索當前指定文件的尾簇,同時計算該尾簇所在簇的剩余空間,如果剩余空間不小于寫緩沖區(qū)的大小,則寫入長度為寫緩沖區(qū)大小的數(shù)據(jù);否則寫入尾簇剩余空間大小的數(shù)據(jù),同時繼續(xù)申請新簇寫入剩余數(shù)據(jù)。
從文件系統(tǒng)中讀取指定文件時,首先需要在fdt區(qū)中找到文件的首簇內(nèi)容,然后根據(jù)傳入的讀取偏移沿著fat表中的簇鏈檢索讀取起始位置所在簇,然后讀取此簇從簇內(nèi)偏移到簇尾的數(shù)據(jù),比較讀取長度若仍不夠時,則繼續(xù)跨簇讀取簇鏈上其他簇的數(shù)據(jù)直至讀夠所需長度。
由于對文件進行刪除操作導致該文件所占簇成為臟簇,因此文件系統(tǒng)需要提供碎片整理功能,以重新整理文件,盡量將文件存儲在連續(xù)的簇塊,同時釋放臟簇空間。
進行碎片整理時,首先對存儲區(qū)以塊為單位進行掃描,計算每個塊中的臟簇所占的比例,當該比例超出設定的整理閾值時,進行碎片整理。整理時,首先檢查fat表,檢索待整理塊中的有效簇,找到有效簇后,立即在非待整理的塊中申請空閑簇,將有效簇內(nèi)容拷貝到新申請的空閑簇中;若該有效簇為文件尾簇,則僅拷貝有效簇內(nèi)的有效長度,否則拷貝整簇內(nèi)容;拷貝簇內(nèi)容的同時,生成新的fat表,同時在新的fat表中寫入新的簇鏈;當前簇轉(zhuǎn)移完成后整簇置臟;重復以上操作,直到整個塊中全是臟簇,擦除整塊,并釋放對應fat表,完成一次碎片整理。待整理塊指的是臟簇所占的比例超出設定的整理閾值的塊。
如圖4所示,文件的鏈式分散存儲造成了文件操作位置定位時需要遍歷簇鏈,而很多時候,同一文件的一些簇是相鄰的,將一段連續(xù)簇稱為一個簇片段,此時在內(nèi)存中設置一個快速查找表,將同一文件的所有簇片段集中映射到一個快速查找表中,由文件操作位置算出對應的連續(xù)簇序號,通過快速查找表即可獲得對應簇號??焖俨檎也襟E:遍歷fat,創(chuàng)建快速查找表;操作位置連續(xù)簇個數(shù)=讀位置/簇大??;遍歷快速查找表所有片段,連續(xù)簇個數(shù)每次都減去當前片段中的連續(xù)簇數(shù),直到連續(xù)簇個數(shù)小于當前片段中的連續(xù)簇數(shù),返回此片段的起始簇號與剩余連續(xù)簇個數(shù)的和即為操作位置對應簇號。
如圖1~3所示的,是將塊0作為fst的固定存儲塊,對使用flash的ic卡使用文件系統(tǒng)的方法。
在ic卡的flash存儲器中使用文件系統(tǒng)之前,需要對文件系統(tǒng)進行新建即格式化。文件系統(tǒng)的格式化包括硬格式化和軟格式化兩個步驟,首先是對ic芯片進行硬格式化,使得所有字節(jié)置0xff,隨后按照文件系統(tǒng)設計格式需要進行軟格式化。
文件系統(tǒng)的軟格式化包括:
如圖1、3所示,按照flash存儲器塊、簇、扇區(qū)信息填充相應文件系統(tǒng)整體信息,賦給fst區(qū)的對應信息,隨后,將塊1地址賦給fst區(qū)的fdt區(qū)起始地址信息,將塊2地址賦給fst區(qū)的fat區(qū)起始地址信息,并將fst區(qū)寫入塊0。至此,完成fst區(qū)的初始化。
根據(jù)fst區(qū)中的fdt區(qū)起始地址信息,索引到fdt表,將其表內(nèi)容全部置0xff并將索引字節(jié)置為0x55550000,至此,完成fdt的初始化。
據(jù)上所述,系統(tǒng)fst占用塊0,fdt占用塊1,同時,設計fat占用塊2。故而,fat表的前3塊fat字節(jié)分別置為特殊值0xfff1、0xfff2、0xfff3,以表征其被特殊占用,其余fat表的字節(jié)置全0,以表征其為尚未分配的簇。隨后,將索引字節(jié)置為0xaaaa0000,至此,完成fat的初始化。
文件系統(tǒng)操作之前需要進行掛載。文件系統(tǒng)的掛載過程中,需要將當前有效的fdt表、fat表從flash搬移到內(nèi)存中以便適應可能的頻繁修改,同時,為確保內(nèi)存與flash內(nèi)容的一致性,設計各自表的臟標記,內(nèi)存中fdt、fat表的變化會導致臟標記為真,而向flash的回寫會清除臟標記。
文件寫入操作會導致文件長度的變化、簇鏈的變化等,往往需要更新fdt表、fat表。由于fdt表、fat表都已在內(nèi)存中有映射副本,則相應更新操作在直接在內(nèi)存進行,內(nèi)存fdt表、fat表變化之后,通過兩種機制回寫入flash以進行同步,一種是固定的、關(guān)鍵性的操作節(jié)點,比如寫入數(shù)據(jù)前要強制回寫fat以防止數(shù)據(jù)寫入失敗后fat不同步,另一種是某些操作,例如文件關(guān)閉操作。
向flash中同步寫fdt表:查看臟標記已清除,以及比較內(nèi)存fdt表內(nèi)容與讀取flash當前有效fdt表內(nèi)容是否一致,若同時滿足則不必進行同步寫入。否則,將fdt區(qū)的有效表索引號加1,在索引區(qū)順序遞增寫最新索引號,同時,順序地址寫更新表區(qū),將當前內(nèi)存fdt表內(nèi)容拷貝到flash中的最新索引指向位置,并清臟標記。在遞增寫索引號時,若當前索引區(qū)已經(jīng)寫滿,則表征當前fdt區(qū)所在塊已寫滿,需要搬移,即分配新塊給fdt區(qū),同時要更新fdt區(qū)在fst中的起始地址信息,以及由于新塊分配造成的fat表變化,隨后將原有塊擦除。
向flash中同步寫fat表:查看臟標記已清除,以及比較內(nèi)存fat表內(nèi)容與讀取flash當前有效fat表內(nèi)容是否一致,若同時滿足則不必進行同步寫入。否則,將fat管理區(qū)的有效表索引號加1,在索引區(qū)順序遞增寫最新索引號,同時,順序地址寫更新表區(qū),將當前內(nèi)存fat表內(nèi)容拷貝到flash中的最新索引指向位置,并清臟標記。在遞增寫索引號時,若當前索引區(qū)已經(jīng)寫滿,則表征當前fat管理區(qū)所在塊已寫滿,需要搬移,即分配新塊給fat管理區(qū),同時要更新fat管理區(qū)在fst中的起始地址信息,以及由于新塊分配造成的fat表變化,隨后將原有塊擦除。
以上所述的僅是本發(fā)明的優(yōu)選實施方式,應當指出,對于本領(lǐng)域的技術(shù)人員來說,在不脫離本發(fā)明整體構(gòu)思前提下,還可以作出若干改變和改進,這些也應該視為本發(fā)明的保護范圍。