uClinux下Nor Flash的JFFS2文件系統構建

發(fā)布時(shí)間:2010-11-16 16:17    發(fā)布者:eetech
關(guān)鍵詞: Flash , JFFS2 , NOR , uclinux , 文件系統
目前的嵌入式系統多使用FLASH作為主存,因此,如何有效管理FLASH上的數據非常重要。文章以SST39VF160芯片為例,討論了在Nor Flash上建立uClinux的JFFS2文件系統的一般步驟,從而為FLASH上的數據管理提供了理想的選擇方式。

嵌入式系統正隨著(zhù)Internet的發(fā)展而在各個(gè)領(lǐng)域得到廣泛的應用,作為嵌入式應用的核心,嵌入式Linux以其自由軟件特性正日益被人們看好。Linux具有內核小、效率高、源代碼開(kāi)放等優(yōu)點(diǎn),還內涵了完整的TCP/IP網(wǎng)絡(luò )協(xié)議,因此非常適于嵌入式系統的應用。而作為專(zhuān)門(mén)運行于沒(méi)有MMU的微處理器的嵌入式操作系統,uClinux更是得到廣泛應用。  

當前的嵌入式系統開(kāi)發(fā),需要方便靈活的使用Flash。NOR和NAND是現在市場(chǎng)上兩種主要的非易失閃存技術(shù)。Intel于1988年首先開(kāi)發(fā)出NOR flash技術(shù),徹底改變了原先由EPROM和EEPROM一統天下的局面。NOR的特點(diǎn)是芯片內執行XIP eXe-cute In Place ,這樣應用程序可以直接在flash閃存內運行,不必再把代碼讀到系統RAM中。NOR的傳輸效率很高,在1~4MB的小容量時(shí)具有很高的成本效益,因此在嵌入式系統得到廣泛的應用。

1 JFFS2文件系統簡(jiǎn)介  

uClinux通常默認ROMFS作為根文件系統,它相對于一般的EXT2文件系統具有節約空間的優(yōu)點(diǎn)。但是ROMFS是一種只讀的文件系統,不支持動(dòng)態(tài)擦寫(xiě)保存。雖然對于需要動(dòng)態(tài)保存的數據可以采用虛擬ram盤(pán)的方法來(lái)保存,但當系統掉電后,ram盤(pán)的內容將全部丟失,而不能永久保存,因此需要實(shí)現一個(gè)可讀寫(xiě)的文件系統。JFFS2文件系統便是一個(gè)很好的選擇。  

JFFS文件系統是瑞典Axis通信公司開(kāi)發(fā)的一種基于Flash的日志文件系統,它在設計時(shí)充分考慮了Flash的讀寫(xiě)特性和用電池供電的嵌入式系統的特點(diǎn),在這類(lèi)系統中必需確保在讀取文件時(shí),如果系統突然掉電,其文件的可靠性不受到影響。對Red Hat的David Woodhouse進(jìn)行改進(jìn)后,形成了JFFS2。主要改善了存取策略以提高FLASH的抗疲勞性,同時(shí)也優(yōu)化了碎片整理性能,增加了數據壓縮功能。需要注意的是,當文件系統已滿(mǎn)或接近滿(mǎn)時(shí),JFFS2會(huì )大大放慢運行速度。這是因為垃圾收集的問(wèn)題。



  
JFFS2的底層驅動(dòng)主要完成文件系統對Flash芯片的訪(fǎng)問(wèn)控制,如讀、寫(xiě)、擦除操作。在Linux中這部分功能是通過(guò)調用MTD(memory technology device內存技術(shù)設備)驅動(dòng)實(shí)現的。相對于常規塊設備驅動(dòng)程序,使用 MTD 驅動(dòng)程序的主要優(yōu)點(diǎn)在于 MTD 驅動(dòng)程序是專(zhuān)門(mén)為基于閃存的設備所設計的,所以它們通常有更好的支持、更好的管理和更好的基于扇區的擦除和讀寫(xiě)操作的接口。MTD相當于在硬件和上層之間提供了一個(gè)抽象的接口,可以把它理解為FLASH的設備驅動(dòng)程序,它主要向上提供兩個(gè)接口:MTD字符設備和MTD塊設備。通過(guò)這兩個(gè)接口,就可以象讀寫(xiě)普通文件一樣對FLASH設備進(jìn)行讀寫(xiě)操作。經(jīng)過(guò)簡(jiǎn)單的配置后,MTD在系統啟動(dòng)以后可以自動(dòng)識別支持CFI或JEDEC接口的FLASH芯片,并自動(dòng)采用適當的命令參數對FLASH進(jìn)行讀寫(xiě)或擦除。  

JFFS2在uClinux中有兩種使用方式,一種是作為根文件系統,另一種是作為普通文件系統在系統啟動(dòng)后被掛載。考慮到實(shí)際應用中需要動(dòng)態(tài)保存的數據并不多,且在Linux系統目錄樹(shù)中,根目錄和/usr等目錄主要是讀操作,只有少量的寫(xiě)操作,但是大量的讀寫(xiě)操作又發(fā)生在/var和/tmp目錄(這是因為在系統運行過(guò)程中產(chǎn)生大量log文件和臨時(shí)文件都放在這兩個(gè)目錄中),因此,通常選用后一種方式。根文件指的是Romfs、var和/tmp,目錄采用Ramfs,當系統斷電后,該目錄所有的數據都會(huì )丟失。  

綜上所述,通常在uClinux下采用的文件系統構成如圖1所示。對于本文來(lái)說(shuō),圖中Romfs和Ramfs兩個(gè)文件系統的實(shí)現是很方便的,主要需要實(shí)現的是Nor Flash的底層MTD驅動(dòng),下面就以SST39VF160芯片為例來(lái)介紹MTD的驅動(dòng)設計方法。

2 JFFS2底層MTD驅動(dòng)設計  

本文采用的系統以三星公司的SND-100為母板,CPU為ARM7TDMI芯片S3C4510B,16M的SDRAM,Nor Flash為SST39VF160,容量為1M%26;#215;16bit,速度為70ns,通過(guò)16位數據總線(xiàn)與CPU交換數據,擦寫(xiě)次數典型值為10萬(wàn)次。  

在\linux-2.4.x\drivers\mtd\maps目錄下,每一個(gè)文件都是一個(gè)具體的MTD原始設備的相關(guān)信息,包括該MTD原始設備的起始物理地址、大小、分區情況、讀寫(xiě)函數、初始化和清除程序。設計時(shí),需要對SST39VF160編寫(xiě)相關(guān)的程序,假設為S3C4510B.C。則需要進(jìn)行以下幾點(diǎn)操作:  

(1) 定義SST39VF160在系統中的起始地址、大小、總線(xiàn)寬度  
#define WINDO DDR 0x1000000|0x04000000 //注意FLASH分區地址必須是non-cacheble  
#define WINDOW SIZE 0x200000  
#define BUSWIDTH 2  

(2) 定義SST39VF160分區  
典型的內存分區應包括:內核引導區、Linux內核區、應用區。其中內核引導區用來(lái)保存內核加載程序,Linux內核區存放的是經(jīng)過(guò)壓縮的uClinux內核,應用區則用來(lái)保存用戶(hù)的數據和應用程序,該區設為我們要采用的JFFS2文件系統。具體如下:  
static struct mtd_partition s3c4510_partitions[]={  
{  
name: ″bootloader(128K)″,  
size: 0x20000,  
offset: 0x0000,  
mask_flags:MTD_WRITEABLE //設置成只讀區域  
},  
{  
name: ″uClinux_kernel(832K)″,  
size: 0xd0000,  
offset: 0x20000,  
},?  
{  
name: ″jffs2 (1088K) ″,  
size: 0x110000,  
offset: 0xf0000  
}  
};
(3) 定義SST39VF160字節、半字、字的讀寫(xiě)操作函數。  

(4) 初始化SST39VF160函數int_init init_s3c4510b()。  
該操作主要包括兩個(gè)方面:第一是調用do map probe()檢測搜索MTD設備。通常檢測方式有兩種:cfi probe和jedec probe,這里采用后一種,該方法在jedec_probe.c文件中定義。另外,jedec probe.c中定義了各種jedec probe類(lèi)型芯片的信息,有些linux版本沒(méi)有包含SST39VF160,需要手動(dòng)添加;而操作的第二方面則是調用add_mtd_partitions()以將your_partiton的各個(gè)分區加入mtd_table。

3 內核相關(guān)配置的設定  

3.1 內核配置文件設置  

為使內核支持JFFS2,需在內核配置選項菜單里選擇相關(guān)選項。首先把SST39VF160的MTD驅動(dòng)加入配置菜單。并在mtd/maps/Config.in文件中加入如下程序:  

if[″$CONFIG ARM″= ″y″]; then  
dep_tristate′CFI Flash device mapped on Samsung S3C4510B′CONFIG_MTD_S3C4510B $CONFIG_MTD_CFI  
相應\mtd\maps\Makefile文件加入  
obj_$(CONFIG_MTD_S3C4510B)+=s3c4510b.o  
其次選擇Menuconfig下的配置選項。  
在linux Kernel v2.4.20-uc0 Configuration下  
Memory Technology Devices?MTD 下  
CONFIG_MTD=Y  
CONFIG_MTD_DEBUG=Y  
CONFIG_MTD_DEBUG_VERBOSE=3  
CONFIG_MTD_PARTITIONS=Y  
CONFIG_MTD_CHAR=Y  
CONFIG_MTD_BLOCK=Y  
RAM/ROM/Flash chip drivers下  
CONFIG_MTD_CFI=Y  
CONFIG_MTD_JEDECPROBE=Y  
CONFIG_MTD_CFI_AMDSTD=Y  
Mapping drivers for chip access下  
CONFIG_S3C4510B=Y  
File systems下  
CONFIG_JFFS2_FS=Y  
CONFIG_JFFS2_FS_DEBUG=2  
在uClinux v1.3.4 Configuration下  
Flash Tools下  
CONFIG_USER_MTDUTILS=Y  
CONFIG_USER_MTDUTILS_ERASE=Y  
CONFIG_USER_MTDUTILS_ERASEALL=Y  
CONFIG_USER MTDUTILS_MKFSJFFS2=Y  
BusyBox下選中cat,cp,dd, mount,umount,mkdir工具。  

3.2 MTD塊設備配置  

下面是修改系統塊設備的主設備號。默認情況下,MTDBLOCK主設備號為31,與BLKMEM的主設備號沖突,因此 修改\mtd\mtd.h中 MTD BLOCK MAJOR的值為30。  

接著(zhù)應添加MTD設備節點(diǎn)到/vender/--你所使用的目標機類(lèi)型--/Makefile文件中。其中字符設備的主設備號為90,次設備號為0、2、4、6...(奇數次設備號為只讀設備),塊設備的主設備號為31,次設備號為0、1、2、3。可按以下方式增加DEVICES目標:  

mtd0,c,90,0 mtd1,c,90,1 mtd2,c,90,2  
mtdblock0,b,30,0 mtdblock1,b,30,1 mtd-block2,b,30,2  

做完以上步驟,可以運行內核編譯命令make dep, make 以對內核進(jìn)行編譯。  

當系統啟動(dòng)時(shí),可以看到以下信息:  

s3c4510b flash device: 200000 at 5000000  
Found: SST SST39VF160  
number of JEDEC chips: 1  
Creating 3 MTD partitions on ″S3C4510B flash de-vice″:  
0x00000000-0x00020000: ″bootloader(128K)″  
mtd:Giving out device 0 to bootloader(128K)  
0x00020000-0x00f0000:″uClinux_kernel(832K)″  
mtd: Giving out device 1 to uClinux_kernel(832K)  
0x00f0000-0x00200000:″jffs2_usr(1088K)″  
mtd: Giving out device 2 to jffs2_usr(1088K)  
init_mtdchar: allocated major number 90.  
init_mtdblock: allocated major number 31.  
……  

3.3 創(chuàng )建文件系統鏡像文件  

系統會(huì )編譯生成JFFS2的輔助工具:mkfs.jffs2、eraseall、erase。其中mkfs.jffs2會(huì )產(chǎn)生JFFS2文件系統鏡像的工具,eraseall和erase用來(lái)對FLASH芯片的擦除。mkfs.jffs的使用方法如下:mkfs.jffs -d根目錄-b| l-e 擦除塊大小-o 輸出文件-v 0-9-q。  
另外,為了使系統在啟動(dòng)時(shí)自動(dòng)掛載建好的JFFS2文件系統,在啟動(dòng)腳本里應加入:  

mount -t jffs2 /dev/mtdblock2 /mnt4

結束語(yǔ)  

本文討論了在uClinux下建立基于Nor Flash的JFFS2的文件系統的一般步驟。Nor Flash的特性決定了它在對數據存儲要求不高的嵌入式系統中有著(zhù)廣泛的應用,因此JFFS2文件系統對Flash上的數據管理非常方便。對于一些高端的掌上設備來(lái)說(shuō),Nand Flash更為適合,其單元存儲密度比較高,成本較低,這樣系統可以在不增加成本的情況下擴大存儲容量。目前有一種新型的文件系統YAFFS更適于Nand Flash,本文不再予以討論。
本文地址:http://selenalain.com/thread-39865-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页