朱紹英,查啟鵬
(中國電子科技集團(tuán)公司第三十二研究所,上海200233)
基于嵌入式Linux的YAFFS2文件系統(tǒng)研究與改進(jìn)
朱紹英,查啟鵬
(中國電子科技集團(tuán)公司第三十二研究所,上海200233)
YAFFS2文件系統(tǒng)是針對NAND Flash按塊擦寫特點設(shè)計的一種專用Flash文件系統(tǒng),其存在加載時間長和NAND Flash專用的局限性。為此,從Flash存儲器管理和文件管理2個方面分析該系統(tǒng)的設(shè)計原理及特性,提出一種新的文件系統(tǒng)信息存儲方式,并從文件系統(tǒng)初始化、垃圾回收、斷電保護(hù)等方面對YAFFS2文件系統(tǒng)進(jìn)行改進(jìn),減少加載時間,使之能應(yīng)用于多種Flash存儲器。測試結(jié)果表明,與原系統(tǒng)相比,改進(jìn)系統(tǒng)的安裝時間減少25%,并可實現(xiàn)Flash各存儲扇區(qū)的均衡使用。
YAFFS2文件系統(tǒng);NAND存儲器;嵌入式Linux系統(tǒng);垃圾回收策略;損耗平衡
Flash存儲器由于具有存儲容量大、掉電數(shù)據(jù)不丟失以及可多次擦寫等許多優(yōu)點而被廣泛應(yīng)用于各類電子產(chǎn)品中,其存儲特性決定了已有的磁盤文件系統(tǒng)不能直接用于Flash存儲器,而必須采用專用的Flash文件系統(tǒng)。Flash文件系統(tǒng)除了要滿足一般文件系統(tǒng)的基本要求外,還要根據(jù)其自身的一些特性實現(xiàn)對Flash的有效管理。如廣泛應(yīng)用于NOR Flash的JFSS2(Journalling Flash File System)專用文件系統(tǒng),而有些Flash存儲器如MMC卡、SD卡,由于內(nèi)嵌了各自的FTL(Flash Translation Layer)固件,使得傳統(tǒng)的磁盤文件系統(tǒng)可以直接使用。YAFFS2文件系統(tǒng)是A leph One公司針對NAND Flash的特點而設(shè)計的一種專用Flash文件系統(tǒng)[1]。它主要是通過NAND Flash每頁的OOB(Out of Band)區(qū)存儲文件系統(tǒng)信息而實現(xiàn)的,具有效率高、占用資源較少等特點[2]。本文分析YAFFS2文件系統(tǒng)的基本工作原理,包括存儲器管理和文件管理,針對其加載時間隨文件系統(tǒng)分區(qū)增大而線性增大和僅限于NAND Flash的局限性,提出一種新的文件系統(tǒng)信息存儲方式,避免使用OOB區(qū),并改進(jìn)文件系統(tǒng)初始化時的掃描方式以及垃圾回收和掉電保護(hù)機(jī)制,實現(xiàn)在NAND Flash、MMC卡和NOR Flash等Flash存儲器上搭建YAFFS2文件系統(tǒng)的目的。
Linux下的文件系統(tǒng)一般設(shè)計一個文件系統(tǒng)信息組成的“超級塊”,存放在存儲器的特定位置,其中包含了存儲器空間大小、存儲器使用情況和各個文件的存放信息等,并在文件系統(tǒng)安裝時被讀入以建立VFS(Virtual File System)層的super_block結(jié)構(gòu)實例[3-4]。然而,YAFFS2文件系統(tǒng)中存儲器上并沒有類似的超級信息塊,在加載文件分區(qū)時,通過掃描存儲分區(qū)來得到相應(yīng)的文件系統(tǒng)信息并建立super_ block結(jié)構(gòu)實例,包括一些其他的信息,例如文件節(jié)點等。對于用戶,文件系統(tǒng)就是要實現(xiàn)按名字存取文件,以及文件和目錄的一些的管理操作,如創(chuàng)建、刪除、讀寫等[5-6]。下面分別從存儲器管理和文件管理與來具體分析YAFFS2文件系統(tǒng)的設(shè)計原理。
2.1 NAND存儲器管理
YAFFS2文件系統(tǒng)以扇區(qū)為單位在NAND Flash存儲數(shù)據(jù),即NAND Flash的頁,頁的大小主要有512 Byte,2 KB和4 KB等。若頁大小為2 KB,則每頁有64 Byte大小的OOB區(qū),而所有頁的分配與讀寫是以塊為單位進(jìn)行管理的,YAFFS2文件系統(tǒng)通過將存儲器的每個存儲塊分成為各種不同的狀態(tài)進(jìn)行組織管理,實現(xiàn)中使用共用體結(jié)構(gòu)yaffs_ BlockState來標(biāo)識,分別有初始、掃描、空閑、分配中、滿、臟6種狀態(tài)[7]。其中掃描狀態(tài)是指在加載文件系統(tǒng)時,正在讀該存儲塊的數(shù)據(jù),并對其數(shù)據(jù)進(jìn)行分析處理,在整個文件系統(tǒng)分區(qū)的所有存儲塊的數(shù)據(jù)處理完之后,這些狀態(tài)的存儲塊分別會設(shè)置最后的使用狀態(tài);當(dāng)存儲塊中所有的扇區(qū)都被使用時,會被標(biāo)記為滿或者直接標(biāo)記為臟狀態(tài),后者是指存儲塊中所有扇區(qū)的數(shù)據(jù)都被標(biāo)記為無效數(shù)據(jù),必須將這個存儲塊擦除為空狀態(tài),加入到可分配列表中,供后面分配使用;在任何時刻,一個文件系統(tǒng)分區(qū)中有且只有一個存儲塊被標(biāo)記為分配狀態(tài),在寫文件或者垃圾回收時,先找到當(dāng)前分配狀態(tài)的存儲塊,然后順序分配一個扇區(qū)進(jìn)行寫入,當(dāng)該存儲的所有扇區(qū)都寫完后,就要再在空閑狀態(tài)列表中找到一個塊作為當(dāng)前分配塊。
為了更有效地使用Flash的各個存儲塊,實現(xiàn)中使用yaffs_Block Info結(jié)構(gòu)來詳細(xì)地描述每個塊的使用情況:
在上述結(jié)構(gòu)中,sequenceNum是記錄在該分區(qū)內(nèi)此塊的使用順序,在文件系統(tǒng)分區(qū)中是全局遞增的,主要在垃圾回收算法中用于判斷數(shù)據(jù)有效性;deletion表示該塊內(nèi)被刪除的頁數(shù);needsRetiring指使用過程中讀寫或者擦除出錯,不能繼續(xù)被讀寫和使用。在YAFFS2文件系統(tǒng)中,NAND Flash每頁的OOB區(qū)域用來存儲文件和頁使用信息,如文件系統(tǒng)結(jié)構(gòu)信息包括頁號、文件號、有效數(shù)據(jù)字節(jié)數(shù)等,以及該頁全部數(shù)據(jù)的ECC校驗碼。比如頁大小為2 KB時,其具體每個頁的數(shù)據(jù)存儲布局如表1所示。
表1 數(shù)據(jù)存儲格式
2.2 文件表示與管理
從使用者的角度看,文件系統(tǒng)就是要實現(xiàn)文件的按名存取,即文件管理,其關(guān)鍵是文件的表示、組織和文件的索引、定位。文件的表示主要包括用于描述每個文件的各種屬性數(shù)據(jù)以及這些數(shù)據(jù)如何在設(shè)備上存儲,而文件的定位主要涉及到如何索引存儲該文件數(shù)據(jù)的所有頁。
在具體文件系統(tǒng)的實現(xiàn)中,文件的表示一般包括靜態(tài)存儲和動態(tài)操作的數(shù)據(jù),實現(xiàn)對文件的組織管理,其中在設(shè)備上靜態(tài)存儲的數(shù)據(jù)主要有3種:文件描述信息,包括名字、數(shù)據(jù)長度、存儲地址、創(chuàng)建者、訪問權(quán)限、使用情況等;文件內(nèi)容本身的數(shù)據(jù);存儲空閑空間統(tǒng)計信息。而在內(nèi)存中動態(tài)操作的數(shù)據(jù)管理信息主要有內(nèi)存文件描述信息、內(nèi)存文件系統(tǒng)分區(qū)信息等,在內(nèi)存中建立這些數(shù)據(jù)信息是為了提高文件系統(tǒng)運行的效率和文件系統(tǒng)的各種性能。Linux操作系統(tǒng)在上層統(tǒng)一在虛擬文件系統(tǒng)VFS實現(xiàn)統(tǒng)一的接口,各個具體文件系統(tǒng)實現(xiàn)VFS定義的各個接口。在VFS層用struct inode統(tǒng)一描述各種文件系統(tǒng)中的文件,該結(jié)構(gòu)定義了各種文件的一些共同屬性信息,還包括了各種具體文件系統(tǒng)用于描述文件的各自私有的屬性信息,如EXT4文件系統(tǒng)的ext4_inode結(jié)構(gòu)。
在YAFFS2文件系統(tǒng)中,F(xiàn)lash存儲器上并沒有定義和存儲這類信息,它是通過在文件系統(tǒng)加載時掃描文件系統(tǒng)分區(qū),然后為設(shè)備上每個文件分別建立文件描述信息,即yaffs_Object結(jié)構(gòu)。在YAFFS2文件系統(tǒng)中,每個文件都用一個頁來存儲所有屬性信息,如名字、文件號、大小、父目錄的文件號、創(chuàng)建時間和用戶等,其描述結(jié)構(gòu)為yaffs_ObjectHeader,該對象主要是根據(jù)文件頭數(shù)據(jù)而創(chuàng)建的,當(dāng)掃描某個頁時,先讀取該頁的OOB的標(biāo)志,從而判斷該頁數(shù)據(jù)是一個文件頭,如果是,就在內(nèi)存中新建一個文件對象,再在后面的讀取過程中將該文件數(shù)據(jù)所在頁號記錄到其variant域中,后面定位文件數(shù)據(jù)時會使用該對象[8]。NAND Flash每頁的OOB中存放的文件定位信息是用yaffs_PackdTags2Part結(jié)構(gòu)描述的,其具體組織如下:
其中,objectId用于唯一標(biāo)識該文件的文件號;chunKId表示文件的數(shù)據(jù)頁號。從這2個ID就知道文件系統(tǒng)分區(qū)中各個頁與各個文件的一一對應(yīng)關(guān)系。YAFFS2文件系統(tǒng)中定義了文件樹來記錄各個文件的各個設(shè)備頁號,其文件樹的結(jié)構(gòu)如圖1所示。
圖1 YAFFS2文件樹
文件樹的最底層存放屬于該文件的所有設(shè)備頁號,是16維數(shù)組,而其他層都是8維,存放下層的指針,每個文件需要的層數(shù)根據(jù)文件所占的頁數(shù)確定。例如:若文件的數(shù)據(jù)扇區(qū)數(shù)少于16×8個,則總共只需2層便可。其結(jié)構(gòu)定義如下:
在進(jìn)行文件數(shù)據(jù)讀寫時,根據(jù)文件名字找到文件對象yaffs_Object,然后得到文件樹結(jié)構(gòu)域variant,這樣就知道了該文件數(shù)據(jù)存放在Flash上的所有頁號,然后調(diào)用底層驅(qū)動讀寫頁內(nèi)的數(shù)據(jù),在寫文件時,還要將新的扇區(qū)號更新到文件樹結(jié)構(gòu)中。
YAFFS2是針對NAND Flash專門設(shè)計的文件系統(tǒng),它必須使用NAND Flash每頁的OOB區(qū)存儲文件系統(tǒng)信息,而NOR Flash、MMC卡等Flash存儲器上并沒有OOB區(qū),所以,YAFFS2不能在NOR Flash等上使用OOB區(qū)實現(xiàn)存儲器管理和文件管理;其次YAFFS2文件系統(tǒng)加載過程中需要讀文件系統(tǒng)分區(qū)每頁的OOB數(shù)據(jù),會導(dǎo)致加載時間隨NAND變大而加長。
針對這2個問題,本文設(shè)計了一種新的文件節(jié)點存儲方式,將文件系統(tǒng)信息存放到Flash頁內(nèi),使得文件系統(tǒng)能正常運行于NAND Flash,NOR Flash, MMC卡等Flash存儲器。
3.1 文件屬性信息的存儲方式
如前文所述,YAFFS2文件系統(tǒng)信息存放在NAND Flash上的OOB區(qū)域,其描述結(jié)構(gòu)為yaffs_ PackdTags2Part,改進(jìn)后使用下述的fat結(jié)構(gòu)描述,并且將每個塊內(nèi)的fat結(jié)構(gòu)統(tǒng)一存放在塊的前面2個數(shù)據(jù)頁中,而不再存放在OOB區(qū)內(nèi)。這樣在文件系統(tǒng)加載時,只要讀取每個塊的前2個頁的數(shù)據(jù),減少了加載時間。
該數(shù)據(jù)結(jié)構(gòu)中的inodeId用于唯一標(biāo)識分區(qū)內(nèi)某個文件的ID,serialNum在斷電保護(hù)實現(xiàn)中用于標(biāo)識數(shù)據(jù)存儲的先后順序,chunKIn Inode表示文件數(shù)據(jù)的第n個扇區(qū)號,chunKInFlash表示存儲位置即頁號。從中可以看出,每個fat對象的大小是4 Byte,加載文件系統(tǒng)時,通過讀取各個存儲塊起始處的fat對象,就可以知道每個扇區(qū)的數(shù)據(jù)所對應(yīng)的文件信息,為每個文件建立一個文件樹成員,用于記錄該文件數(shù)據(jù)的所有扇區(qū)。與YAFFS2原有的存儲方式相比較,重復(fù)存放在每個扇區(qū)的OOB區(qū)域的序列號和字節(jié)數(shù)信息就不再需要了,因為序列號是描述整個存儲塊的,每個存儲塊只需要記錄一次。而原有的字節(jié)數(shù)是用于記錄某個文件的最后一個扇區(qū)數(shù)據(jù)的字節(jié)數(shù),不適合存儲在每個扇區(qū)的OOB區(qū)域中,所以這個可以被優(yōu)化處理,改進(jìn)后在yaffs_Object結(jié)構(gòu)中增加描述信息,記錄存放某個文件的最有一個扇區(qū)的有效數(shù)據(jù)的字節(jié)數(shù)。如圖2描述了改進(jìn)后的Flash存儲器的每個塊存儲的數(shù)據(jù)信息,第1個頁存放的是序列號和該存儲塊的所有fat信息,其余各頁是數(shù)據(jù)區(qū),存儲文件內(nèi)容或文件屬性,而fat結(jié)構(gòu)包含了所有頁到文件的索引信息。
圖2 Flash存儲塊
當(dāng)需要分配空閑塊存儲數(shù)據(jù)時,將文件系統(tǒng)當(dāng)前的序列號加1,記錄到新分配的空閑塊的開始4 Byte,設(shè)置該塊為分配狀態(tài),第一個頁被用作存儲fat索引信息,從第2個頁開始可以用于存儲文件數(shù)據(jù),分配和寫入必須嚴(yán)格按照順序,當(dāng)文件系統(tǒng)將某文件的數(shù)據(jù)寫入到某個頁時,同時要構(gòu)造好相應(yīng)的fat索引結(jié)構(gòu),寫入第1個頁的相應(yīng)位置。在實現(xiàn)中yaffs_AllocChunK()用于分配存儲頁,在該分配算法中,首先從當(dāng)前分配狀態(tài)塊中分配頁,若全部已分配,就從分區(qū)的空閑列表中找到一個空閑塊,繼續(xù)上述過程。在使用過一段時間后,系統(tǒng)中所有的空閑狀態(tài)的塊都是由垃圾回收而來的,所以合適的磨損平衡和垃圾回收策略[9]可以以類似的概率處理分區(qū)中的各個存儲塊,從而均衡地使用各個存儲塊,這樣各存儲塊的扇區(qū)的擦寫次數(shù)均勻,能有效地延長存儲器的壽命。
3.2 文件系統(tǒng)的加載過程
改進(jìn)后,加載某個文件系統(tǒng)分區(qū)時,其主要操作分2個步驟:首先,依次讀每個存儲塊開始處的序列號,其有效值范圍為0x1000-0xefffff00,還有一些特殊的值用于標(biāo)記特殊狀態(tài)的塊。序列號在斷電保護(hù)和垃圾回收過程中都會被用到;然后,將分區(qū)內(nèi)的所有存儲塊以其相應(yīng)的序列號進(jìn)行排序,依次讀取其數(shù)據(jù)并進(jìn)行分析處理,其主要流程如圖3所示。
圖3 初始化加載流程
每個存儲塊的第1個頁存儲了該塊所有頁的fat結(jié)構(gòu),每個fat實例是相應(yīng)存儲頁的索引信息,包含了其所屬文件信息,文件序列號等,當(dāng)某個fat對象中的文件頁號為0時,標(biāo)識該fat索引的存儲頁存儲的是該文件的文件頭,獲得相應(yīng)的存儲頁號,調(diào)用驅(qū)動讀取文件頭信息,使用該文件頭構(gòu)造完整的文件屬性信息。當(dāng)文件頁號為其他值時,則表明其索引的存儲頁存放的是文件數(shù)據(jù),記錄該頁號到文件的索引樹中,用于后面對文件數(shù)據(jù)的讀寫操作。當(dāng)所有的存儲塊處理完之后,文件系統(tǒng)的加載過程就基本完成了,分區(qū)上所有文件和目錄的信息都被完整的建立了,后面通過文件系統(tǒng)提供的接口對文件的讀、寫與管理等操作是基于這些信息實現(xiàn)的。
3.3 斷電保護(hù)機(jī)制
便攜式電子設(shè)備使用過程中,如果突然斷電,且此時有應(yīng)用在進(jìn)行文件的更新,就可能導(dǎo)致操作中止,文件系統(tǒng)信息由于沒有同步地進(jìn)行更新而不完整,進(jìn)而導(dǎo)致重啟系統(tǒng)加載分區(qū)時失敗。
所以,YAFFS2文件系統(tǒng)在實現(xiàn)各種文件操作時,就要考慮到各種文件操作的原子性,其實現(xiàn)方法主要就是存儲一些冗余信息保證文件系統(tǒng)的完整性。例如,在實現(xiàn)文件刪除操作時,為每個分區(qū)定義一個delete目錄,當(dāng)刪除某個文件時,僅修改目錄樹結(jié)構(gòu),使該文件掛在該目錄下;當(dāng)需要更新文件的目錄信息和文件數(shù)據(jù)時,只是將新的數(shù)據(jù)寫入一個新的頁,然后將原有數(shù)據(jù)頁的OOB的標(biāo)志位設(shè)置為無效。在更新文件數(shù)據(jù)時,會同時更新頁的數(shù)據(jù)區(qū)和OOB區(qū),若在這個過程中任何時候斷電,就會導(dǎo)致最后寫入的OOB區(qū)域數(shù)據(jù)不完整,該寫入操作就不會破壞分區(qū)數(shù)據(jù)的完整性,下次加載時,原有數(shù)據(jù)會被作為有效數(shù)據(jù)處理,不完整的新數(shù)據(jù)會被當(dāng)作無效數(shù)據(jù)頁被丟棄掉。
改進(jìn)后,當(dāng)要改變文件的目錄樹結(jié)構(gòu)時,會為該文件寫入新的文件頭,其中包含了該文件新的父目錄的ID等目錄結(jié)構(gòu)信息,在寫入時,并不是更新原有的數(shù)據(jù)頁,而是寫入一個新的數(shù)據(jù)頁,由于寫任何數(shù)據(jù)頁都需要構(gòu)造fat索引結(jié)構(gòu),并將該索引結(jié)構(gòu)寫入同一個存儲塊的第1頁,這樣就存在2個寫操作,且一個是寫入第1頁,一個是寫入另外一個頁,當(dāng)在這2個頁的寫操作中間意外斷電時,重啟后加載文件系統(tǒng)時,會發(fā)現(xiàn)2個存儲頁包含相同相同的文件頭信息。所以必須進(jìn)行特別的處理來保證斷電保護(hù)性能,在實現(xiàn)中,為了能從這2個沖突的存儲頁中區(qū)分開來,就需要用到上述的每個fat結(jié)構(gòu)中的序列號和每個存儲塊起始處的序列號,其設(shè)計原理如圖4所示。當(dāng)需要將某存儲塊中比較新的數(shù)據(jù)寫入新的存儲頁時,就將相應(yīng)的fat結(jié)構(gòu)中的序列號遞增,并隨之寫進(jìn)存儲塊中,若這時意外斷電,就可以根據(jù)兩個存儲頁對應(yīng)的fat結(jié)構(gòu)中的序列號來判斷哪個是原有數(shù)據(jù),哪個是新的數(shù)據(jù),從而保證文件系統(tǒng)的完整性;如果只是更新數(shù)據(jù)頁,fat結(jié)構(gòu)中的序列號不用遞增,因為即使意外斷電,重啟加載時,根據(jù)存儲塊的序列號就可以知道哪個是最后寫入的有效存儲頁,哪個是舊的需要更新的數(shù)據(jù)頁,這是因為每個存儲塊的序列號代表了其上面存儲的文件的先后順序,它是文件系統(tǒng)在分配塊時計算并寫入的。
圖4 斷電保護(hù)原理
3.4 垃圾回收策略
使用過程中,修改文件內(nèi)容、刪除文件會使得Flash存儲塊的部分扇區(qū)不再包含有效的數(shù)據(jù),F(xiàn)lash存儲器的特性決定了這些區(qū)域在整個塊被擦除之前不可重寫,將這些扇區(qū)所在的塊內(nèi)的有效數(shù)據(jù)重新存儲然后擦除該塊,并將其再次作為空閑塊,這個過程便稱為垃圾回收。
在現(xiàn)有YAFFS2文件系統(tǒng)的垃圾回收處理過程中,當(dāng)文件系統(tǒng)需要向Flash存儲器中寫入數(shù)據(jù)時,先檢查分區(qū)內(nèi)的空閑擦除塊的個數(shù),若低于設(shè)定的文件系統(tǒng)的保留值,便啟動垃圾回收線程,調(diào)用垃圾回收處理函數(shù)找出無效數(shù)據(jù)頁最多的存儲塊,然后將該存儲塊內(nèi)的所有有效數(shù)據(jù)寫入當(dāng)前正在使用的塊,最后調(diào)用驅(qū)動將該存儲塊擦除,供以后分配使用[10]。
在改進(jìn)后的垃圾回收處理過程中,垃圾回收操作的實現(xiàn)是用一個線程Garbage Collection線程實現(xiàn)的,并將它放入一個信號量的等待隊列中,或當(dāng)需要向設(shè)備寫數(shù)據(jù)時,或者每隔一段設(shè)置好的時間,去喚醒該線程。該線程首先統(tǒng)計分區(qū)內(nèi)空閑存儲塊的數(shù)量,決定是否要啟動回收處理,如果空閑塊數(shù)少于預(yù)設(shè)的保留塊數(shù),則從分區(qū)的處于使用狀態(tài)的列表中找出無效數(shù)據(jù)最多的存儲塊,并進(jìn)行回收,否則從整個分區(qū)中找到最臟塊進(jìn)行回收。
回收的主要過程如圖5所示,回收過程中找最臟塊的2個策略包括無效數(shù)據(jù)扇區(qū)最多和序列號最小,即效率原則和均衡原則結(jié)合使用,達(dá)到存儲塊的均衡使用。從圖5中可以看出,主要根據(jù)每個存儲塊開始4 Byte序列號知道存儲塊的使用順序,序列號越大表明越早被使用,從而垃圾回收處理應(yīng)該越早地回收該存儲塊,不會導(dǎo)致某個塊對應(yīng)的文件數(shù)據(jù)被頻繁的更改而重復(fù)擦寫,一定程度上保證了存儲塊的均衡使用。當(dāng)回收某個臟塊時,將該存儲塊中所有有效數(shù)據(jù)讀出,復(fù)制到分區(qū)的分配存儲塊,對于每個扇區(qū)數(shù)據(jù)都要構(gòu)造相應(yīng)的fat索引結(jié)構(gòu),如文件頁號、Flash頁號等,并將其順序地寫入相應(yīng)存儲塊的第一個頁,這樣就完成了數(shù)據(jù)的復(fù)制。最后將原來的臟塊加入回收列表,觸發(fā)驅(qū)動的擦除操作,將整個塊擦除,并標(biāo)記該塊為空閑塊,加入到分區(qū)的空閑列表,供后面分配使用。
圖5 垃圾回收算法
下面基于一款數(shù)字電視平臺對文件系統(tǒng)的安裝時間,讀寫速度和損耗平衡性能進(jìn)行測試和分析,該硬件平臺同時支持NAND、NOR存儲器并有MMC控制器支持MMC卡,由于它們的存儲空間不同,在下面的測試中統(tǒng)一格式化一個8 MB的分區(qū),并進(jìn)行相應(yīng)測試。
4.1 文件系統(tǒng)加載時間
YAFFS2文件系統(tǒng)分區(qū)加載時,讀取每個存儲塊的狀態(tài)信息,然后根據(jù)其狀態(tài)分別讀取文件系統(tǒng)信息,對于原有的YAFFS2,是通過讀存儲塊的每個頁的OOB區(qū)域,而改進(jìn)后的YAFFS2只是讀取每個存儲塊的第一個頁,它包含了當(dāng)前塊所有頁的索引fat結(jié)構(gòu)。在測試過程中,選擇一些隨機(jī)文件做一個YAFFS2鏡像文件,通過各自的格式化工具寫到存儲分區(qū)上,然后加載相應(yīng)的分區(qū),對于NOR Flash和MMC卡,分別采用各自的格式化工具格式化為JFFS2和FAT32文件系統(tǒng)[11]。
測試的加載時間如表2所示,從中可以看出,對于NAND分區(qū),改進(jìn)后的安裝時間減少約25%;對于NOR分區(qū),加載時間明顯減少,這是因為JFFS2文件系統(tǒng)加載時需要以字節(jié)為單位掃描解析每個存儲頁,是JFFS2的主要缺點;而對于MMC分區(qū),F(xiàn)AT32只需要讀取fat表就完成加載,所以時間明顯減少。
表2 分區(qū)加載時間 s
4.2 文件讀寫速度
安裝文件系統(tǒng)后,分別進(jìn)行文件讀、寫、刪除操作的性能測試,其中讀速度是通過將文件拷貝到系統(tǒng)的tmpfs分區(qū)得到的,寫速度是通過將文件從tmpfs分區(qū)寫入YAFFS2分區(qū)。讀寫tmpfs分區(qū)的時間可以忽略,所以測試數(shù)據(jù)基本等于文件的讀寫速度。
測試時使用tim e命令來記錄讀寫100 KB文件的時間,改進(jìn)前后的YAFFS2測試結(jié)果如表3和表4所示。
表3 改進(jìn)前文件存取時間 s
表4 改進(jìn)后文件存取時間 s
測試結(jié)果表明,對于NAND存儲器,改進(jìn)前后文件的讀寫速度差別很小,而NOR,MMC卡的讀寫速度與NAND的差別大。這是因為文件讀寫速度主要由存儲器驅(qū)動的讀寫速度決定,這些存儲器的讀寫速度差別大,對于文件刪除操作,其速度相似是由于在實現(xiàn)刪除操作時,只是在文件系統(tǒng)信息中做一些標(biāo)志的更新,不需要同步寫入存儲器,所以其速度快,即使文件大小不同,其刪除速度也較為接近。
4.3 損耗平衡性能
由于Flash存儲器的每個塊的擦除次數(shù)是有限的,因此應(yīng)可能地均衡擦除分區(qū)的每個存儲塊,延長存儲器的整體使用壽命。為了統(tǒng)計每個存儲塊的擦除次數(shù),使用一個全局列表來記錄每個塊的擦除次數(shù),并在驅(qū)動的擦除操作中更新該列表,當(dāng)擦除某個塊時,就將相應(yīng)的計數(shù)遞增。然后,通過文件拷貝和刪除命令,對測試分區(qū)上的文件進(jìn)行大量的改寫操作,并做一些壓力測試。最后統(tǒng)計得出各存儲塊的擦除次數(shù)分布,實際測試結(jié)果表明,分區(qū)上的各存儲塊被均衡地使用,垃圾回收操作的2個回收策略達(dá)到了預(yù)期的效果。
本文從Flash存儲器管理、文件的創(chuàng)建和讀寫的實現(xiàn)分析YAFFS2文件系統(tǒng)的設(shè)計原理,提出一種新的存儲方式,分別從文件系統(tǒng)安裝過程、垃圾回收、掉電保護(hù)機(jī)制方面對YAFFS2進(jìn)行改進(jìn),并設(shè)計文件系統(tǒng)鏡像格式化工具。在系統(tǒng)平臺上進(jìn)行了安裝時間、讀寫速度和損耗平衡性能的測試,結(jié)果表明改進(jìn)的文件系統(tǒng)安裝時間有所減少,并能使Flash各存儲扇區(qū)被均衡使用。但由于各種Flash存儲器每個塊的存儲頁數(shù)差別較大,可能會導(dǎo)致fat結(jié)構(gòu)未必能全部存儲在首頁,因此下一步將針對一些特殊的Flash存儲器要求改進(jìn)fat結(jié)構(gòu),使其具有更廣泛的適用性。
[1] W okey.YAFFS NAND Flash Filesystem[EB/OL].(2007-03-05).http://www.aleph1.co.uk/yaffs/.
[2] A leph One Ltd..Yaffs2 Specification[EB/OL].(2007-06-08).http://www.yaffs.net/yaffs-2-specification.
[3] 毛德操,胡希明.Linux內(nèi)核源代碼情景分析[M].杭州:浙江大學(xué)出版社,2001.
[4] 郭玉東.Linux操作系統(tǒng)結(jié)構(gòu)分析[M].西安:西安電子科技大學(xué)出版社,2004.
[5] Manning C.Flash File System Considerations[EB/OL].(2009-02-03).http://www.yaffs.net/sites/yaffs.net.
[6] 陳莉君.Linux操作系統(tǒng)內(nèi)核分析[M].北京:人民郵電出版社,2003.
[7] Manning C.How YAFFSWorks[EB/OL].(2010-09-05). http://www.yaffs.net/sites/yaffs.net/files/How Yaffs W orks.pdf.
[8] Hoog A.Android YAFFS2 Support[EB/OL].(2014-10-08). http://www.basistech.com/wp-content/uploads/2014/04.
[9] Zimmermann C.Forensic Analysis of YAFFS2[EB/OL].(2012-04-09).http://aleph1.co.uk/gitweb?p=yaffs2.git.
[10] Pooters I.Yaffs Object Header[EB/OL].(2010-06-08). http://sandbox.dfrws.org/2011/fox-it/DFRWS2011_results/ Report.
[11] 宋 聿,蔣烈輝,董衛(wèi)宇,等.一種獨立式I/O虛擬化方法研究[J].計算機(jī)工程,2014,40(10):81-85.
編輯 金胡考
Research and ImProvement of YAFFS2 File System Based on Em bedded Linux
ZHU Shaoying,ZHA Qipeng
(The 32nd Research Institute of China Electronics Technology Group Corporation,Shanghai 200233,China)
YAFFS2 file system is NAND Flash only file system.This paper analyzes the design principle of YAFFS2 based on embedded Linux in two aspects of Flash storage and filemanagement.Aiming at two limitations of long mount time and applicable only on NAND Flash,it proposes a new layout of file system key data and structure,and improves YAFFS2 in aspects of storage management,file system initialization,garbage collection and power off protection to reduce mount time and to make it applicable on other Flash.Test result show s that it can reducemount time by 25%and balance erasure of every block as expected.
YAFFS2 file system;NAND Flash;embedded Linux system;garbage collection strategy;wear-leveling
朱紹英,查啟鵬.基于嵌入式Linux的YAFFS2文件系統(tǒng)研究與改進(jìn)[J].計算機(jī)工程,2015,41(9):292-297,302.
英文引用格式:Zhu Shaoying,Zha Qipeng.Research and Improvement of YAFFS2 File System Based on Embedded Linux[J].Computer Engineering,2015,41(9):292-297,302.
1000-3428(2015)09-0292-06
A
TP391
10.3969/j.issn.1000-3428.2015.09.054
朱紹英(1983-),女,工程師,主研方向:嵌入式Linux系統(tǒng);查啟鵬,工程師。
2015-04-07
2015-05-19 E-m ail:zhushaoying181@163.com