CRAMFS 與 YAFFS 簡介與區別

CRAMFS 與 YAFFS
[ 2009-3-28 8:18:00 | By: zcying ]
 

CRAMFS簡介

       CRAMFS文件系統是專門針對閃存設計的只讀壓縮的文件系統,其容量上限爲256M,採用zlib壓縮,文件系統類型可以是EXT2或EXT3.
  如果使用RAMDISK方式來使用文件系統,那麼在系統運行之後,首先得把flash上的映像文件全部解壓到ram中,構造ramdisk環境,纔可以運行程序,但有一個致命的弱點,在正常情下,同樣的代碼不僅在flash佔用了空間,而且還在ram中佔用極大的空間,這違背了嵌入式中節省資源的原則.
  cramfs文件系統並不需要一次性地將文件系統中的所有內容解壓到ram中,而只是是系統需要訪問某個位置的數據時,馬上計算出該數據在cramfs中的位置,將其解壓到ram中,然後通過內存訪問來獲取數據,cramfs中的解壓縮之後的內存中的數據存放位置都是由cramfs文件系統本身來管理,用戶並不需要實現過程,因此增加了透明度,給開發人員節約了時間.
  cramfs擁有以下一些特性:
  採用實時解壓縮方式,但解壓縮的時候有延遲。
  cramfs的數據都是經過處理、打包的,對其進先寫操作有一定困難。所以cramfs不支持寫操作,這個特性剛好適合嵌入式應用中使用Flash存儲文件系統的場合。
  在cramfs中,文件最大不能超過16MB。
  支持組標識(gid),但是mkcramfs只將gid的低8位保存下來,因此只有這8位是有效的。
  支持硬鏈接。但是cramfs並沒有完全處理好,硬鏈接的文件屬性中,鏈接數仍然爲1.
  cramfs的目錄中,沒有“.”和“..”這兩項。因此,cramfs中的目錄的鏈接數通常也僅有一個。
  cramfs中,不會保存文件的時間戳(timestamps)信息。當然,正在使用的文件由於inode保存在內存中,因此其時間可以暫時地變更爲最新時間,但是不會保存到cramfs文件系統中去。
  當前版本的cramfs只支持PAGE_CACHE_SIZE爲4096的內核。因此,如果發現cramfs不能正常讀寫的時候,可以檢查一下內核的參數設置。

YAFFS簡介

       YAFFS是第一個專門爲NAND Flash存儲器設計的嵌入式文件系統,適用於大容量的存儲設備;並且是在GPL(General Public License)協議下發布的,可在其網站免費獲得源代碼。 
  YAFFS中,文件是以固定大小的數據塊進行存儲的,塊的大小可以是512字節、1 024字節或者2 048字節。這種實現依賴於它能夠將一個數據塊頭和每個數據塊關聯起來。每個文件(包括目錄)都有一個數據塊頭與之相對應,數據塊頭中保存了ECC(Error Correction Code)和文件系統的組織信息,用於錯誤檢測和壞塊處理。充分考慮了NAND Flash的特點,YAFFS把這個數據塊頭存儲在Flash的16字節備用空間中。當文件系統被掛載時,只須掃描存儲器的備用空間就能將文件系統信息讀入內存,並且駐留在內存中,不僅加快了文件系統的加載速度,也提高了文件的訪問速度,但是增加了內存的消耗。 
  爲了在節省內存的同時提高文件數據塊的查找速度,YAFFS利用更高效的映射結構把文件位置映射到物理位置。文件的數據段被組織成樹型結構,這個樹型結構具有32字節的節點,每個內部節點都包括8個指向其他節點的指針,葉節點包括16個2字節的指向物理地址的指針。YAFFS在文件進行改寫時總是先寫入新的數據塊,然後將舊的數據塊從文件中刪除。這樣即使在修改文件時意外掉電,丟失的也只是這一次修改數據的最小寫入單位,從而實現了掉電保護,保證了數據完整性。 
  結合貪心算法的高效性和隨機選擇的平均性,YAFFS實現了兼顧損耗平均和減小系統開銷的目的。當滿足特定的小概率條件時,就會嘗試隨機選擇一個可回收的頁面;而在其他情況下,則使用貪心算法來回收最“髒”的塊[2]。 
  YAFFS文件系統是按層次結構設計的,分成以下4部分: yaffs_guts.c,文件系統的主要算法,這部分代碼完全是用可移植的C語言編寫的;yaffs_fs.c,Linux VFS層的接口;NAND 接口,yaffs_guts 和NAND 內存訪問函數之間的包裝層,例如調用Linux mtd 層或者RAM模擬層;可移植函數,服務的包裝函數。最重要的一點是,爲了獲得更好的移植性,YAFFS提供直接調用的模式,這才使得我們有機會來實現YAFFS文件系統在C51系統上的移植。

CRAMFS & YAFFS

      cramfs這種只讀的壓縮格式,linux內核是直接支持的,而yaffs必須要自己來打補丁才能讓內核支持,在yaffs2的目錄內執行sh patch-ker.sh c $KERNEL 就可以讓內核支持yaffs格式了。至於根文件系統個人覺得cramfs要好些,即省空間又是隻讀的,對於產品來說安全性稍高一點點。
      首先需你有兩個分區,一個cramfs和一個yaffs,這個要通過bootloader來實現。當根文件系統設置爲cramfs後,修改一下初始化的腳本liunxrc,在裏面加上一句mount /dev/mtdblockX /my 其中X爲的yaffs分區number,即可實現兩種分區共存。TE2440的板子出廠時/dev/mtdblock/3是cramfs格式,/dev/mtdblock/4是yaffs的,內核啓動後用mount /dev/mtdblock/4 /root之後,就可以操縱那一塊yaffs的空間了。
     這裏還有一個小問題,/dev/mtdblock/2是內核的分區,我在mount /dev/mtdblock/2 /tmp和umount/tmp之後,有save exit: isCheckpointed 0的提示,重新啓動時提示Dabort kernel就死了,使用串口下載內核到RAM裏啓動,再mount /dev/mtdblock/2 /root(/root爲空)發現原來/tmp下的文件夾出現在了/root下,也就是/dev/mtdblock/2裏。所以板子內核這塊貌似只讀的分區,只要mount出來一樣是可以破壞它的,無意間的發現不知道是內核的小缺陷,還是我沒有明白真實意義,有待查明。
    這樣,不希望用戶修改的文件都放在cramfs分區下,供用戶隨意修改的放在yaffs下就可以有效利用Flash,實現兩種分區共存了。當然前提是你的內核必須支持


源地址:http://blog.21ic.com/user1/5644/archives/2009/57032.html

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