【轉載】Yaffs 檔案系統分析

來源:互聯網
上載者:User
1 Yaffs檔案系統結構
1.1 簡介
1.1.1 應用場合
        Yaffs(Yet Another Flash File
System)檔案系統是專門針對NAND快閃記憶體設計的嵌入式檔案系統,目前有YAFFS和YAFFS2兩個版本,兩個版本的主要區別之一在於YAFFS2
能夠更好的支援大容量的NAND FLASH晶片。
Yaffs檔案系統有些類似於JFFS/JFFS2檔案系統,與之不同的是JFFS1/2檔案
系統最初是針對NOR FLASH的應用場合設計的,而NOR FLASH和NAND FLASH本質上有較大的區別,所以儘管JFFS1/2
檔案系統也能應用於NAND FLASH,但由於它在記憶體佔用和啟動時間方面針對NOR的特性做了一些取捨,所以對NAND來說通常並不是最優的方案。 1.1.2 NOR和NAND的比較
       
基本上NOR比較適合儲存程式碼,其容量一般較小(比如小於32MB),價格較高,而NAND容量可達1GB以上,價格也相對便宜,適合儲存資料。一般
來說,128MB以下容量NAND FLASH
晶片的一頁大小為528位元組,用來存放資料,另外每一頁還有16位元組的備用空間(SpareData,OOB),用來儲存ECC校正/壞塊標誌等資訊,再
由若干頁組成一個塊,通常一塊為32頁16K。
        與NOR相比,NAND不是完全可靠的,每塊晶片出廠時都有一定比例的壞塊存在,對資料的存取不是使用地址映射而是通過寄存器的操作,串列存取資料。 1.2 Yaffs檔案系統資料在NAND上的儲存方式
       
Yaffs對檔案系統上的所有內容(比如正常檔案,目錄,連結,裝置檔案等等)都統一當作檔案來處理,每個檔案都有一個頁面專門存放檔案頭,檔案頭儲存了
檔案的模式、所有者id、組id、長度、檔案名稱、Parent Object
ID等資訊。因為需要在一頁內放下這些內容,所以對檔案名稱的長度,符號連結對象的路徑名等長度都有限制。
前面說到對於NAND
FLASH上的每一頁資料,都有額外的空間用來儲存附加資訊,通常NAND驅動只使用了這些空間的一部分,Yaffs正是利用了這部分空間中剩餘的部分來
隱藏檔系統相關的內容。以512+16B為一個PAGE的NAND FLASH晶片為例,Yaffs檔案系統資料的儲存布局如下所示:
0..511
資料區域
512..515
YAFFS TAG
516
Data status byte
517
Block status byte 壞塊標誌位
518..519
YAFFS TAG
520..522
後256位元組資料的ECC校正結果
523..524
YAFFS TAG
525..527
前256位元組資料的ECC校正結果
        可以看到在這裡YAFFS一共使用了8個BYTE用來存放檔案系統相關的資訊(yaffs_Tags)。這8個Byte的具體使用方式按順序如下:
Bits
Content
20
ChunkID,該page在一個檔案內的索引號,所以檔案大小被限制在2^20 PAGE 即512Mb
2
2 bits serial number
10
ByteCount 該page內的有效位元組數
18
ObjectID 對象ID號,用來唯一標示一個檔案
12
Ecc, Yaffs_Tags本身的ECC校正和
2
Unused
        其中Serial
Number在檔案系統建立時都為0,以後每次寫具有同一ObjectID和ChunkID的page的時候都加一,因為Yaffs在更新一個PAGE的
時候總是在一個新的物理Page上寫入資料,再將原先的物理Page刪除,所以該serial
number可以在斷電等特殊情況下,當新的page已經寫入但老的page還沒有被刪除的時候用來識別正確的Page,保證資料的正確性。
        ObjectID號為18bit,所以檔案的總數限制在256K即26萬個左右。
       
最後以上這些是針對Yaffs1而言,對於Yaffs2因為針對chunk size大於1k的NAND
FLASH,在Tags各分量及總體尺寸上都做了修改,以便更快更好的處理大容量的NAND
FLASH晶片。由於Tag尺寸的增大,在512+16B類型的NAND
FLASH上就一個Trunk對應一個page的情況,目前就無法使用Yaffs2檔案系統了。
        由於檔案系統的基主要組織資訊儲存在頁面的備份空間中,因此,在檔案系統載入時只需要掃描各個頁面的備份空間,即可建立起整個檔案系統的結構,而不需要像JFFS1/2 那樣掃描整個介質,從而大大加快了檔案系統的載入速度。
1.3 yaffs檔案系統在記憶體中的組織方式

1.3.1 SupperBlock

        操作檔案系統的第一步自然是取得SuperBlock了,Yaffs檔案系統本身在NAND
Flash上並不存在所謂的SuperBlock塊,完全是在檔案系統mount的過程中由read_super函數填充的,不過有意思的一點是,由於物
理上沒有儲存superblock塊,所以NAND
Flash上的yaffs檔案系統本身沒有儲存filesystem的魔數(MagicNum),在記憶體中superblock裡的s_magic參數也
是直接賦值的,所以儲存在NAND
FLASH上的任何檔案系統都能被當作yaffs檔案系統mount上來,只是資料都會被當作錯誤資料放在lost+found目錄中,不知道這算不算
yaffs檔案系統的一個bug。
        通常一個具體的檔案系統在VFS的Super_block結構中除了通用的資料外,還有自己專用的資料,Yaffs檔案系統的專用資料是一個yaffs_DeviceStruct結構,主要用來儲存一些相關軟硬體設定資訊,相關函數指標和統計資訊等。 1.3.2 檔案在記憶體中的組織方式

       
在mount過程執行read_super的過程中,Yaffs檔案系統還需要將檔案系統的目錄結構在記憶體中建立起來。由於沒有super塊,所以需要掃
描Yaffs分區,根據從OOB中讀取出的yaffs_tags資訊判斷出是檔案頭page還是資料page。再根據檔案頭page中的內容以及資料
page中的ObjectID/ChunkID/serial
Number等資訊在記憶體中為每個檔案(Object)建立一個對應的yaffs_object對象。
        在yaffs_object結構中,主要包含了:

    Ø 如修改時間,使用者ID,組ID等檔案屬性;
    Ø 用作yaffs檔案系統維護用的各種標記位如髒(dirty)標記,刪除標記等等;
    Ø 用作組織圖的,如指向父目錄的Parent指標,指向同級目錄中其他對象鏈表的siblings雙向鏈表頭結構
   
        此外根據Object類型的不同(目錄,檔案,連結),對應於某一具體類型的Object,在Yaffs_object中還有其各自專有的資料內容
    Ø 普通檔案:檔案尺寸,用於快速尋找檔案資料區塊的yaffs_Tnode 樹的指標等
    Ø 目錄:目錄項內容雙向鏈表頭(children)
    Ø 連結:softlink的alias,hardlink對應的ObjectID        除了對應於儲存在NAND
FLASH上的object而建立起來的yaffs_object以外,在read_super執行過程中還會建立一些虛擬對象(Fake
Object),這些Fake Object在NAND
FLASH上沒有對應的物理實體,比如在建立檔案目錄結構的最初,yaffs會建立四個虛擬目錄(Fake Directory):rootDir,
unlinkedDir, deleteDir,
lostNfoundDir分別用作根目錄,unlinked對象掛接的目錄,delete對象掛接的目錄,無效或零時資料區塊掛接的目錄。
        通過建立這些yaffs_object,yaffs檔案系統就能夠將儲存在NAND FLASH上資料系統的組織起來,在記憶體中維護一個完整的檔案系統結構。2 Yaffs檔案系統整合及應用相關
2.1 系統移植
        這裡所謂移植,就是在特定的軟硬體環境裡編譯出yaffs檔案系統模組了。目前最新的yaffs版本的代碼裡主要是按照2.6核心的方式寫的Kconfig和Makefile,對於2.4核心來說,改起來也很簡單,基本上,只需要:    Ø 在核心中建立YAFFS目錄fs/yaffs,並把下載的YAFFS代碼複製到該目錄下面。
    Ø 參考yaffs代碼中的Kconfig檔案,按照2.4核心的風格修改你自己的Config.in檔案,使得可以配置YAFFS。
    Ø 修改fs/makefile,加入yaffs目錄
    Ø 按照2.4核心的風格修改YAFFS目錄中的Makefile檔案。        只是在配置YAFFS的時候需要注意一點,即使你的NAND
FLASH是512+16B的,不需要使用YAFFS2,也需要將對2k page的NAND
FLASH的支援這一項選上,否則編譯無法通過(因為部分代碼沒有用CONFIG宏包起來),不知道這是不是我下載的這個版本的個別現象,還是對
Makefile還需要進一步的修改。
        此外就是最好把Lets Yaffs do its own
ECC選上,理由後面會說,其他選項就無所謂了,主要是對效能的調整,看著選吧,按推薦配置好了,比如Turn off debug chunk
erase check,這一項,我實驗的結果選上後平均可以提高20-30%左右的擦寫速度。2.2 Yaffs檔案系統的製作和使用
2.2.1 通過Yaffs Image檔案製作yaffs檔案系統
        Yaffs原始碼包的utils目錄下包含了mkyaffsimage/mkyaffs2image的代碼,簡單的修改一下Makefile裡的核心路徑就能編譯出mkyaffsimage/mkyaffs2image工具。
        運行mkyaffsimage dir imagename可以製作出yaffs1檔案系統的鏡像。
       
但是,需要注意的是,製作出來的yaffs
image檔案與通常的檔案系統的image檔案不同,因為在image檔案裡除了以512位元組為單位的一個page的data資料外,同時緊跟在後還包
括了16位元組為單位的NAND備份資料區(OOB)的資料。所以實際上是以528個位元組為單位的。就是因為包含了這額外的16位元組/page的資料,所以
基本上常規辦法如dd,或者通常的下載其它類型image的工具就無法正常下載yaffs
image了,需要修改你所使用的下載工具的代碼,使得它能將yaffs image中的這些額外資料也寫入NAND FLASH OOB中。
       
這裡還有一點需要注意的是,通過mkyaffsimage製做出來的image其OOB中也包含它自己計算的ECC校正資料,其校正演算法有可能和MTD
NAND驅動的校正演算法不同,如果在核心中由MTD來處理ECC,會造成MTD認為所有的page都校正錯誤。所以,這也是我前面說最好把Lets
Yaffs do its own ECC選上的原因,同時,要把MTD NAND驅動中的ECC校正關閉。2.2.2 其它方式製作yaffs檔案系統
       
如果不考慮產線批量下載的話,也可以通過mount拷貝的方式準備yaffs檔案系統。用flash_eraseall將NAND
FLASH分區擦除,然後做為yaffs分區直接mount上來,將檔案系統的內容拷貝上去就可以了。這可能是在真正的NAND
FLASH上實驗yaffs檔案系統最簡單的方式了。2.2.3 沒有相應的NAND裝置時如何測試yaffs檔案系統
        沒有相應的NAND FLASH裝置包含兩種情況:    Ø 硬體上沒有NAND FLASH,開發板上沒有或者想在主機環境中測試yaffs檔案系統
    Ø 沒有合適的page size的NAND FLASH晶片,比如板上NAND FLASH晶片為512+16的格式,但是想要實驗Yaffs2檔案系統。
        Yaffs提供了兩種用來在這種情況下測試yaffs檔案系統的途徑。2.2.3.1 Nandemul        Yaffs
source包裡包含了mtdemul目錄,Yaffs2中該目錄下的檔案主要是Nandemul2k.c用來類比2K page size的NAND
FLASH。在Yaffs中則是Nandemul.c用來類比512位元組page size的NAND FLASH。
       
稍微修改一下Makeflie將編譯出來的模組插入核心,將在/dev/mtd
/dev/mtdblock目錄下建立一個新的MTD裝置。然後就可以將該裝置當作一個物理的MTD
NAND裝置分區進行相關的操作,可以在上面建立yaffs檔案系統,mount
umount等等。這種方法不僅適用於yaffs檔案系統,同樣也適用於其它可用於NAND裝置的檔案系統。

2.2.3.2 Yaffsram

       
根據yaffs 官方文檔的描述,通過mount –t yaffsram none /mountpoint
可以在記憶體中建立一個yaffs分區,這有些類似於ramfs。不過,在實驗最新版本的Yaffs2檔案系統時,該功能並不可用,只有Yaffs1檔案系
統的程式碼封裝裡包含了相關的代碼。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.