吳燦強,芮曄,潘東梅
(上海航天電子技術研究所上海201100)
如今我國航天技術不斷提高,衛星應用需求也隨之擴大,其存儲的載荷數據種類、數據量逐漸增加,數據存儲管理難度日益加大[1]。雖然星載數據存儲器經傳統的基于FPGA的方式設計后將讀寫方式由最初以字節為單位線性編址的流讀寫方式發展為基于文件分配表的文件讀寫方式[2],但是為了解決Flash存儲器應用存在的不覆蓋寫、磨損均衡問題并實現文件系統的完整功能,使用嵌入式文件系統管理星載數據存儲器在未來星載數據存儲技術的發展上顯得尤為必要。
目前常用的嵌入式文件系統主要有兩種:一種是JFFS/JFFS2文件系統[3-4],其專門針對NOR FLASH存儲介質設計,因此用于NAND FLASH存儲介質上效果不佳;另外一種則是YAFFS/YAFFS2文件系統[5-6],其專門針對NAND FLASH存儲介質的特性設計,具有崩潰恢復、壞塊管理、損耗均衡、垃圾回收及錯誤探測/錯誤更正(EDC/ECC)的FLASH文件系統必須具備的功能。同時YAFFS/YAFFS2文件系統比JFFS/JFFS2文件系統加載和執行速度更快且占用內存更少[7-8]。此外,YAFFS/YAFFS2文件系統自帶NAND FLASH存儲芯片驅動程序[9],為嵌入式系統提供了直接訪問文件系統的API,支持多種CPU架構,因此YAFFS/YAFFS2文件系統更便于在嵌入式系統中移植開發。
但YAFFS版本只支持512 B的小頁NAND FLASH存儲芯片[10]。而YAFFS2版本在YAFFS版本的基礎上進行升級,不僅能向下兼容小頁NAND FLASH,而且能更好地支持2 KB以上的大頁NAND FLASH,同時在性能上也有很大提高[11]。綜上,本文選用了YAFFS2文件系統作為研究基礎。
在星載環境中,載荷數據種類多且數據量多,同時對于數據的查找方式一般既要區分載荷又得區分時間段等多重信息。通過對YAFFS2文件系統的深入研究和分析,本文發現如果將YAFFS2文件系統直接應用于星載環境下,會因為YAFFS2文件系統的類日志型結構而帶來對多載荷/多任務數據管理難和數據存儲效率較低等問題。
目前,針對Flash文件系統的研究途徑主要有兩個方向:一是對現有的Flash文件系統進行優化設計[12-13],例如JFFS3文件系統的設計方案的提出則是為了迎合閃存容量不斷增加的發展趨勢,利用B+樹算法將原來在內存中的索引信息存儲到閃存上,即在閃存上存儲和維護索引[14];二是開發新的適用于Flash的文件系統[15-16]。
考慮到新研發文件系統研制周期長、可靠性以及功能完整性需要一定時間驗證等缺點,本文基于第一種研究途徑,針對YAFFS2文件系統在設計性能上的不足和在特定應用環境下的需求問題,對其進行部分優化設計,引入分區管理功能,使其在多任務環境下對復雜的大數據檢索效率得到一定提高。
文件系統實現對數據存儲與檢索的有效管理主要是依賴于其內部數據結構和數據流關系的巧妙設計。在YAFFS2文件系統中的主要數據結構設計如下:
1)文件。在YAFFS2文件系統中,無論是正常文件、目錄,還是鏈接或設備文件等一切可記錄或可被描述的內容都被統一當作文件來處理。
2)對象。在YAFFS2文件系統掛載時,YAFFS2文件系統會在內存中為每個文件建立一個對應的yaffs_obj對象。yaffs_obj數據結構主要包含3種內容:一是用戶ID、修改時間等文件屬性;二是用于實現對YAFFS2文件系統存儲信息作更新和維護的各種標記位,例如刪除標記等;三是用于表示YAFFS2文件系統中各存儲數據之間的組織結構關系的,如指向對象所屬父目錄的Parent指針等;此外,針對不同類型的對象實例,yaffs_obj中有與之對應的數據內容,例如普通文件類型對應的數據內容中主要包括用于快速查找文件數據塊的yaffs_tnode樹的指針等。
3)tag信息。在YAFFS2文件系統中,數據結構yaffs_ext_tags定義了NAND FLASH存儲介質物理頁上空閑區(OOB)的數據存儲格式。為了節省占用OOB區的空間,YAFFS2對yaffs_ext_tags信息進行了打包處理,最后以yaffs_packed_tags2結構存入OOB區。但為了規避在文件系統加載時掃描所有物理頁OOB區獲取yaffs_obj相關信息以建立文件結構,YAFFS2文件系統在每個物理塊的最后一個或多個物理頁以yaffs_summary_tags數據結構集中保存yaffs_obj濃縮版信息。
4)設備信息。在YAFFS2文件系統中,數據結構yaffs_dev等同于Linux系統中VFS的超級塊結構,為整個文件系統建立層次結構,記錄著與NAND Flash器件相關的屬性值和系統運行過程中的一些統計值,維護著一組NAND Flash存儲介質讀寫刪除有關的操作函數指針,是YAFFS2文件系統最核心的數據結構。
除了以上列舉的幾種數據結構之外,YAFFS2文件系統中還有許多復雜的數據結構,導致在YAFFS2文件系統上實現分區策略的設計存在著以下3個問題:
1)需要對YAFFS2文件系統的部分數據結構進行改進,而不是簡單引進新的數據結構即可;
2)需要將數據結構的改進落實到YAFFS2文件系統中與之相關的訪問機制里面,否則易造成數據的不可控;
3)需要考慮YAFFS2文件系統在啟動和退出時保存至NAND Flash中的快照信息的同步更新,以及原數據結構在保存至Flash塊上的位對齊與位數設計上是否有預留區,否則直接加入新的數據信息可能會造成位溢出,例如OOB區對Flash塊來說是固定的,無法保存過多信息,因此在分區策略的數據結構設計上應當盡可能的簡練。
為解決在星載環境中YAFFS2文件系統對多載荷/多任務數據數據管理難和數據存儲效率較低等問題,本文在YAFFS2文件系統原有數據結構的基礎上提出了分區策略架構設計,如圖1所示。

圖1 基于YAFFS2文件系統的分區策略架構設計
針對上文中對YAFFS2文件系統的研究和分析,本文提出的基于YAFFS2文件系統的分區策略架構設計主要分為以下3個部分:
1)數據結構的改進
該部分主要針對YAFFS2文件系統原有部分數據結構無法滿足分區策略需求的問題,通過對YAFFS2文件系統中的一些數據結構進行成員變量增刪改移以及引入一些新的數據結構,實現分區的數據存儲結構設計。
在YAFFS2文件系統的“超級塊”結構yaffs_dev中加入分區的劃分屬性,參考FAT文件映射表的設計方式,分區的劃分屬性以鏈表的方式實現,稱為分區屬性表(sector_table),其描述信息包括分區名稱、分區ID、分區信息結構入口等,目的在于可通過yaffs_dev實現對分區的訪問。
引入分區數據結構yaffs_sector用以保存各個分區相應信息,主要包括分區核心信息、分區下屬數據結構指針、分區管理函數入口指針等。其中分區核心信息包括分區ID、分區名稱等能表述分區身份的基本信息,以及分區大小、分區起始塊、分區結束塊、分區預留塊大小等限制屬性信息,分區鎖、分區垃圾回收閾值等操作控制信息;分區下屬數據結構指針包括Handle分區池、FileDes分區池、Inode分區池、塊信息數組block_info、分區位圖chunk_bits數據、分區訪問控制列表等數據結構入口指針;分區管理函數入口指針包括分區塊分配、分區塊回收、分區越界檢查等一些區內管理機制中的功能函數入口,以及分區文件查找、分區創建文件、分區刪除文件等文件操作函數入口。
在塊信息相關結構、tag信息相關結構、OOB信息相關結構中,均需引入結構所屬哪個分區的標識,以便在加載和訪問的時候能夠直接區分數據所屬不同分區。
2)分區內管理機制的設計
該部分主要解決如何通過改進后的數據結構實現對分區內數據的訪問以及對分區存儲空間管理的問題,將原先YAFFS2文件系統中管理整個NAND Flash存儲區的函數改造成只對分區內存儲區域操作的函數,其中一些功能仍沿用原先YAFFS2文件系統的設計,只是對其中的操作范圍添加限制。例如yaffs2_scan_chunk掃描函數,其掃描原理不變,只修改其掃描范圍,并將掃描結果反映至分區信息數據結構中,而不再反映至設備信息結構yaffs_dev中。
其中,分區塊分配管理機制主要解決分區內部Flash塊分配的問題,防止沿用原有YAFFS2文件系統中的分配函數時不對所分配的塊進行分區越界檢查,導致出現分區A的數據存儲至分區B所屬區域等分區間數據混亂現象。
分區垃圾回收管理機制同樣一改原有YAFFS2文件系統中垃圾回收的掃描范圍,僅對分區內部的臟塊進行判斷和回收。
區內磨損均衡管理機制主要解決讓分區內部各Flash塊擦除次數盡可能均勻的問題,沿用原YAFFS2文件系統中的設計,即塊分配策略和垃圾回收策略相結合。
分區訪問控制管理機制通過分區信息結構yaffs_sector中訪問控制列表實現,訪問控制列表記錄著不同載荷/任務ID以及對應的訪問權限。
分區快照機制將分區對應的checkpoint數據信息存儲至本分區存儲區域,實現在掉電重啟時只需遍歷掃描掉電時存在有數據修改且未保存的分區Flash塊的功能,而其它快照信息正常的分區通過YAFFS2 checkpoint機制啟動。
3)分區間管理機制的設計
該部分主要實現YAFFS2文件系統對各分區之間的協調管理以追求最大化發揮整個NAND Flash的利用效率,以及實現對各分區的統一管理,來解決分區內管理機制在實現上帶來的分區數據分化失衡、分區大小初始配置不合理等問題。
其中,分區動態劃分機制主要解決某個載荷/任務分區實際存儲空間遠小于初始分配大小而造成存儲空間浪費的分區大小初始配置不合理問題,以及解決某個載荷/任務產生數據量較大,以致其對應的載荷/任務分區大小在后期無法滿足存儲需要,而存在另一個載荷/任務分區數據存儲需求較小,空閑Flash塊較多的數據分化失衡問題。
分區數據動態遷移管理機制實現將分區Flash塊的數據移動到另一空閑Flash塊的功能,目的在于將某一分區的已分配塊緊湊或已分配的數據往后移,從而為前后分區空出多余的空閑區,以實現分區動態劃分功能。
分區數據映射機制實現對區間管理機制與分區內管理機制之間的數據對接功能,保證數據能分配到正確對應的分區操作中。
區間磨損均衡機制實現將冷熱分區數據對換的功能,以此延長NAND Flash芯片的平均使用壽命。
分區緩存機制作為實現區間磨損均衡的基礎,通過擴充文件緩存數目至3個,同時減少每一個文件緩存的cache數目,以減少總的文件緩存占用的內存空間,實現數據暫存的功能。
分區管理實現與文件系統間的對接機制主要實現文件系統對各個分區的統一管理以及初始分區的劃分等功能。
分區策略架構的實現主要包括兩個方面:數據結構的改進以及對YAFFS2文件系統原先各種功能實現機制的修改。
其中對YAFFS2文件系統數據結構的改進部分區別于原文件系統的關鍵之處在于新增了sector_table、yaffs_sector等數據結構,而對于原有的YAFFS2文件系統數據結構通過成員變量增刪改移的方式實現,由于篇幅限制,不作詳述。
1)sector_table
分區屬性表sector_table通過YAFFS2文件系統系統中封裝的鏈表管理list_head數據結構實現。
鏈表節點具體內容通過數據結構sector_info表示。每一個分區對應一個sector_info實例對象,并在分區屬性表sector_table中注冊,其結構設計如圖2所示。

圖2 sector_info數據結構設計
其中,分區ID用以實現文件系統后臺程序對分區的快速訪問,分區名稱實現通過路徑名對分區的訪問。分區信息結構入口保存了對應的分區實際管理結構指針。
2)yaffs_sector
yaffs_sector數據結構是分區YAFFS2文件系統實現分區管理的核心數據結構,其分擔了原先由yaffs_dev管理的部分功能,實現對分區界限、分區對象分配、分區垃圾回收過程信息等的管理。其具體實現如圖3所示。

圖3 yaffs_sector數據結構設計
其中成員變量主要包括分區核心信息、分區下屬數據結構實例、分區管理函數入口指針等。其中分區管理函數由結構體sector_behaviors統一管理,其實現過程如圖4所示。

圖4 sector_behaviors數據結構設計
而對于其他YAFFS2文件系統數據結構在原來的基礎上進行成員變量增刪改移。yaffs_dev數據結構中將yaffs_obj對象實例桶結構信息、塊信息數組和chunk位圖等block與chunk統計信息、tnode分配器信息、垃圾回收相關過程信息、tag數組信息等移至分區結構yaffs_sector中,經由各分區各自統計,不再統一管理以避免分區數據混亂。yaffs_file、yaffs_obj、yaffs_ext_tags、yaffs_summary_tags、yaffs_packed_tags2_tags_only等數據結構中引入新的整型成員變量sector_id,表示分區ID以區分數據結構對象實例所屬分區。
對YAFFS2文件系統原先各種功能實現機制的修改包括對YAFFS2文件系統垃圾回收機制、checkpoint機制、文件系統加載機制等的改進,由于篇幅限制,下面只進行部分介紹。
3)垃圾回收機制
分區YAFFS2文件系統的垃圾回收過程改為在yaffs_bg_start函數啟動的線程當中通過循環分別掃描每個分區的塊頁分配情況,并根據各分區的分配情況只針對有垃圾回收需求的分區啟動緊急回收策略或者非緊急回收策略,對于存儲空間不緊張的分區不采取垃圾回收行動。也就是在分區YAFFS2文件系統中,垃圾回收過程針對每個分區來說是獨立進行的,互不干擾。
4)checkpoint機制
checkpoint信息不再在整個NAND Flash存儲介質上任意存儲,而是每個分區獨立保存各自對應的checkpoint信息,防止在加載分區文件系統時造成跨分區數據訪問。
其中,yaffs_calc_checkpt_blocks_required(dev)原本是計算整個NAND Flash存儲介質上是否有足夠空間來保存整個YAFFS2文件系統的checkpoint信息,已修改為計算分區內的剩余空間能否滿足分區checkpoint需求。
5)文件系統加載機制
分區的加載是獨立的,如果通過checkpoint加載失敗則轉而通過掃描整個分區區域加載,而通過checkpoint加載成功的分區則無需再通過掃描進行加載。
本文使用的實驗環境軟件平臺為Ubuntu 12.04,操作系統內核版本號為3.11.0-15-generic;實驗硬件平臺基礎采用的CPU處理器型號為Intel Core i7 CPU 2.74 GHz,內存大小和型號為4G DDR3 1 600 MHz,并使用Linux操作系統自帶的NANDSIM模塊在內存中模擬NAND Flash存儲器作為分區YAFFS2文件系統的測試載體。模擬生成的NAND Flash存儲芯片其總容量為1G,其物理塊數為8 192塊,每塊頁數為62頁,每個物理頁大小為2 kb。
本文借助IOzone測試工具實現對分區YAFFS2文件系統的讀寫性能測試和評估。由于本文針對載荷數據研究YAFFS2文件系統分區管理對存儲效率的影響,因此本文選擇IOzone工具的多線程測試模式,相當于每個載荷各自對應于一個線程,測試命令為:iozone-s 4m-i 0-i 1-r 2m-l 1-u 4-I-o-Rb/home/wucanqiang/test/4m-2m-1-4.xls
其中,配置項-s表示文件大小,-r表示記錄塊大小(在測試過程中手動配置,測試范圍為2K~4M),-l表示最小線程數為1個,-u表示最大線程數為4個。
為保證實驗數據可信度,本文將底層文件訪問粒度(文件大小)設置為4 M,緩存大小設置為1 M,并通過IOzone對物理存儲設備直接寫入讀出的方式(配置項-I-o)進行100次讀寫操作,計算其平均讀寫速度值,規避緩存對讀寫速度產生的影響。根據IOzone測試工具生成的報表數據,文中為了便于實驗數據分析,將其轉化為圖5和圖6的折線圖。

圖5 分區前后YAFFS2文件系統讀速度變化情況
如圖5所示,其橫坐標表示記錄塊大小,即從4 M的文件大小下所讀取數據大小,縱坐標表示分區前后YAFFS2文件系統的讀速率,圖中淺色曲線表示分區YAFFS2文件系統的讀速度變化情況,深色曲線表示原YAFFS2文件系統的讀速度變化情況。從圖中數據可以明顯看出,分區YAFFS2文件系統相對了原YAFFS2文件系統在實現對文件數據大小記錄塊的讀操作時,其讀速度穩定優于原YAFFS2文件系統。

圖6 分區前后YAFFS2文件系統寫速度變化情況
如圖6所示,其橫坐標表示寫入文件數據大小,縱坐標表示分區前后YAFFS2文件系統的寫速率,圖中淺色曲線表示分區YAFFS2文件系統的寫速度變化情況,深色曲線表示原YAFFS2文件系統的寫速度變化情況。從圖中數據可以看出,YAFFS2文件系統引入分區管理功能之后并沒有對原YAFFS2文件系統的寫速度造成影響,同時又能保證在多任務環境下對復雜的大數據檢索效率得到一定提高,并使得載荷數據能分類獨立存儲,提高載荷數據的可靠性。
在星載環境中,載荷/任務數據種類和數據量多,對于數據的查找方式一般既要區分載荷類型又得區分時間段等多重信息。通過對YAFFS2文件系統優缺點的深入研究和分析,本文提出在YAFFS2文件系統的基礎上實現分區策略架構,通過引入分區管理功能,實現對多種載荷/任務數據的隔離管理和對分區的訪問控制。使得對于上層用戶來說,底層存儲介質存放的數據是安全獨立的,不會摻雜其它無關數據內容和其它載荷/任務數據,以此增加多載荷/任務數據的可靠性以及提高對復雜數據的檢索效率。實驗結果表明,分區YAFFS2文件系統分區管理功能正常,同時分區YAFFS2文件系統讀寫速度均穩定優于原YAFFS2文件系統。但在實驗過程中發現,因為YAFFS2文件系統在數據結構設計上的復雜性,使得YAFFS2文件系統只能管理幾十GB的數據量,無法滿足未來星載數據存儲管理要求,因此提出針對YAFFS2文件系統管理空間的優化設計將是本文下一步的研究重點方向。