嵌入式系統(tǒng)中基于閃存平臺的存儲管理策略
本文開發(fā)的FFS存儲結(jié)構(gòu)類似于MS-DOS的FAT,是FAT系統(tǒng)的修改。圖2顯示了一系列模式的基本存儲結(jié)構(gòu)。本文引用地址:http://m.butianyuan.cn/article/151786.htm
系統(tǒng)記錄區(qū)(SRA)存儲介質(zhì)信息和最重要的文件系統(tǒng)信息,如閃存類型、容量、扇區(qū)數(shù)和扇區(qū)利用現(xiàn)狀。這個扇區(qū)的利用狀況包括文件數(shù)、未使用的扇區(qū)數(shù)、損壞扇區(qū)數(shù)、第一個和最后一個未使用的扇區(qū)編號。圖3顯示了在SRA上的內(nèi)存分配。文件信息區(qū)域(FIA)用于存儲文件的詳細信息,如文件名、文件類型、文件大小、文件屬性和閃存鏈表項。程序數(shù)據(jù)區(qū)(PDA)用于存儲程序數(shù)據(jù)。在圖2陰影部分是每個區(qū)域損壞的扇區(qū)。如果損壞的扇區(qū)數(shù)達到給定界限值,警報將自動啟動。圖3為SRA上的內(nèi)存分配情況,不同部分存儲特定的記錄信息:1為閃存內(nèi)存類型;2為閃存內(nèi)存容量;3為扇區(qū)數(shù);4為文件數(shù);5為未使用扇區(qū)數(shù);6為損壞的扇區(qū)數(shù);7為最后一次寫入FIA的扇區(qū)組數(shù);8為第一個未使用扇區(qū)號;9為最后未使用扇區(qū)號;10為系統(tǒng)記錄控制的關(guān)鍵字;11為下一個要寫入的扇區(qū)號。
不同的系統(tǒng)有不同的存儲空間管理模式,最簡單的可能是一個命令模式,但它并不適用于某些特殊應(yīng)用。例如,在計算機數(shù)控系統(tǒng)中使用命令模式,用戶不方便編輯、修改或者刪除由各種機器處理指令組成的G代碼程序。另一個常用的方式是靜態(tài)存儲模式,這意味著每一個文件分配固定的扇區(qū)數(shù)。在這種情況下,如果文件大小超過了給定的空間,雖然仍有未使用的扇區(qū),但寫操作卻不能成功完成。同樣,小文件顯然將導(dǎo)致存儲空間浪費。此外,由于過度頻繁地訪問同一個文件,與其他的扇區(qū)相比這樣的扇區(qū)更易于損壞。因此,靜態(tài)存儲模式不是一個很好的選擇。
為了克服這些問題,提出了一個動態(tài)存儲空間管理模式,采用平均擦除和寫入策略。先入先出(FIFO)的引入,保證了閃存存儲扇區(qū)的平均使用。當系統(tǒng)第一次加電,未使用的扇區(qū)都初始化為一個雙鏈表。此后,這些扇區(qū)應(yīng)該從鏈表頭節(jié)點轉(zhuǎn)到尾節(jié)點。這樣,在訪問每個扇區(qū)的頻率將趨于平等,每個扇區(qū)將不會過度頻繁讀取/寫入。假設(shè)鏈表有N個節(jié)點,每個扇區(qū)訪問的概率只有1/N,因此,閃存的使用壽命可以明顯延長。
相對而言,基于MS-DOS的FAT系統(tǒng)只為數(shù)據(jù)區(qū)提供損害管理,卻忽視了文件系統(tǒng)結(jié)構(gòu)區(qū)域。相對地,SRA作為FFS結(jié)構(gòu)區(qū)域,由于存儲了系統(tǒng)關(guān)鍵信息而成為最重要的區(qū)域。而且,由于頻繁訪問, SRA往往更易損壞。因此,這一區(qū)域應(yīng)當運用一種安全策略。根據(jù)在SRA、FIA和PDA存放的數(shù)據(jù)的重要性不同,不同存儲區(qū)域應(yīng)當分配不同的可靠性要求。因此,可以充分利用閃存存儲能力,寫校驗時間將會減少,從而寫速度將有所改善。
2.2 SRA的平均擦除和寫入管理
為了實現(xiàn)對System record area(SRA)平均擦除和寫管理,避免由系統(tǒng)記錄扇區(qū)物理損傷而導(dǎo)致整體系統(tǒng)的故障,SRA被平均劃分成3個小組。3組依次進行寫操作,可以為系統(tǒng)記錄存儲安全提供一個冗余策略,從而提高系統(tǒng)的可靠性,延長系統(tǒng)壽命。這對于每次在系統(tǒng)通電之后獲取SRA代碼值是必要的。由系統(tǒng)記錄關(guān)鍵字(SysKeyword)控制的值,標記著系統(tǒng)關(guān)閉前最后一次寫操作的系統(tǒng)扇區(qū)的執(zhí)行記錄,它顯示為:
在系統(tǒng)初始化時,SRA中每組的相應(yīng)系統(tǒng)變量關(guān)鍵字(1~3)初始化為0。在后續(xù)操作中,各組關(guān)鍵字(SysKeyword)的真實值應(yīng)該更新,在系統(tǒng)每次啟動時分別從SRA讀出。因此,SysCodeValue的值可根據(jù)式(1)得到。執(zhí)行最后一次寫操作的組號可以通過調(diào)用函數(shù)GetLastGroup-Num()獲得。一旦SRA的記錄數(shù)據(jù)被更改,系統(tǒng)關(guān)鍵字應(yīng)該相應(yīng)更新。然后包括SysKeyword的記錄數(shù)據(jù),應(yīng)寫入到根據(jù)以下方法獲得的相應(yīng)扇區(qū)。
下一次將被寫入的該系統(tǒng)記錄扇區(qū)的組號與轉(zhuǎn)移的參量LastGroupNum可以通過調(diào)用函數(shù)GetNextGroupNum(Uchar LastGroupNum)共同獲得。SysCodeValue的值將更新如下:
SysCodeValue=SysCodeValue∧2NextGroupNum-1 (2)
評論