下面主要討論基於Flash的文件系統:linux
在嵌入式Linux應用中,主要的存儲設備爲RAM(DRAM, SDRAM)和ROM(常採用FLASH存儲器),經常使用的基於存儲設備的文件系統類型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。網絡
FLASH重要特性:寫操做只能把對應位置1變0,而刪除才能0變1,而且是整塊(block)的刪。(期待進一步分析工做原理)。併發
閃存主要就是NAND和NOR。FLASH擦寫次數有限,NAND閃存還有特殊的硬件接口和讀寫時序,因此要針對FLASH的硬件特性進行文件系統的設計,傳統的ext2等用在Flash會有諸多弊端(具體是?。。)oop
如圖,MTD是一主要設備,爲上下提供抽象接口。So:Flash文件系統基於MTD驅動層。使用MTD驅動程序的主要優勢在於,它是專門針對各類非易失性存儲器(以閃存爲主)而設計的,於是它對Flash有更好的支持、管理和基於扇區的擦除、讀/寫操做接口。性能
有意思的特性:FLASH芯片既能夠一分多(分區),分別用不一樣的文件系統;也能夠多合一(分區),採用一個文件系統。即文件系統是針對於存儲器分區而言的,而非存儲芯片。spa
JFFS2:Journalling Flash File System v2 ,第二版的JFFS,也可能有JFFS3,blabla....主要是給NOR FLASH。jffsx不適合用於NAND閃存主要是由於NAND閃存的容量通常較大,這樣致使jffs爲維護日誌節點所佔用的內存空間迅速增大,另外,jffsx文件系統在掛載時須要掃描整個FLASH的內容,以找出全部的日誌節點,創建文件結構,對於大容量的NAND閃存會耗費大量時間。操作系統
YAFFS/YAFFS2:Yet Another Flash File System。專爲NAND設計的日誌型文件系統.net
yaffs/yaffs2是專爲嵌入式系統使用NAND型閃存而設計的一種日誌型文件系統。與jffs2相比,它減小了一些功能(例如不支持數據壓縮),因此速度更快,掛載時間很短,對內存的佔用較小。另外,它仍是跨平臺的文件系統,除了Linux和eCos,還支持WinCE, pSOS和ThreadX等。設計
yaffs/yaffs2自帶NAND芯片的驅動,而且爲嵌入式系統提供了直接訪問文件系統的API,用戶能夠不使用Linux中的MTD與VFS,直接對文件系統操做。固然,yaffs也可與MTD驅動程序配合使用。調試
yaffs與yaffs2的主要區別在於,前者僅支持小頁(512 Bytes) NAND閃存,後者則可支持大頁(2KB) NAND閃存。同時,yaffs2在內存空間佔用、垃圾回收速度、讀/寫速度等方面均有大幅提高。
Cramfs:Compressed RAM File System
Linus參與開發,也基於MTD。
Cramfs文件系統以壓縮方式存儲,在運行時解壓縮,因此不支持應用程序以XIP方式運行,全部的應用程序要求被拷到RAM裏去運行,但這並不表明比Ramfs需求的RAM空間要大一點,由於Cramfs是採用分頁壓縮的方式存放檔案,在讀取檔案時,不會一會兒就耗用過多的內存空間,只針對目前實際讀取的部分分配內存,尚沒有讀取的部分不分配內存空間,當咱們讀取的檔案不在內存時,Cramfs文件系統自動計算壓縮後的資料所存的位置,再即時解壓縮到RAM中。
另外,它的速度快,效率高,其只讀的特色有利於保護文件系統免受破壞,提升了系統的可靠性。
因爲以上特性,Cramfs在嵌入式系統中應用普遍。
可是它的只讀屬性同時又是它的一大缺陷,使得用戶沒法對其內容對進擴充。
Cramfs映像一般是放在Flash中,可是也能放在別的文件系統裏,使用loopback 設備能夠把它安裝別的文件系統裏。
Romfs
傳統型的Romfs文件系統是一種簡單的、緊湊的、只讀的文件系統,不支持動態擦寫保存,按順序存放數據,於是支持應用程序以XIP(eXecute In Place,片內運行)方式運行,在系統運行時,節省RAM空間。uClinux系統一般採用Romfs文件系統。
其餘文件系統:fat/fat32也可用於實際嵌入式系統的擴展存儲器(例如PDA, Smartphone, 數碼相機等的SD卡),這主要是爲了更好的與最流行的Windows桌面操做系統相兼容。ext2也能夠做爲嵌入式Linux的文件系統,不過將它用於FLASH閃存會有諸多弊端。
Other(Flash之外):
基於RAM的文件系統
(1) Ramdisk
Ramdisk是將一部分固定大小的內存看成分區來使用。它並不是一個實際的文件系統,而是一種將實際的文件系統裝入內存的機制,而且能夠做爲根文件系統。將一些常常被訪問而又不會更改的文件(如只讀的根文件系統)經過Ramdisk放在內存中,能夠明顯地提升系統的性能。
在Linux的啓動階段,initrd提供了一套機制,能夠將內核映像和根文件系統一塊兒載入內存。
(2)ramfs/tmpfs
Ramfs是Linus Torvalds開發的一種基於內存的文件系統,工做於虛擬文件系統(VFS)層,不能格式化,能夠建立多個,在建立時能夠指定其最大能使用的內存大小。(實際上,VFS本質上可當作一種內存文件系統,它統一了文件在內核中的表示方式,並對磁盤文件系統進行緩衝。)
Ramfs/tmpfs文件系統把全部的文件都放在RAM中,因此讀/寫操做發生在RAM中,能夠用ramfs/tmpfs來存儲一些臨時性或常常要修改的數據,例如/tmp和/var目錄,這樣既避免了對Flash存儲器的讀寫損耗,也提升了數據讀寫速度。
Ramfs/tmpfs相對於傳統的Ramdisk的不一樣之處主要在於:不能格式化,文件系統大小可隨所含文件內容大小變化。
Tmpfs的一個缺點是當系統從新引導時會丟失全部數據。
網絡文件系統NFS (Network File System)
NFS是由Sun開發並發展起來的一項在不一樣機器、不一樣操做系統之間經過網絡共享文件的技術。在嵌入式Linux系統的開發調試階段,能夠利用該技術在主機上創建基於NFS的根文件系統,掛載到嵌入式設備,能夠很方便地修改根文件系統的內容。
以上討論的都是基於存儲設備的文件系統(memory-based file system),它們均可用做Linux的根文件系統。實際上,Linux還支持邏輯的或僞文件系統(logical or pseudo file system),例如procfs(proc文件系統),用於獲取系統信息,以及devfs(設備文件系統)和sysfs,用於維護設備文件