周 斌,李 益,王成杰,付建國
應用研究
高可靠文件系統在傳動控制領域的實現與優化
周 斌,李 益,王成杰,付建國
(中車株洲電力機車研究所有限公司,湖南株洲 412000)
工業傳動控制領域具有大容量數據存儲的需求,為了防止數據存儲過程中突發斷電引起的文件系統損壞,本文提出在VxWorks操作系統上掛載高可靠文件系統。該事務型文件系統具備掉電安全特性,可確保數據可靠穩定存儲。針對NAND閃存,本文提出一種驅動層映射方案,實現存儲容量的擴展;另外,將硬件ECC校驗嵌入高可靠文件系統中,有效提升了系統的校驗能力和訪問速度。
高可靠文件系統 VxWorks 掉電安全 硬件ECC校驗
伴隨著工業智能化的發展,工業傳動控制領域需要大量的數據采集與分析,要求具備穩定的大容量數據存儲和高效的I/O讀寫能力。但由于現場掉電不可控,可能發生異常掉電導致系統崩潰的問題,為了保證數據可靠存儲,一款掉電安全的文件系統尤為必要。
目前嵌入式領域廣泛應用的文件系統主要有FAT[1]、JFFS[2]、YAFFS[3~4]、TureFFS[5]。其中FAT雖然兼容性好,但空間開銷大,磁盤利用率低。JFFS是一款針對閃存設計的日志型文件系統,TrueFFS實現了對閃存的磁盤模擬功能,但兩者對NAND閃存支持效果都不佳。而YAFFS雖然是一款根據NAND閃存特性而設計的高效文件系統,但以上文件系統需要較大的額外開銷來存放文件元信息,依舊存在異常崩潰的風險[6]。
高可靠文件系統是Datalight公司開發的一款事務型文件系統,數據更新時不影響原始數據,更新完成后才進行事務點切換。由于切換屬于原子級操作,保證了數據時刻有效,真正實現了掉電安全,并且掛載和訪問速度快,非常適用于系統穩定性要求高的工業傳動控制領域,同時支持NOR、NAND、EMMC等各類存儲器。
本文實現了在VxWorks硬實時操作系統上掛載高可靠文件系統,并且在一套系統中基于NOR、NAND閃存分別掛載了兩個獨立盤符。同時考慮NAND閃存的比特翻轉等物理特性[7~9],將硬件ECC校驗嵌入高可靠文件系統中,極大提升系統校驗能力。此外提出了一種驅動層映射方案,整合多片NAND閃存容量進行統一管理,提升存儲容量。
工業傳動控制領域某型控制平臺,CPU采用飛思卡爾的MPC5125RM處理器,配置兩片M29W256GL70N6F型NOR閃存,每片容量32 MB,兩片MT29F8G08ABABAWP型NAND閃存,每片容量1 GB。

圖1 控制平臺系統框架
為了保證實時性和可靠性,采用風河硬實時VxWorks操作系統。其中NOR閃存1不掛載文件系統,用于存放BOOTROM引導程序、VxWorks鏡像程序以及環境變量,NOR閃存2掛載高可靠文件系統,用于存放用戶的應用程序和配置文件。兩片NAND閃存集成掛載高可靠文件系統,用于記錄運行過程中的狀態和故障信息,通過驅動層映射,兩片NAND通過掛載在同一盤符下,擴展閃存容量。
系統上電后,處理器中固化的RBL文件被加載至片內RAM運行,然后運行NOR閃存1的BOOTROM程序進行必要硬件初始化,進而啟動加載VxWorks鏡像程序。VxWorks進行底層BSP和內核初始化后,根據內核組件配置分別針對NOR閃存2和NAND閃存掛載高可靠文件系統。然后開始解析和執行存放在NOR文件系統中的應用程序,并將運行中的狀態數據和故障信息存放在NAND文件系統中。
本系統采用Datalight公司的高可靠文件系統,主要包括FlashFX和Reliance兩部分。
FlashFX為FLASH驅動管理層,負責與底層FLASH通信,并為上層文件系統提供支撐。它負責提供塊設備驅動,其可變的塊格式提供了高效的閃存訪問,支持磨損均衡和垃圾回收機制,并針對NAND閃存提供高效的版塊管理機制。
Reliance為一款事務型文件系統,專為嵌入式領域設計,主要實現文件邏輯管理,具備掉電安全特性。如下圖所示,它在執行數據更新時,所有文件系統修改都存儲在未生效的工作態空間中,不會覆蓋原始數據。只有在完成數據更新,設置新事務點后,才進行工作態到確定態的切換。該切換過程屬原子級操作,確保了有異常發生時,或者采信事務點之前的原始數據,或者采信新數據,保證即使異常掉電時元數據和文件數據的完整性。同時由于消除了冗長的文件系統檢查,還具備掛載速度快、高性能I/O讀寫等優點。

圖2 文件系統掉電安全機制
2.2.1 FlashFX組件生成
安裝FlashFX的SDK包,SDK提供的工程樣例中沒有MPC5125處理器對應工程,可使用newproj.bat新建,或基于現有工程修改prjinfo.dat文件。主要配置或修改的參數有FlashFX安裝路徑、工程路徑、CPU類型、編譯器工具集。
掛載NOR閃存2。FlashFX針對該閃存實現了底層驅動接口,只需要修改ffxconf.h文件,增加如圖3宏定義:

圖3 基于NOR閃存的FlashFX配置
其中FFX_DEV0_SETTINGS宏定義中,0xFC000000L表示NOR的基地址,0x00008000L為NOR容量(單位KByte)。
掛載NAND閃存1,ffxconf.h文件中增加如圖4宏定義:

圖4 基于NAND閃存的FlashFX配置
FlashFX沒有提供該型號的底層驅動,需要自實現NAND初始化、ID獲取、讀、寫、擦驅動函數,然后修改fhpageio.c文件,該文件負責與底層驅動交互,將其中所有涉及驅動調用的修改為調用自實現驅動即可。
如果FlashFX支持該閃存型號,系統將根據獲取的ID號自動設置閃存參數。如果不支持該型號閃存,需要修改nandid.c文件,按實際器件型號配置FLASH的ID號,在宏定義中修改閃存的容量、頁、塊以及OOB尺寸等信息。
修改dclconf.h文件,不使能VxWorks的高精度定時器,否則延遲時可能出錯。
工程修改完成后,使用workbench3.2的shell窗口,切換至FlashFX工程路徑,輸入指令prjclean.bat清除編譯信息,然后輸入prjbuild.bat [n]編譯,其中n取值0~2,數值越大編譯涵蓋的調試信息越多。編譯成功后,將生成“flashfxPPC603diab.a”庫文件。
2.2.2 Reliance組件生成
安裝Reliance的SDK包,然后使用newproj.bat新建工程,或者基于現有工程修改prjinfo.dat文件。主要配置或修改Reliance安裝路徑、工程路徑、、CPU族、CPU類型、編譯器工具集等參數。
修改dclconf.h文件,不使用VxWorks的高精度定時器。Reliance工程一般不需要修改額外的源碼即可編譯,使用指令prjclean.bat和prjbuild.bat,編譯成功后將生成“relFsLibPPC603diab.a”庫文件。
風河VxWorks內核支持高可靠文件系統,其中內核組件50ffx62.cdf和50relFs62.cdf分別為FlashFX和Reliance組件,這里需要將其替換成文件系統SDK中最新文件。
FlashFX和Reliance庫文件都編譯成功后,將其拷貝至VxWorks安裝路徑WindRiver6.8vxworks-6.8 argetlib下,并在VxWorks工程的屬性LIBS一欄添加庫路徑。
然后打開VxWorks工程的內核配置,使能FlashFX組件的配置如下:根據ffxconf.h文件的設置,將NOR文件系統設置為盤符0,命名為“/tffs0”,將NAND文件系統設置為盤符1,命名為“/yaffs”。

圖5 VxWorks內核中關于FlashFX的配置
使能Reliance組件的配置如下:

圖6 VxWorks內核中關于Reliance的配置
另外修改VxWorks內核的xbdBlkDev.c和erfLib.c文件,調整擴大任務的堆棧大小。
最終編譯VxWorks工程即可生成可用的底層鏡像文件,即前文介紹的VxWorks鏡像程序。
對于NAND閃存,高可靠文件系統僅支持軟件ECC校驗,其具體思路是:寫操作時,對數據進行軟件ECC校驗,并將ECC校驗值存到閃存的OOB區,下次讀數據時,同樣對數據做ECC校驗,并將校驗值與OOB區存放的值比對是否一致。其校驗能力為1比特/256字節。而本系統架構可支持硬件ECC校驗,硬件ECC不需要軟件計算,直接硬件生成并存放在OOB區,其速度更快,且校驗能力更強,最高可達32比特/2048字節。
本文提出將硬件ECC校驗嵌入高可靠文件系統中。首先修改底層驅動,修改NAND初始化函數,使能硬件ECC校驗算法,配置校驗能力為24比特/2048字節。修改NAND讀驅動,將硬件ECC校驗結果作為函數返回值,具體返回值狀態表1所示:

表1 NAND閃存讀驅動返回值對照表
同步修改FlashFX。fhpageio.c文件中FfxHookNTPageRead()讀接口在調用讀驅動時,保存返回值中的ECC校驗結果。然后修改dlecc.c中的DclEccCorrect()函數,屏蔽掉其中的軟件ECC校驗值計算過程,直接使用讀驅動中返回的硬件ECC校驗結果。
本系統采用兩片同型號的NAND閃存,分別連接MPC5125處理器的CS0和CS3片選。通過構建驅動映射層,可以將兩片閃存掛載在同一盤符下,使兩片獨立閃存可視作整體進行統一管理,擴展了存儲容量。
首先需要修改文件系統FlashFX中的nandid.c文件,將兩片視作一個整體,調整閃存的總容量為原有兩倍,閃存的塊個數也為原有兩倍,頁尺寸信息不變,重新編譯FLashFX庫文件。
然后構建驅動映射層,負責銜接上層文件系統和底層驅動。它會解析文件系統需要訪問的地址空間,當需要讀寫前2048*128個頁,或者需擦除前2048個塊時,映射調用對應CS0的NAND底層驅動,反之則映射調用對應CS3的NAND底層驅動。
高可靠文件系統在VxWorks實時操作系統上的實現移植和優化后,這里對其方案可行性進行驗證,并與yaffs2文件系統進行對比,比對兩種文件系統的掛載和訪問速度。
超級終端中輸入relFsVolFormat “/tffs0”格式化NOR閃存的文件系統,返回值0表示格式化成功。接著輸入relFsShow “/tffs0”可查看NOR文件系統的基本信息,返回值為0即驗證掛載成功,顯示其容量約為NOR閃存容量。
同樣,輸入relFsVolFormat “/yaffs”格式化NAND閃存的文件系統,返回值0表示格式化成功,接著輸入relFsShow “/yaffs”可查看NAND文件系統的基本信息。返回值為0即驗證掛載成功,其容量約為兩片NAND閃存容量總和。
具體的掛載成功信息參見圖7所示。
FlashFX和Reliance都分別提供了全套的測試組件和工具組件,使能了這些組件后,可以對移植的文件系統進行細致而全方位的測試。
基于本文的文件系統優化方案,針對本系統的NAND閃存,在VxWorks實時操作系統上,對比yaffs2和reliance高可靠文件系統的掛載和訪問速度,性能對比如圖8所示。高可靠文件系統,由于始終處于有效狀態,初始化時不需要進行冗長的存儲介質掃描,相較而言掛載速度更快。作為事務型文件系統,避免了費時的日志操作,并通過使用虛擬邏輯塊和緩沖區,其I/O讀寫性能要更好。而且,基于原始數據保存,直到數據更新完成才進行事務切換,真正確保了掉電安全。


圖8 高可靠文件系統性能分析
本文針對工業傳動控制領域因為異常掉電可能導致文件系統損壞的問題,實現了在VxWorks實時操作系統上基于兩種不同類型的閃存掛載了高可靠文件系統。該事務型文件系統,因為始終保證事務點切換的原子級操作,具備掉電安全特性。基于NAND閃存,本文提出將硬件ECC嵌入高可靠文件系統,提升了系統校驗能力和訪問速度,并通過構建驅動映射層,擴大了存儲容量。通過驗證與分析,本系統方案下的文件系統掛載和訪問速度均要優于yaffs文件系統。且本方案不局限于工業傳動控制領域,有望在任何有掉電安全需求的嵌入式領域應用。
[1] 王丹, 姚磊, 楊云川, 楊向鋒. 基于FAT文件系統的高速大數據記錄儀的設計[J],電子設計工程, 2019, 27(20): 75-78.
[2] 胡海明, 周楠, 龔宬, 等. JFFS2文件系統在天熠操作系統中的實現[J],計算機工程與設計, 2017, 38(12): 3461-3467.
[3] 柴權珂, 嚴華. 基于無效頁年齡的NAND閃存垃圾回收算法[J], 微電子學與計算機, 2021, 38(3): 8-13.
[4] 劉世杰. 基于YAFFS2文件系統元數據的數字取證研究[D], 武漢: 武漢輕工大學, 2020.
[5] 陳陽, 姜育生, 劉寶恒. 基于TureFFS的FLASH驅動程序分析與實現[J], 電子設計工程,2020, 28(14): 190-193.
[6] 李書根, 潘海燕, 王培. 一種嵌入式實時操作系統高可靠文件系統[J],微電子學與計算機, 2014, 31(3): 14-22.
[7] 劉洋, 李杰, 李金強, 等. 一種基于RCRF+BCH算法的NAND FLASH糾錯方案的FPGA設計與實現[J],空軍工程大學學報(自然科學版), 2020, 21(6): 46-52.
[8] Zhou B, Wan S G, Xie C S. Isolation: Inexpensively separating cold data via garbage collection to improve the lifetime and performance of NAND flash SSDs[J]. Concurrency and Computation: Practice and Experience, 2019(3).
[9] Seo S B, Kim W, Kwon SJ. Efficient page collection scheme for QLC NAND Flash memory using cache[J]. International Journal of Advanced Computer Science and Applications, 2018, 9(11): 458-461.
Implement and optimization of highly reliable file system
Zhou Bin, Li Yi, Wang Chengjie, Fu Jianguo
( CRRC Zhuzhou Electric Locomotive Research Institute Co., Ltd, Zhuzhou 412000, Hunan China)
TP316
A
1003-4862(2022)01-0044-05
2021-06-19
周斌(1992-),男,工程師。主要從事嵌入式驅動軟件開發。Email:zhoubin0920@163.com