YAFFS文件系統在嵌入式Linux系統中的構建與改進
(2)當YAFFS系統進行寫操作且NandFlash中未分配空間小于預設的閾值時,啟動垃圾回收機制,選取最臟塊擦除。YAFFS文件系統的垃圾回收策略結合了隨機策略的平衡性和貪心策略的高效性,回收機制包括:回收不再使用的臟塊以及對存有有效數據的壞塊進行處理。但回收算法具有隨機性,系統有可能總是選中同一個塊,認定它是最臟的塊,并連續地擦除回收,造成惡性的使用,而NandFlash的擦除次數是有限的(大約在10次左右)。出現惡性的使用會造成閃存中的部分塊損壞,而其他塊使用次數卻極少,縮短了閃存的壽命。
(3)針對YAFFS的磨損平衡性差的情況,采用了擦除計數機制[7]:在yaffs.guts.h中定義了存儲在NandFlash的附加區中的數據結構yaffs_tags,用來標志每頁的狀態;定義了chunkID、objectID和有效字數等。其中有2 bit的空間是沒有使用的,并從chunkID和objectID分配7 bit,將這9 bit的空間定義為erase_count,用于記錄該頁被擦除的次數。初始值為零,當被擦除時標記為“1”,表示擦除過一次可達到的最大計數值為511。系統垃圾回收的流程圖如圖6所示。當某一塊的擦除次數達到511時,該塊與被擦除數最小的塊交換各自存儲的數據,使頻繁擦寫的塊存儲很少使用的數據,而被擦除次數少的塊存儲頻繁地更新數據[8](如文件屬性信息數據)。當擦除計數達到最大的塊超過70%以上時,將所有的擦除計數值歸零,循環以上的操作,從而實現NandFlash的損耗基本平衡、延長使用壽命、提高文件系統可靠性。
4 性能測試
按照以上介紹的策略修改YAFFS文件系統相關部分的源代碼,并且根據YAFFS根文件系統構建的基本步驟,將改進后的文件系統作為根文件系統燒寫入目標板。在實驗平臺上,分別對YAFFS和改進后的文件系統進行性能測試和研究。性能測試的主要內容有:各塊的擦除次數和文件系統掛載的時間。在實驗平臺上大量地進行讀寫和刪除操作,在源代碼中也添加擦除計數(只用于計數),兩個文件系統經過相同數量的讀寫和刪除操作后,讀取每塊的擦除次數,分析數據得出:原YAFFS中存在擦除次數為零的塊,而改進后則沒有;原YAFFS的最大擦除次數與最小擦除次數的比值是無窮大,而改進后都在平均值附近波動,起伏不大。文件系統加載測試的主要方法是在內核源碼和文件系統源碼中添加中斷機制和時鐘,安裝評估系統時間的工具PrintkTimes補丁,運用printk輸出所需數據。測試結果如表1所示。由表1可看出,由于第一次啟動時文件屬性信息還未寫入索引區,系統啟動時間與改進前大致相同,但第二次啟動時索引區機制開始工作,直接從索引塊中讀取文件信息,修改后的YAFFS啟動時間已有明顯的改善,表明改進策略達到縮短加載時間的目的。


在以NandFlash為介質的嵌入式Linux平臺上構建了YAFFS文件系統,并在原有YAFFS文件系統的基礎上,對YAFFS的啟動時間和損耗平衡進行優化。通過測試證明,啟動時間相比原文件系統縮短了一半以上,且實現了NandFlash的摩擦損耗基本保持平衡,優于改進前的文件系統。
linux相關文章:linux教程
評論