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