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