Cramfs、JFFS2、YAFFS2區別

由於嵌入式系統自身存在一些特殊要求,使得一些傳統的文件系統(如FAT、EXT2等) 並不十分適合。專用的嵌入式文件系統應有一些自身的特性,如文件系統面對的儲存介質特殊性、文件系統應具有的跨平臺的安全性,以及整個系統的即時性等。本文介紹了3種源碼開放的嵌入式文件系統Cramfs、JFFS2、YAFFS2,詳細分析比較了這3種文件系統的主要性能,並根據分析結果指出了各自的適用領域。
Cramfs、JFFS2、YAFFS2是3種性能優越,專用於嵌入式系統的文件系統。本文通過對這3種文件系統的設計原理和主要性能進行分析與比較,歸納出各自的選型依據據和適用領域。

三種文件系統的介紹

  • Cramfs
    Cramfs是Linux的創始人Linus Torvalds開發的一種只讀文件系統,採用了zlib壓縮,壓縮比一般可以達到1:2,但仍可以做到高效的隨機讀取。在Linux系統中,通常把不需要經常修改的目錄壓縮存放,在系統引導時再將壓縮文件解開。Cramfs並不需要一次性地把文件系統的所有內容都解壓到記憶體中,而只是在系統需要訪問某個位置的資料時,馬上計算出該資料在Cramfs中的位置,將其解壓縮到記憶體之中,然後通過對記憶體的訪問來獲取需要讀取的資料。

  • JFFS2
    JFFS意爲「Journaling Flash File System」,該文件系統是瑞典Axis通信公司開發的一種基於Flash記憶體的日誌文件系統。該公司於1999年在GNU/Linux上發行了第一版JFFS文件系統,後來經過Redhat公司的發展,現在已經發行了第二個版本的JFFS2,其全部程式碼都是可供研究開發的。它在設計時充分考慮了嵌入式系統中Flash記憶體的讀寫特性,確保在系統掉電時,正在讀寫的文件不受影響;同時,其儲存策略以及抗疲勞性等方面也在第一版的基礎上進行了改進。目前,JFFS2廣泛應用於嵌入式系統中,尤其是嵌入式μClinux作業系統中。

  • YAFFS2
    YAFFS意爲「Yet Another Flash File System」,是目前唯一一個專門爲NAND Flash設計的文件系統。它採用了類日誌結構,結合NAND Flash的特點,提供了損耗平衡和掉電保護機制,可以有效地避免意外掉電對文件系統一致性和完整性的影響。Aleph One公司於2002年5月發佈了第一版YAFFS程式碼,用戶可以很方便地在網站上下載到。第一版的YAFFS只支援每頁512位元組的NAND Flash。YAFFS2是YAFFS的升級版,即支援每頁512位元組的NAND Flash記憶體,也支援每頁2048位元組的NAND Flash記憶體。

Flash記憶體
Flash設備特點:
相對於傳統儲存介質,Flash記憶體具有如下優點:

  • 可靠性高,採用Flash爲儲存介質,可以確保100萬次以上的可靠寫入;
  • 儲存速度快,寫入∕讀取均可接近1Mb/ s;
  • 使用方便,具有很強的環境適應能力。

但是,由於其製造製程的問題,還存在以下缺點:

  • 讀取和寫入以頁爲單位,擦除以塊爲單位;
  • 易出現隨機壞塊;
  • 塊與塊之間使用不均衡會導致壽命問題。

NOR Flash和NAND Flash
基於NOR技術的Flash記憶體是最早出現的Flash記憶體,它具有以下特點:

  • 程序和資料可存放在同一晶片上,擁有獨立的資料匯流排和位址匯流排,支援快速隨機讀取,允許系統直接從Flash中讀取程式碼並執行,而無需先將程式碼下載至RAM中再執行;
  • 可以單位元組或單字程式化,但必須以塊爲單位進行擦除操作。

由於NOR Flash記憶體的擦除和程式化速度較慢,而塊尺寸又比較大,因此擦除和程式化操作所花費的時間很長。目前,NOR Flash記憶體大多隻用於儲存嵌入式系統的啓動程式碼。

NAND Flash記憶體可以順序讀取儲存單元的內容,由於製程上的進步,其容量越來越大,單位價格越來越便宜,正逐步成爲Flash記憶體的主流。NAND Flash記憶體具有以下特點:

  • 以頁爲單位進行讀寫操作,以塊爲單位進行擦除操作;頁大小爲512位元組或2048位元組,每頁不僅有
    資料區,還有幾十位元組的空閒區。
  • 資料、位址採用同一匯流排界面,串列讀取。
  • 晶片尺寸小,接腳少,單位成本低。
  • 晶片內含有失效塊,並且在使用過程中可能會出現隨機壞塊。

表1 比較了這兩種Flash記憶體的性能參數】
在這裏插入圖片描述
三種嵌入式文件系統主要性能分析與比較
資料安全、運行速度、佔用資源、使用範圍等是嵌入式文件系統的主要性能指標。下面從這幾個方面入手,對這三種嵌入式文件系統進行分析與比較。

資料安全:
        當前的嵌入式系統主要使用固態Flash晶片作爲儲存設備。由於Flash設備自身的特點以及嵌入式系統工作環境的複雜多樣性,如何保證資料的安全是嵌入式文件系統首先要考慮的問題。資料安全主要包括資料冗餘和掉電保護等部分。

資料冗餘
提高資料安全性的最有效措施是增加資料的冗餘,而資料的大量冗餘又給維護資料一致性帶來困難。對此應進行合理取捨,在儘量降低冗餘的前提下,確保資料的安全性和可靠性。

  • Cramfs文件系統是一種只讀文件系統,文件系統內容不可更改,設計思想遵循「只儲存最少的信息」;甚至沒有時間戳之類的信息,除了資料包的CRC校驗信息外,幾乎沒有別的資料冗餘。
  • JFFS2文件系統是典型的日誌結構的文件系統,它儲存的資料是日誌式資料信息。JFFS2在Flash上​​只有兩種類型的資料實體:j.ffs2_raw_inode和jffs2_raw dirent。前者包含文件的管理信息,後者用於描述文件在文件系統中的位置。真正的資料信息就保持在jffs2_raw_inode節點的後面,大部分管理的信息都是在系統掛載之後建立起來的。兩種資料實體有着公共的文件頭結構jffs2 _ unknown_node。在這個結構裏,有個jint32 _t類型的hdr_crc變量,它代表文件頭部中其他域的CRC校驗值。這說明JFFS2文件系統使用的是CRC循環冗餘校驗碼。
  • YAFFS2文件系統是一種類日誌文件系統,專用於NAND型Flash設備。其儲存資料的基本單位是chunk,相當於Flash的頁。Chunk中的資料包括兩部分:一部分是資料區,佔用Flash的一頁;另一部分是文件信息及冗餘資料區,佔用Flash頁的OOB區。其冗餘資料主要是ECC校驗資料,對於小頁(每頁512位元組)的Flash,每頁有6位元組的ECC資料;對於大頁(每頁2048位元組)的Flash,每頁有24位元組的ECC資料。

掉電保護
掉電保護的目的是:在系統意外失去供電的情況下,保證系統運行狀態的確定性以及記錄資料的完整性;當系統供電恢復後,現場資料可以及時恢復,避免系統產生混亂。很多文件系統出於運行速度考慮,在程序運行過程中,常將資料暫存在SDRAM中;一旦系統意外掉電,往往會造成資料丟失。

  • Cramfs文件系統將文件系統內容解壓到記憶體中,由於其不能寫入,文件系統的內容無法更改,因此不存在掉電保護的問題。
  • JFFS2是一種日誌結構文件系統,因此不論電源以何種方式在哪個時刻停止供電,JFFS2都能保持資料完整性。當系統遭受不正常斷電後重新啓動時,JFFS2自動將系統恢復到斷電前最後一個穩定狀態。需要注意的是,文件系統在最後一個穩定狀態之後發生的任何改變,都無法進行恢復。
  • YAFFS2是一種類日誌文件系統,可以在意外掉電重啓後自動提供可靠的資料記錄,防止文件系統的崩潰。它使用獨立的日誌文件跟蹤文件系統內容的變化。舉例來說:當應用程式需要寫Flash的某一頁時,它首先修改的是存放於文件日誌中的一塊鏡像;只有當日志中的鏡像複製到文件系統中後,資料才真實地寫到該頁上。當發生意外掉電重啓後,YAFFS2沒有像JFFS2那樣,使用舊文件完全代替新寫文件,而是選擇用新文件完全代替舊的文件,或者已寫部分使用新文件,未寫部分使用舊文件。這種方式增強了掉電時未完全寫入文件的安全性能,特別是當意外掉電發生在資料區時,意外掉電時的文件幾乎被完好地保存下來。

運行速度
        運行速度可以從以下幾個方面考察:文件系統掛載速度,讀文件速度,寫文件速度等。這裏預設的儲存介質是NAND Flash。

        一般而言,壓縮的、只讀的文件系統在啓動時需要將文件系統解壓到SDRAM中,這在一定程度上會減緩文件系統掛載速度。但是,Cramfs文件系統在設計時充分考慮了系統掛載的時間,並沒有一次性地把文件系統的所有內容都解壓到記憶體中,而只是在系統需要訪問某個位置的資料時,迅速計算出該資料在Cramfs中的位置,將其解壓縮到記憶體之中,再進行訪問操作。由於其讀文件速度只是找出文件位址以及訪問記憶體的操作,所以無論是掛載速度,還是讀文件速度, Cramfs文件系統都比JFFS2和YAFFS2文件系統要快。

JFFS2文件系統的掛載可以分爲以下幾個步驟進行:
        1.檢查每個節點CRC校驗碼的合法性,在記憶體中爲每個節點每個節點分配必需的相關的結構;
        2.掃瞄每個i節點的物理節點鏈表,建立鏈接;
        3.釋放掃瞄過程中使用的臨時信息。
        可以看出這個過程還是很複雜的,更重要的是,在JFFS2文件系統被掛載時,需要對整個Flash儲存區域進行掃瞄,這就耗費了大量的時間,因此JFFS2文件系統的開機速度非常緩慢。與JFFS2相比,YAFFS2減少了一些功能,掛載時只需掃瞄Flash記憶體的空閒區,根據從OOB(備份資料區)中讀取的yaffs_tags信息判讀是文件頭頁面還是資料頁面,再根據相應信息在記憶體中爲每個文件建立一個對​​應的yaffs_object對象。由於YAFFS2在系統載入時只需掃瞄各個頁面的OOB區,即可建立起整個文件系統的結構,而不需要像JFFS2那樣掃瞄整個Flash設備,因此大大加快了文件系統的啓動速度。但是,YAFFS2仍然要求對整個Flash設備所有頁的空閒進行掃瞄,這就導致當Flash設備儲存空間變大時,系統掃瞄時間會直線上升。
        在文件系統運行時,JFFS2需要維護幾個鏈表來管理擦寫塊。根據擦寫塊上的內容,一個擦寫塊可能會在不同的鏈表上。具體來說,當一個擦寫塊上都是合法(valid)的節點時,它會在clean_list上;當一個擦寫塊包含至少一個過時(obsolete)的節點時,它會在dirty_list上;當一個擦寫塊被擦寫完畢,並被寫入Cleanmarker節點後,它會在free_list上。正是以這些鏈表爲基礎, JFFS2文件系統纔可以實現垃圾回收、損耗平衡等性能。文件系統掛載時YAFFS2在記憶體中建立一個層次結構的索引,可以看作是一個文件樹。樹的最底層指向實際存放文件的頁面,高層則是一層層的索引目錄。文件樹是通過一個聯合結構的節點來實現的。聯合結構是固定大小(32位元組),當它處於最底層時, 由16個2位元組入口來查找頁面ID;當處於其它層時,由8個4位元組指針指向其他更低層的節點。每個文件對應一個文件樹,便於檢索。在以NAND Flash爲儲存介質的嵌入式系統中,YAFFS2的文件讀寫性能都優於JFFS2。

佔用資源
        在嵌入式系統中,記憶體和外部記憶體資源匱乏,需要節約使用。因此佔用的記憶體和外部記憶體資源量也是衡量嵌入式文件系統的一個重要指標。
        如果使用RAMDISK方式運行文件系統,那麼在系統運行之後,首先要把Flash上​​的映像文件解壓到記憶體中,纔可以開始運行程序。這樣,同樣的程式碼不僅在外部記憶體中佔據了空間,而且由於解壓縮,還在記憶體中佔用了更大的空間。Cramfs雖然是一個壓縮式的文件系統,但前面已介紹過,它並不需要一次性地將所有內容解壓到記憶體之中。由於其對文件內容的壓縮,因此無論是外部記憶體還是記憶體, Cramfs都比JFFS2和YAFFS2佔用更少的資源。
        JFFS2將文件系統的資料和原資料以節點的形式儲存在Flash上​​,其冗餘資料只是節點頭部的CRC校驗碼,並且在儲存時對節點的資料進行了壓縮。與之相比,YAFFS2不僅儲存了頁資料的ECC校驗碼,並且沒有Flash設備OOB區儲存資料,而是用來儲存頁節點信息。其映像也是由若干個頁面組成,沒有對資料進行壓縮,因此YAFFS2文件系統映像大大超過了JFFS2文件系統映像。實驗表明,普通YAFFS2映像的大小約爲同樣JFFS2映像大小的2倍。當文件系統在記憶體中運行時,JFFS2在記憶體中定義了若干鏈表,YAFFS2在記憶體中爲每個文件創建一個文件樹。儘管爲每個文件建立一個文件樹需要消耗掉不少的記憶體,但是比起維護JFFS2所需的鏈表消耗的記憶體,還是少一些。在實際運行中,YAFFS2佔用的記憶體要小於JFFS2文件系統。

使用範圍
        要使用Cramfs或JFFS2文件系統,離不開MTD驅動程式層的支援。MTD(Memory Technology Device)是Linux中的一個儲存設備通用界面層。雖然也可以建立在RAM上,但它是專爲基於Flash的設備而設計的。MTD包含特定Flash 晶片的驅動程式, Flash晶片驅動向上層提供讀、寫、擦除等基本的Flash操作方法。MTD對這些操作進行封裝後向用戶層提供MTD char和MTD block類型的設備。MTD char類型的設備包括/dev/mtd0等,可以對Flash的原始字元訪問;MTD block類型的設備包括/dev/mtdblock0等,將Flash類比成塊設備,這樣就可以在這些塊設備上創建Cramfs或JFFS2等格式的文件系統。在對用戶層的界面上, Cramfs或JFFS2文件系統還需要作業系統VFS(虛擬文件系統)的支援。 
        同樣,YAFFS2文件系統支援使用MTD驅 ​​動層和VFS層,這也是一般在嵌入式Linux或者μClinux作業系統中使用YAFFS2文件系統的常用方法。除此之外,YAFFS2還帶有NAND Flash晶片驅動,併爲嵌入式系統提供了直接訪問文件系統的API,用戶可以不使用Linux中的MTD和VFS,直接對文件進行操作。
圖1 爲嵌入式系統的文件系統結構】
在這裏插入圖片描述
        YAFFS2中的YAFFS2 Direct提供了直接的文件系統界面,因此在那些沒有VFS層的嵌入式系統中也可使用YAFFS2。YAFFS2文件系統的使用範圍要比Cramfs和JFFS2文件系統廣泛;但是需要注意的是,YAFFS2只能用在NAND Flash儲存設備上。

結論
        這3種嵌入式文件系統在嵌入式系統中的應用非常廣泛,但是又具有各自的特點。表2 比較了3種文件系統的主要性能,並歸納出各自最適用的領域。
在這裏插入圖片描述
具體分析如下:

  1. Cramfs是最早的一種嵌入式文件系統,它只儲存了最少的信息,對文件內容進行了壓縮,運行速度比較
    快。但是由於其不能寫入,不支援超過16 MB大小的文件,因此廣泛地應用於儲存空間小、文件系統內容
    較少並且不需要用戶寫入的嵌入式系統中。
  2. JFFS2是一種較早的Flash專用文件系統。目前已有很多JFFS2應用於μClinux以及嵌入式Linux的例子。事
    實上,它已經成爲新版Linux中的一種標準文件系統。
    同時它對NOR Flash和NAND Flash提供支援,針對兩種Flash設備共同的特性,提供掉電保護和損耗平衡等
    功能,可供用戶讀寫,十分適合於同時用到這兩種Flash設備的嵌入式系統。
  3. YAFFS2是專爲NAND Flash設計的文件系統,它充分考慮了NAND Flash設備的特性,支援ECC校驗,提
    供掉電保護和損耗平衡功能,運行和掛載速度都比JFFS2要快。它支援作業系統廣泛,包括常見的嵌入
    式Linux、WinCE、μClinux。由於它提供Direct界面,因此稍加修改也可使用在沒有作業系統的嵌入式
    系統中。目前,被廣泛應用於使用NAND Flash作爲儲存設備的嵌入式系統中。

針對具體應用,可以在考察各種文件系統特點的基礎上,選擇更適合自身系統的一種文件系統解決方案。比如在許多以NAND Flash爲儲存介質的應用系統中,都用到「Cramfs YAFFS2」文件系統。以Cramfs作爲根文件系統,既提高了啓動速度,也能保護根文件不受破壞;使用YAFFS2作爲用戶文件系統,在保證用戶可以自由讀寫文件的基礎上,提高了文件系統的安全性和運行速度,不失爲一種優良的嵌入式文件系統解決方案。

原創鏈接,感謝原創!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章