周 斌,李 益,王成杰,付建國
應(yīng)用研究
高可靠文件系統(tǒng)在傳動控制領(lǐng)域的實現(xiàn)與優(yōu)化
周 斌,李 益,王成杰,付建國
(中車株洲電力機車研究所有限公司,湖南株洲 412000)
工業(yè)傳動控制領(lǐng)域具有大容量數(shù)據(jù)存儲的需求,為了防止數(shù)據(jù)存儲過程中突發(fā)斷電引起的文件系統(tǒng)損壞,本文提出在VxWorks操作系統(tǒng)上掛載高可靠文件系統(tǒng)。該事務(wù)型文件系統(tǒng)具備掉電安全特性,可確保數(shù)據(jù)可靠穩(wěn)定存儲。針對NAND閃存,本文提出一種驅(qū)動層映射方案,實現(xiàn)存儲容量的擴展;另外,將硬件ECC校驗嵌入高可靠文件系統(tǒng)中,有效提升了系統(tǒng)的校驗?zāi)芰驮L問速度。
高可靠文件系統(tǒng) VxWorks 掉電安全 硬件ECC校驗
伴隨著工業(yè)智能化的發(fā)展,工業(yè)傳動控制領(lǐng)域需要大量的數(shù)據(jù)采集與分析,要求具備穩(wěn)定的大容量數(shù)據(jù)存儲和高效的I/O讀寫能力。但由于現(xiàn)場掉電不可控,可能發(fā)生異常掉電導(dǎo)致系統(tǒng)崩潰的問題,為了保證數(shù)據(jù)可靠存儲,一款掉電安全的文件系統(tǒng)尤為必要。
目前嵌入式領(lǐng)域廣泛應(yīng)用的文件系統(tǒng)主要有FAT[1]、JFFS[2]、YAFFS[3~4]、TureFFS[5]。其中FAT雖然兼容性好,但空間開銷大,磁盤利用率低。JFFS是一款針對閃存設(shè)計的日志型文件系統(tǒng),TrueFFS實現(xiàn)了對閃存的磁盤模擬功能,但兩者對NAND閃存支持效果都不佳。而YAFFS雖然是一款根據(jù)NAND閃存特性而設(shè)計的高效文件系統(tǒng),但以上文件系統(tǒng)需要較大的額外開銷來存放文件元信息,依舊存在異常崩潰的風險[6]。
高可靠文件系統(tǒng)是Datalight公司開發(fā)的一款事務(wù)型文件系統(tǒng),數(shù)據(jù)更新時不影響原始數(shù)據(jù),更新完成后才進行事務(wù)點切換。由于切換屬于原子級操作,保證了數(shù)據(jù)時刻有效,真正實現(xiàn)了掉電安全,并且掛載和訪問速度快,非常適用于系統(tǒng)穩(wěn)定性要求高的工業(yè)傳動控制領(lǐng)域,同時支持NOR、NAND、EMMC等各類存儲器。
本文實現(xiàn)了在VxWorks硬實時操作系統(tǒng)上掛載高可靠文件系統(tǒng),并且在一套系統(tǒng)中基于NOR、NAND閃存分別掛載了兩個獨立盤符。同時考慮NAND閃存的比特翻轉(zhuǎn)等物理特性[7~9],將硬件ECC校驗嵌入高可靠文件系統(tǒng)中,極大提升系統(tǒng)校驗?zāi)芰?。此外提出了一種驅(qū)動層映射方案,整合多片NAND閃存容量進行統(tǒng)一管理,提升存儲容量。
工業(yè)傳動控制領(lǐng)域某型控制平臺,CPU采用飛思卡爾的MPC5125RM處理器,配置兩片M29W256GL70N6F型NOR閃存,每片容量32 MB,兩片MT29F8G08ABABAWP型NAND閃存,每片容量1 GB。
圖1 控制平臺系統(tǒng)框架
為了保證實時性和可靠性,采用風河硬實時VxWorks操作系統(tǒng)。其中NOR閃存1不掛載文件系統(tǒng),用于存放BOOTROM引導(dǎo)程序、VxWorks鏡像程序以及環(huán)境變量,NOR閃存2掛載高可靠文件系統(tǒng),用于存放用戶的應(yīng)用程序和配置文件。兩片NAND閃存集成掛載高可靠文件系統(tǒng),用于記錄運行過程中的狀態(tài)和故障信息,通過驅(qū)動層映射,兩片NAND通過掛載在同一盤符下,擴展閃存容量。
系統(tǒng)上電后,處理器中固化的RBL文件被加載至片內(nèi)RAM運行,然后運行NOR閃存1的BOOTROM程序進行必要硬件初始化,進而啟動加載VxWorks鏡像程序。VxWorks進行底層BSP和內(nèi)核初始化后,根據(jù)內(nèi)核組件配置分別針對NOR閃存2和NAND閃存掛載高可靠文件系統(tǒng)。然后開始解析和執(zhí)行存放在NOR文件系統(tǒng)中的應(yīng)用程序,并將運行中的狀態(tài)數(shù)據(jù)和故障信息存放在NAND文件系統(tǒng)中。
本系統(tǒng)采用Datalight公司的高可靠文件系統(tǒng),主要包括FlashFX和Reliance兩部分。
FlashFX為FLASH驅(qū)動管理層,負責與底層FLASH通信,并為上層文件系統(tǒng)提供支撐。它負責提供塊設(shè)備驅(qū)動,其可變的塊格式提供了高效的閃存訪問,支持磨損均衡和垃圾回收機制,并針對NAND閃存提供高效的版塊管理機制。
Reliance為一款事務(wù)型文件系統(tǒng),專為嵌入式領(lǐng)域設(shè)計,主要實現(xiàn)文件邏輯管理,具備掉電安全特性。如下圖所示,它在執(zhí)行數(shù)據(jù)更新時,所有文件系統(tǒng)修改都存儲在未生效的工作態(tài)空間中,不會覆蓋原始數(shù)據(jù)。只有在完成數(shù)據(jù)更新,設(shè)置新事務(wù)點后,才進行工作態(tài)到確定態(tài)的切換。該切換過程屬原子級操作,確保了有異常發(fā)生時,或者采信事務(wù)點之前的原始數(shù)據(jù),或者采信新數(shù)據(jù),保證即使異常掉電時元數(shù)據(jù)和文件數(shù)據(jù)的完整性。同時由于消除了冗長的文件系統(tǒng)檢查,還具備掛載速度快、高性能I/O讀寫等優(yōu)點。
圖2 文件系統(tǒng)掉電安全機制
2.2.1 FlashFX組件生成
安裝FlashFX的SDK包,SDK提供的工程樣例中沒有MPC5125處理器對應(yīng)工程,可使用newproj.bat新建,或基于現(xiàn)有工程修改prjinfo.dat文件。主要配置或修改的參數(shù)有FlashFX安裝路徑、工程路徑、CPU類型、編譯器工具集。
掛載NOR閃存2。FlashFX針對該閃存實現(xiàn)了底層驅(qū)動接口,只需要修改ffxconf.h文件,增加如圖3宏定義:
圖3 基于NOR閃存的FlashFX配置
其中FFX_DEV0_SETTINGS宏定義中,0xFC000000L表示NOR的基地址,0x00008000L為NOR容量(單位KByte)。
掛載NAND閃存1,ffxconf.h文件中增加如圖4宏定義:
圖4 基于NAND閃存的FlashFX配置
FlashFX沒有提供該型號的底層驅(qū)動,需要自實現(xiàn)NAND初始化、ID獲取、讀、寫、擦驅(qū)動函數(shù),然后修改fhpageio.c文件,該文件負責與底層驅(qū)動交互,將其中所有涉及驅(qū)動調(diào)用的修改為調(diào)用自實現(xiàn)驅(qū)動即可。
如果FlashFX支持該閃存型號,系統(tǒng)將根據(jù)獲取的ID號自動設(shè)置閃存參數(shù)。如果不支持該型號閃存,需要修改nandid.c文件,按實際器件型號配置FLASH的ID號,在宏定義中修改閃存的容量、頁、塊以及OOB尺寸等信息。
修改dclconf.h文件,不使能VxWorks的高精度定時器,否則延遲時可能出錯。
工程修改完成后,使用workbench3.2的shell窗口,切換至FlashFX工程路徑,輸入指令prjclean.bat清除編譯信息,然后輸入prjbuild.bat [n]編譯,其中n取值0~2,數(shù)值越大編譯涵蓋的調(diào)試信息越多。編譯成功后,將生成“flashfxPPC603diab.a”庫文件。
2.2.2 Reliance組件生成
安裝Reliance的SDK包,然后使用newproj.bat新建工程,或者基于現(xiàn)有工程修改prjinfo.dat文件。主要配置或修改Reliance安裝路徑、工程路徑、、CPU族、CPU類型、編譯器工具集等參數(shù)。
修改dclconf.h文件,不使用VxWorks的高精度定時器。Reliance工程一般不需要修改額外的源碼即可編譯,使用指令prjclean.bat和prjbuild.bat,編譯成功后將生成“relFsLibPPC603diab.a”庫文件。
風河VxWorks內(nèi)核支持高可靠文件系統(tǒng),其中內(nèi)核組件50ffx62.cdf和50relFs62.cdf分別為FlashFX和Reliance組件,這里需要將其替換成文件系統(tǒng)SDK中最新文件。
FlashFX和Reliance庫文件都編譯成功后,將其拷貝至VxWorks安裝路徑WindRiver6.8vxworks-6.8 argetlib下,并在VxWorks工程的屬性LIBS一欄添加庫路徑。
然后打開VxWorks工程的內(nèi)核配置,使能FlashFX組件的配置如下:根據(jù)ffxconf.h文件的設(shè)置,將NOR文件系統(tǒng)設(shè)置為盤符0,命名為“/tffs0”,將NAND文件系統(tǒng)設(shè)置為盤符1,命名為“/yaffs”。
圖5 VxWorks內(nèi)核中關(guān)于FlashFX的配置
使能Reliance組件的配置如下:
圖6 VxWorks內(nèi)核中關(guān)于Reliance的配置
另外修改VxWorks內(nèi)核的xbdBlkDev.c和erfLib.c文件,調(diào)整擴大任務(wù)的堆棧大小。
最終編譯VxWorks工程即可生成可用的底層鏡像文件,即前文介紹的VxWorks鏡像程序。
對于NAND閃存,高可靠文件系統(tǒng)僅支持軟件ECC校驗,其具體思路是:寫操作時,對數(shù)據(jù)進行軟件ECC校驗,并將ECC校驗值存到閃存的OOB區(qū),下次讀數(shù)據(jù)時,同樣對數(shù)據(jù)做ECC校驗,并將校驗值與OOB區(qū)存放的值比對是否一致。其校驗?zāi)芰?比特/256字節(jié)。而本系統(tǒng)架構(gòu)可支持硬件ECC校驗,硬件ECC不需要軟件計算,直接硬件生成并存放在OOB區(qū),其速度更快,且校驗?zāi)芰Ω鼜姡罡呖蛇_32比特/2048字節(jié)。
本文提出將硬件ECC校驗嵌入高可靠文件系統(tǒng)中。首先修改底層驅(qū)動,修改NAND初始化函數(shù),使能硬件ECC校驗算法,配置校驗?zāi)芰?4比特/2048字節(jié)。修改NAND讀驅(qū)動,將硬件ECC校驗結(jié)果作為函數(shù)返回值,具體返回值狀態(tài)表1所示:
表1 NAND閃存讀驅(qū)動返回值對照表
同步修改FlashFX。fhpageio.c文件中FfxHookNTPageRead()讀接口在調(diào)用讀驅(qū)動時,保存返回值中的ECC校驗結(jié)果。然后修改dlecc.c中的DclEccCorrect()函數(shù),屏蔽掉其中的軟件ECC校驗值計算過程,直接使用讀驅(qū)動中返回的硬件ECC校驗結(jié)果。
本系統(tǒng)采用兩片同型號的NAND閃存,分別連接MPC5125處理器的CS0和CS3片選。通過構(gòu)建驅(qū)動映射層,可以將兩片閃存掛載在同一盤符下,使兩片獨立閃存可視作整體進行統(tǒng)一管理,擴展了存儲容量。
首先需要修改文件系統(tǒng)FlashFX中的nandid.c文件,將兩片視作一個整體,調(diào)整閃存的總?cè)萘繛樵袃杀?,閃存的塊個數(shù)也為原有兩倍,頁尺寸信息不變,重新編譯FLashFX庫文件。
然后構(gòu)建驅(qū)動映射層,負責銜接上層文件系統(tǒng)和底層驅(qū)動。它會解析文件系統(tǒng)需要訪問的地址空間,當需要讀寫前2048*128個頁,或者需擦除前2048個塊時,映射調(diào)用對應(yīng)CS0的NAND底層驅(qū)動,反之則映射調(diào)用對應(yīng)CS3的NAND底層驅(qū)動。
高可靠文件系統(tǒng)在VxWorks實時操作系統(tǒng)上的實現(xiàn)移植和優(yōu)化后,這里對其方案可行性進行驗證,并與yaffs2文件系統(tǒng)進行對比,比對兩種文件系統(tǒng)的掛載和訪問速度。
超級終端中輸入relFsVolFormat “/tffs0”格式化NOR閃存的文件系統(tǒng),返回值0表示格式化成功。接著輸入relFsShow “/tffs0”可查看NOR文件系統(tǒng)的基本信息,返回值為0即驗證掛載成功,顯示其容量約為NOR閃存容量。
同樣,輸入relFsVolFormat “/yaffs”格式化NAND閃存的文件系統(tǒng),返回值0表示格式化成功,接著輸入relFsShow “/yaffs”可查看NAND文件系統(tǒng)的基本信息。返回值為0即驗證掛載成功,其容量約為兩片NAND閃存容量總和。
具體的掛載成功信息參見圖7所示。
FlashFX和Reliance都分別提供了全套的測試組件和工具組件,使能了這些組件后,可以對移植的文件系統(tǒng)進行細致而全方位的測試。
基于本文的文件系統(tǒng)優(yōu)化方案,針對本系統(tǒng)的NAND閃存,在VxWorks實時操作系統(tǒng)上,對比yaffs2和reliance高可靠文件系統(tǒng)的掛載和訪問速度,性能對比如圖8所示。高可靠文件系統(tǒng),由于始終處于有效狀態(tài),初始化時不需要進行冗長的存儲介質(zhì)掃描,相較而言掛載速度更快。作為事務(wù)型文件系統(tǒng),避免了費時的日志操作,并通過使用虛擬邏輯塊和緩沖區(qū),其I/O讀寫性能要更好。而且,基于原始數(shù)據(jù)保存,直到數(shù)據(jù)更新完成才進行事務(wù)切換,真正確保了掉電安全。
圖8 高可靠文件系統(tǒng)性能分析
本文針對工業(yè)傳動控制領(lǐng)域因為異常掉電可能導(dǎo)致文件系統(tǒng)損壞的問題,實現(xiàn)了在VxWorks實時操作系統(tǒng)上基于兩種不同類型的閃存掛載了高可靠文件系統(tǒng)。該事務(wù)型文件系統(tǒng),因為始終保證事務(wù)點切換的原子級操作,具備掉電安全特性?;贜AND閃存,本文提出將硬件ECC嵌入高可靠文件系統(tǒng),提升了系統(tǒng)校驗?zāi)芰驮L問速度,并通過構(gòu)建驅(qū)動映射層,擴大了存儲容量。通過驗證與分析,本系統(tǒng)方案下的文件系統(tǒng)掛載和訪問速度均要優(yōu)于yaffs文件系統(tǒng)。且本方案不局限于工業(yè)傳動控制領(lǐng)域,有望在任何有掉電安全需求的嵌入式領(lǐng)域應(yīng)用。
[1] 王丹, 姚磊, 楊云川, 楊向鋒. 基于FAT文件系統(tǒng)的高速大數(shù)據(jù)記錄儀的設(shè)計[J],電子設(shè)計工程, 2019, 27(20): 75-78.
[2] 胡海明, 周楠, 龔宬, 等. JFFS2文件系統(tǒng)在天熠操作系統(tǒng)中的實現(xiàn)[J],計算機工程與設(shè)計, 2017, 38(12): 3461-3467.
[3] 柴權(quán)珂, 嚴華. 基于無效頁年齡的NAND閃存垃圾回收算法[J], 微電子學與計算機, 2021, 38(3): 8-13.
[4] 劉世杰. 基于YAFFS2文件系統(tǒng)元數(shù)據(jù)的數(shù)字取證研究[D], 武漢: 武漢輕工大學, 2020.
[5] 陳陽, 姜育生, 劉寶恒. 基于TureFFS的FLASH驅(qū)動程序分析與實現(xiàn)[J], 電子設(shè)計工程,2020, 28(14): 190-193.
[6] 李書根, 潘海燕, 王培. 一種嵌入式實時操作系統(tǒng)高可靠文件系統(tǒng)[J],微電子學與計算機, 2014, 31(3): 14-22.
[7] 劉洋, 李杰, 李金強, 等. 一種基于RCRF+BCH算法的NAND FLASH糾錯方案的FPGA設(shè)計與實現(xiàn)[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-),男,工程師。主要從事嵌入式驅(qū)動軟件開發(fā)。Email:zhoubin0920@163.com