JFFS是由瑞典的Axis Communications Ab公司開發的(1999,以GNU發布),針對flash設備的特性為嵌入式設備開發的
JFFS1和JFFS2的設計中都考慮到了FLASH的特性特別是滿足了上述3個條件,包括了垃圾回收,壞塊管理等功能. 這兩種文件系統屬于LFS(Log-structured File System).這種文件系統的特點是一旦數據出錯,容易恢復,但是系統運行是需要占用一定的內存空間,這些空間就是用來存儲”log”的.
JFFS的缺點就是加載時間太長,因為每次加載都需要將FLASH上的所有節點(JFFS的存儲單位)到內存,這樣也占用了可觀的內存空間.除此之外,”circle log”設計使得在對文件數據進行所有的數據都會被重寫,這樣造成不必要的時間,同時也會減少FLASH的壽命.
JFFS2對JFFS1作了些改進,比如所需的內存變少了,垃圾回收機制也優化了.
針對JFFS1,JFFS2的缺點,JFFS3出現了.
YAFFS1 & YAFFS2
“Yet Another Flash File System”作者是新西蘭的Charles Manning為一家名叫Alpha one 的公司(http://www.aleph1.co.uk/)設計的,是第一個為NAND Flash設計的文件系統.共兩個版本YAFFS1 和YAFFS2.
YAFFS1支持512Bytes/Page的NAND Flash;后者YAFFS2支持2kBytes/Page的NAND Flash. YAFFS文件系統也屬于LFS.
跟其他文件系統比較,它具有更好的可移植性,甚至可以使用在沒有操作系統的設備上(called “YAFFS/Direct”). YAFFS采用模塊化設計,雖然最初是用在linux系統上的,但是也已經移植到其他系統比如wince.
還有個突出的優點是它在mount的時候需要很少的內存.(如果是小頁―512byte/page,每1MByte NAND大約需要4KBytes內存;大頁需要大概1KBytes RAM/1MByte NAND)
JFFS與YAFFS比較,兩者各有長處. 一般來說,對于小于64MBytes的NAND Flash,可以選用JFFS;如果超過64MBytes,用YAFFS比較合適.
由于嵌入式系統自身存在一些特殊要求,使得一些傳統的文件系統(如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作為用戶文件系統,在保證用戶可以自由讀寫文件的基礎上,提高了文件系統的安全性和運行速度,不失為一種優良的嵌入式文件系統解決方案。
?
評論
查看更多