嵌入式Linux文件系統及其存儲機制分析
1.嵌入式系統存儲設備及其管理機制分析
構建適用于嵌入式系統的Linux文件系統,必然會(huì )涉及到兩個(gè)關(guān)鍵點(diǎn),一是文件系統類(lèi)型的選擇,它關(guān)系到文件系統的讀寫(xiě)性能、尺寸大小;另一個(gè)就是根文件系統內容的選擇,它關(guān)系到根文件系統所能提供的功能及尺寸大小。
嵌入式設備中使用的存儲器是像Flash閃存芯片、小型閃存卡等專(zhuān)為嵌入式系統設計的存儲裝置。Flash是目前嵌入式系統中廣泛采用的主流存儲器,它的主要特點(diǎn)是按整體/扇區擦除和按字節編程,具有低功耗、高密度、小體積等優(yōu)點(diǎn)。目前,Flash分為NOR, NAND兩種類(lèi)型。
NOR型閃存可以直接讀取芯片內儲存的數據,因而速度比較快,但是價(jià)格較高。NOR型芯片,地址線(xiàn)與數據線(xiàn)分開(kāi),所以NOR型芯片可以像SR
NAND型閃存芯片共用地址線(xiàn)與數據線(xiàn),內部數據以塊為單位進(jìn)行存儲,直接將NAND芯片做啟動(dòng)芯片比較難。NAND閃存是連續存儲介質(zhì),適合放大文件。擦除NOR器件時(shí)是以64-128KB的塊進(jìn)行的,執行一個(gè)寫(xiě)入/擦除操作的時(shí)間為5s;擦除NAND器件是以8-32KB的塊進(jìn)行的,執行相同的操作最多只需要4ms。
NAND Rash的單元尺寸幾乎是NOR器件的一半,由于生產(chǎn)過(guò)程更為簡(jiǎn)單,NAND結構可以在給定的模具尺寸內提供更高的容量,也就相應地降低了價(jià)格。NOR flash占據了容量為1―16MB閃存市場(chǎng)的大部分,而NAND flash只是用在8―128MB的產(chǎn)品當中,這也說(shuō)明NOR主要應用在代碼存儲介質(zhì)中,NAND適合于數據存儲。
壽命(耐用性),在NAND閃存中每個(gè)塊的最大擦寫(xiě)次數是一百萬(wàn)次,而NOR的擦寫(xiě)次數是十萬(wàn)次。NAND存儲器除了具有10比1的塊擦除周期優(yōu)勢,典型的NAND塊尺寸要比NOR器件小8倍,每個(gè)NAND存儲器塊在給定的時(shí)間內的刪除次數要少一些。
所有嵌入式系統的啟動(dòng)都至少需要使用某種形式的永久性存儲設備,它們需要合適的驅動(dòng)程序,當前在嵌入式Linux中有三種常用的塊驅動(dòng)程序可以選擇。
● Blkmem驅動(dòng)層
Blkmem驅動(dòng)是為uclinux專(zhuān)門(mén)設計的,也是最早的一種塊驅動(dòng)程序之一,現在仍然有很多嵌入式Linux操作系統選用它作為塊驅動(dòng)程,尤其是在uClinux中。它相對來(lái)說(shuō)是最簡(jiǎn)單的,而且只支持建立在NOR型Flash和RAM中的根文件系統。使用Blkmem驅動(dòng),建立Flash分區配置比較困難,這種驅動(dòng)程序為Flash提供了一些基本擦除/寫(xiě)操作。
● RAMdisk驅動(dòng)層
RAMdisk驅動(dòng)層通常應用在標準Linux中無(wú)盤(pán)工作站的啟動(dòng),對Flash存儲器并不提供任何的直接支持, RAM disk就是在開(kāi)機時(shí),把一部分的內存虛擬成塊設備,并且把之前所準備好的檔案系統映像解壓縮到該RAM disk環(huán)境中。當在Flash中放置一個(gè)壓縮的文件系統,可以將文件系統解壓到RAM,使用RAM disk驅動(dòng)層支持一個(gè)保持在RAM中的文件系統。
● MTD驅動(dòng)層
為了盡可能避免針對不同的技術(shù)使用不同的工具,以及為不同的的技術(shù)提供共同的能力,Linux內核納入了MTD子系統(memory Technology Device)。它提供了一致且統一的接口,讓底層的MTD芯片驅動(dòng)程序無(wú)縫地與較高層接口組合在一起。
JFFS2, Cramfs, YAFFS等文件系統都可以被安裝成MTD塊設備。MTD驅動(dòng)也可以為那些支持CFI接口的NOR型Flash提供支持。雖然MTD可以建立在RAM上,但它是專(zhuān)為基于Flash的設備而設計的。MTD包含特定Flash芯片的驅動(dòng)程序,開(kāi)發(fā)者要選擇適合自己系統的Flash芯片驅動(dòng)。Flash芯片驅動(dòng)向上層提供讀、寫(xiě)、擦除等基本的操作,MTD對這些操作進(jìn)行封裝后向用戶(hù)層提供MTD char和MTD block類(lèi)型的設備。
MTD char類(lèi)型的設備包括/dev/mtd0, /dev/mtdl等,它們提供對Flash原始字符的訪(fǎng)問(wèn)。MTD block類(lèi)型的設備包括/dev/mtdblock0,/dev/mtdblock1等,MTD block設備是將Flash模擬成塊設備,這樣可以在這些模擬的塊設備上創(chuàng )建像Cramfs, JFFS2等格式的文件系統。
MTD驅動(dòng)層也支持在一塊Flash上建立多個(gè)Flash分區,每一個(gè)分區作為了一個(gè)MTD block設備,可以把系統軟件和數據等分配到不同的分區上,同時(shí)可以在不同的分區采用不用的文件系統格式。這一點(diǎn)非常重要,正是由于這一點(diǎn)才為嵌入式系統多文件系統的建立提供了靈活性。
2. 基于Flash的文件系統
鑒于Flash存儲介質(zhì)的讀寫(xiě)特點(diǎn),傳統的Linux文件系統己經(jīng)不適合應用在嵌入式系統中,像Ext2fs文件系統是為像IDE那樣的塊設備設計的,這些設備的邏輯塊是512字節、1024字節等大小,沒(méi)有提供很好的扇區
● Romfs
傳統型的Romfs文件系統是最常使用的一種文件系統,它是一種簡(jiǎn)單的、緊湊的、只讀的文件系統,不支持動(dòng)態(tài)擦寫(xiě)保存;它按順序存放所有的文件數據,所以這種文件系統格式支持應用程序以XIP方式運行,在系統運行時(shí),可以獲得可觀(guān)的RAM節省空間。uClinux系統通常采用Romfs文件系統。
● Cramfs
Cramfs是Linux的創(chuàng )始人Linus Torvalds開(kāi)發(fā)的一種可壓縮只讀文件系統在Cramfs文件系統中,每一頁(yè)被單獨壓縮,可以隨機頁(yè)訪(fǎng)問(wèn),其壓縮比高達2:1,為嵌入式系統節省大量的Flash存儲空間。Cramfs文件系統以壓縮方式存儲,在運行時(shí)解壓縮,所以不支持應用程序以XIP方式運行,所有的應用程序要求被拷到RAM里去運行,但這并不代表比Ramfs需求的RAM 空間要大一點(diǎn),因為Cramfs是采用分頁(yè)壓縮的方式存放檔案,在讀取檔案時(shí),不會(huì )一下子就耗用過(guò)多的內存空間,只針對目前實(shí)際讀取的部分分配內存,尚沒(méi)有讀取的部分不分配內存空間,當我們讀取的檔案不在內存時(shí), Cramfs文件系統自動(dòng)計算壓縮后的資料所存的位置,再即時(shí)解壓縮到RAM中。
另外,它的速度快,效率高,其只讀的特點(diǎn)有利于保護文件系統免受破壞,提高了系統的可靠性;但是它的只讀屬性同時(shí)又是它的一大缺陷,使得用戶(hù)無(wú)法對其內容對進(jìn)擴充。Cramfs映像通常是放在Flash中,但是也能放在別的文件系統里,使用loopback設備可以把它安裝別的文件系統里。使用mkcramfs工具可以創(chuàng )建Cramfs映像。
● Ramfs/Tmpfs
Ramfs也是Linus Torvalds開(kāi)發(fā)的,Ramfs文件系統把所有的文件都放在RAM里運行,通常是Flash系統用來(lái)存儲一些臨時(shí)性或經(jīng)常要修改的數據,相對于ramdisk來(lái)說(shuō),Ramfs的大小可以隨著(zhù)所含文件內容大小變化,不像ramdisk的大小是固定的。Tmpfs是基于內存的文件系統,因為tmpfs駐留在RAM 中,所以寫(xiě)/讀操作發(fā)生在RAM 中。tmpfs文件系統大小可隨所含文件內容大小變化,使得能夠最理想地使用內存;tmpfs駐留在RAM,所以讀和寫(xiě)幾乎都是瞬時(shí)的。tmpfs的一個(gè)缺點(diǎn)是當系統重新引導時(shí)會(huì )丟失所有數據。
● JFFS2
JFFS2是RedHat公司基于JFFS開(kāi)發(fā)的閃存文件系統,最初是針對RedHat公司的嵌入式產(chǎn)品eCos開(kāi)發(fā)的嵌入式文件系統,所以JFFS2也可以用在Linux,uCLinux中。JFFS文件系統最早是由瑞典Axis Communications公司基于Linux2.0的內核為嵌入式系統開(kāi)發(fā)的文件系統。JFFS2是一個(gè)可讀寫(xiě)的、壓縮的、日志型文件系統,并提供了崩潰/掉電安全保護,克服了JFFS的一些缺點(diǎn):使用了基于哈希表的日志節點(diǎn)結構,大大加快了對節點(diǎn)的操作速度;支持數據壓縮;提供了“寫(xiě)平衡”支持;支持多種節點(diǎn)類(lèi)型;提高了對閃存的利用率,降低了內存的消耗。這些特點(diǎn)使JFFS2文件系統成為目前Flash設備上最流行的文件系統格式,它的缺點(diǎn)就是當文件系統已滿(mǎn)或接近滿(mǎn)時(shí),JFFS2運行會(huì )變慢,這主要是因為碎片收集的問(wèn)題。
● YAFFS
YAFFS/YAFFS2是一種和JFFSx類(lèi)似的閃存文件系統,它是專(zhuān)為嵌入式系統使用NAND型閃存而設計的一種日志型文件系統。和JFFS2相比它減少了一些功能,所以速度更快,而且對內存的占用比較小。此外,YAFFS自帶NAND芯片的驅動(dòng),并且為嵌入式系統提供了直接訪(fǎng)問(wèn)文件系統的API,用戶(hù)可以不使用Linux中的MTD與VFS,直接對文件系統操作。YAFFS2支持大頁(yè)面的NAND設備,并且對大頁(yè)面的NAND設備做了優(yōu)化。JFFS2在NAND閃存上表現并不穩定,更適合于NOR閃存,所以相對大容量的NAND閃存,YAFFS是更好的選擇。
在具體的嵌入式系統設計中可根據不同目錄存放的內容不同以及存放的文件屬性,確定使用何種文件系統。
評論