摘要:分析了在嵌入式系統中采用的flash存儲器的使用特點,并論述了如何對NAND FLASH進行有效全面管理的解決方案,包括如何設計文件系統,進行壞塊管理等,如何垃圾回收及均衡各個NAND FALSH塊的使用問題也進行了較詳細論述。
關鍵詞:大容量存儲設備;NAND;文件系統;壞塊管理;均衡
中圖分類號:TP334.5文獻標識碼:A文章編號:1009-3044(2008)30-0733-02
Applications Reserch of Mass Storage Based on Embbed System
LIU Hui-zhong
(Hebei Institute of Applied Mathematics, Shijiazhuang 050081, China)
Abstract: What is the advantages of NOR/NAND Flash memory based on embedded sytem is discussed, the solution of how to use NAND Flash memory comprehensive is descripted , it combines flash file system,bad block management etc. ,put forward the method to deal with dirty block,wearleveling.
Key words: mass storage; NAND; file system; bad block management; wearleveling
1 引言
隨著嵌入式系統越來越廣泛的應用,嵌入式系統中有大量的數據需要存儲和管理。Flash存儲器具有容量大、體積小、功耗小、成本低、掉電后數據不丟失、讀訪問速度高、抗震性好等一系列的優點,已經成為嵌入式系統中廣泛應用的存儲器件。但是隨著系統復雜性的增加和存儲器容量的加大,如何高效地存儲和管理數據從而方便用戶使用成為一個重要的課題。
目前閃存有多種技術架構,其中以NOR技術和NAND技術為主流技術。NOR型閃存是隨機存取的設備,適用于代碼存儲;NAND型閃存是線性存取的設備,適用于大容量數據存儲,因此,設計能有效管理大容量NAND閃存的嵌入式閃存文件系統是解決辦法。
2 Flash存儲器特點
2.1 FLASH共同特點
FLASH是一種非易失性存儲器NVM(Non-Volatile Memory),具有如下共同特點:
(1)區塊結構
FLASH在物理結構上分成若干個區塊,區塊之間相互獨立。比如NOR FLASH把整個Memory分成若干個Sector,而NAND FLASH把整個Memory分成若干個Block。
(2)先擦后寫
由于FLASH的寫操作只能將數據位從1寫成0,不能從0寫成1,所以在對存儲器進行寫入之前必須先執行擦操作,將預寫入的數據位初始化為1。擦操作的最小單位是一個區塊,而不是單個字節。
(3)操作指令
除了NOR FLASH的讀,FLASH的其它操作不能像RAM那樣,直接對目標地址進行總線操作。比如執行一次寫操作,它必須輸入一串特殊的指令(NOR FLASH),或者完成一段時序(NAND FLASH)才能將數據寫入到FLASH中。
(4)位反轉
由于FLASH固有的電器特性,在讀寫數據過程中,偶然會產生一位或幾位數據錯誤,這就是位反轉。位反轉無法避免,只能通過其他手段對結果進行事后處理。
(5)壞塊
FLASH在使用過程中,可能導致某些區塊的損壞。區塊一旦損壞,將無法進行修復。如果對已損壞的區塊進行操作,可能會帶來不可預測的錯誤。尤其是NAND FLASH在出廠時就可能存在這樣的壞塊(已經被標識出)。
2.2 NAND 閃存特點
NAND閃存陣列分為一系列128kB的區塊(block),這些區塊是NAND器件中最小的可擦除實體。擦除一個區塊就是把所有的位(bit)設置為“1”(所有字節(byte)設置為FFh)。寫操作就是通過編程,將已擦除的位從“1”變為“0”。最小的編程實體是字節(byte)。NAND不能同時執行讀寫操作,它可以采用稱為“映射(shadowing)”的方法,在系統級實現這一點。NAND的效率較高,是因為NAND串中沒有金屬觸點。NAND與硬盤驅動器類似,基于扇區(頁),適合于存儲連續的數據,如圖片、音頻或個人電腦數據。雖然通過把數據映射到RAM上,能在系統級實現隨機存取,但是,這樣做需要額外的RAM存儲空間。此外,跟硬盤一樣,NAND器件存在壞的扇區,需要糾錯碼(ECC)來維持數據的完整性。
3 Flash文件系統的設計
對于一個嵌入式系統,設備的兼容性越好,系統可行性就越好,產品也就越有競爭力。所以,為了兼容不同類型的FLASH設備,對FLASH進行通用設計至關重要。NAND FLASH可以根據相同的指令讀取芯片的廠商號和設備號,從而通過識別設備號調用對應的時序流程實現操作。但是,系統中太多的判斷,會使得程序的結構變得非常復雜。所以,在一定的條件下,NAND FLASH設備還是不兼容的。
為了解決這一問題,一個較好的方法是將FLASH的各個操作指令以及結構特性按照統一的格式存放到FLASH中固定位置。系統初始化時,將這個結構讀入系統,通過分析這個結構,可以獲得關于芯片所有相關信息,包括操作指令,區塊分布等等。這樣,系統可以輕松實現對不同型號FLASH的所有操作,極大地提高了設備的擴展性。
3.1 Flash文件系統的存儲結構
本Flash文件系統將整個存儲空間分成兩個部分:文件分配表和數據區域。
(1)文件分配表(FAT,File Allocation Table)。主要反映了Flash存儲器的扇區的使用情況,記錄了各個扇區的狀態,該扇區當前存放的文件的類型以及該扇區已經進行扇區擦除的次數。每個扇區的使用情況都在文件分配表中存有一項,每個表項占8個字節,數據結構如下所示:
structFAT_item{
char sector_state;/*扇區狀態*/
unsigned short file_type;/*該扇區中存放的文件類型*/
long erase_time;/*該扇區已經進行擦除的次數*/
char reserved;/*保留*/
}
其中扇區有5種狀態分別為:
0xff——空閑扇區;
0xfe——扇區已被占用;
0xfc——扇區的數據為過時數據;
0xf8——臟扇區,可以進行整片的扇區擦除;
0xf0——壞扇區;
(2)數據區域(Data Area)。除了文件分配表以外的扇區都稱為數據區域。該區域采用線性Flash文件系統的設計思想,文件分為文件頭和文件數據區兩部分。文件頭的數據結構如下:
struct file_header{
char name[NAMESIZE];/*文件名*/
long size;/*文件大小*/
struct file_header *next;/*指向下一個文件頭的指針*/
char file_state;/*文件狀態*/
}
文件頭中用一個變量file_state來表示該文件當前的狀態,只用了它的低4位來表示文件的5種狀態,主要用于掉電數據恢復和垃圾回收。這在下面將有詳細講述。此外,本Flash文件系統分配給每個文件塊的空間(即塊大?。?K,故一個扇區中最多可存儲32個文件。用單向鏈表來鏈接文件,若next域為0xff,說明這是分配給該文件的最后一個文件塊。
3.2 壞快管理
閃存芯片在使用過程中會出現壞塊。壞塊是指一個塊中存在一個或多個無效位,其可靠性不能得到保證,必須加以標識和旁路(當然無效塊不會影響到其它塊的有效性)。為了對壞塊實現管理,可以建立一張壞塊到冗余區有效塊的映射表。映射原理如下: 開始是一張初始壞塊映射表,建立數據結構對整個存儲區進行編號,并根據這個編號對映射表進行排序。進行寫操作時,按照上述的映射結構將寫地址與映射表進行比較,比較到塊級即可。如果是壞塊,將待寫入的數據寫到被映射到的塊;如果不是,則直接寫入該塊。如果在寫某塊的某頁時出現編程錯誤,則將該塊添加進壞塊映射表(當編程出錯時就表明出錯頁對應的塊無效),同時從該出錯頁開始,將該塊后面的頁數據都寫入到對應的映射塊。這樣,在數據讀出時,可將讀地址與映射表比較,并且需要比較到頁級以確定每一頁的確切存放位置。如果該頁編程正確,則直接讀出;如果錯誤,則到被映射的塊的對應頁讀數據,并且該頁之后的頁也從被映射塊中讀數據。對壞塊進行讀操作是允許的,即對于編程出錯頁前面的那些編程正確的頁是可以正確讀出的,而對壞塊進行編程和擦除的操作是不推薦的,因為有時這些操作會使鄰近的塊也失效,所以讀操作要查找到每一頁的對應存放位置,而寫操作只要查找到塊就行,查找時采用二分查找算法。擦除完后,將擦除出錯的塊也添加進無效塊映射表。無效塊映射表需要不斷維護和更新
3.3 垃圾回收
由于Flash的底層技術不支持Flash的任意空間被刪除,而必須是以扇區為單位刪除,所以在刪除一個文件的時候,僅僅是在文件頭的標識里作一個刪除標識,而該文件依然保留在Flash空間中并標識它為臟數據DIRTY。這樣導致系統在運行一段時間后,Flash中累積著大量的臟數據,這就有必要對這些臟空間進行回收,來有效利用Flash的存儲空間。
本Flash文件系統中解決的辦法是在系統中創建一個任務recycle_task專門進行垃圾回收,該任務實時地檢查空閑隊列。若空閑隊列中的扇區數小于6時便進行垃圾回收,清除臟數據。在進行垃圾回收時,從待擦寫隊列中(包括臟塊隊列和干凈塊隊列)取出一個扇區,將FAT中的該扇區的狀態修改為過時的OBSOLETE,并將該扇區的擦除次數加1,然后在空閑塊隊列中申請一個空閑扇區,將回收扇區中的有效數據寫到新申請的扇區中,修改FAT中新申請的扇區的狀態,最后擦寫回收扇區,并將其鏈接到空閑塊隊列中。
3.4 均衡磨損(wear_leveling)
均衡磨損的主旨是隨機地將“干凈”(無需擦寫)的塊的內容移至另一個空閑塊后擦寫該扇區,然后將其鏈接到空閑塊隊列中,等待寫入新的數據。這實際上是日志文件系統的核心設計思想。
NAND塊擦寫次數限制為10萬次,日志文件系統不覆寫數據一定程度上保證了損耗平衡的同時,產生了無效頁,當空間不足要回收無效頁的空間,將無效頁所在塊的有效頁拷貝到空閑空間,擦除此塊?;厥账惴ㄒWC擦寫分攤到各個塊上,延長使用壽命,并盡可能少地拷貝,避免影響I/O效率。本文件系統的損耗平衡由塊分配策略和回收算法來保證。需要空間時從blockInfo數組中線性查找空白塊,并記下地址finder,下次從finder開始新的查找,若finder為最大塊,則回滾到第1塊,故在數據頻繁更新的情況下,如存儲在塊1的數據更新則寫到遞增的塊2, 3, 4,而當2, 3, 4塊是垃圾數據已被回收擦寫,系統再分配的是5, 6塊,避免2, 3, 4塊再次使用而再被擦寫,相當于有一段緩沖時間。加載時發現部分使用的塊則記為finder。采用這種思想設計,能掃描到全部塊,損耗平衡也就解決的更好。
4 結束語
本文所設計的Flash文件系統能較好解決NAND Flash存儲器的管理問題。此解決方案較好地設計實現Flash文件系統,基本滿足了管理閃存的通用行性設計、壞快管理、垃圾回收機制、均衡磨損機制等。對于要求更大容量的嵌入式系統,可采用把幾塊NAND Flash芯片級聯來實現,這樣就可成倍增加系統的容量,這是接下來重點研究的問題。
參考文獻:
[1] 陳銳. 基于閃存技術的存儲模塊設計[D]. 浙江大學, 2006.
[2] 張長宏. 基于μCOS-Ⅱ的Flash文件系統的研究和實現[D]. 西安電子科技大學,2008.
[3] 陳文華, 郭培源, 陳巖. S3C44B0X嵌入式系統中Flash文件系統的設計與實現[J]. 北京工商大學學報(自然科學版),2006,(3).
[4] 陳逸非. 面向大容量Flash的高效Linux文件系統改進和實現 [D].同濟大學,2007.
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文