国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

JFFS2文件系統(tǒng)在μClinux中的實現(xiàn)

2009-08-13 06:18行喜梁劉樹東戴學(xué)豐
現(xiàn)代電子技術(shù) 2009年10期
關(guān)鍵詞:嵌入式系統(tǒng)

行喜梁 劉樹東 戴學(xué)豐

摘 要:FLASH作為新型非易失性半導(dǎo)體存儲器在嵌入式系統(tǒng)的開發(fā)中占有重要的地位。為了在嵌入式系統(tǒng)中實現(xiàn)數(shù)據(jù)的動態(tài)操作,介紹μClinux下的FLASH文件系統(tǒng),特別是日志型文件系統(tǒng)的設(shè)計原理及特點;利用Linux提供的MTD接口,通過添加與FLASH對應(yīng)的map driver和FLASH驅(qū)動,修改設(shè)備節(jié)點,配置內(nèi)核等步驟,將JFFS2文件系統(tǒng)移植到s3c44b0使用的FLASH芯片上。通過掛載,用戶可以像使用普通硬盤分區(qū)一樣對此目錄下面的文件進行操作,從而實現(xiàn)對FLASH的動態(tài)操作和管理。結(jié)果表明,在JFFS2 文件系統(tǒng)下,保存的文件是可讀寫的,系統(tǒng)掉電后創(chuàng)建的文件也不會丟失。

關(guān)鍵詞:FLASH;JFFS2;內(nèi)存技術(shù)設(shè)備;嵌入式系統(tǒng)

中圖分類號:TN302文獻標識碼:A

文章編號:1004-373X(2009)10-051-04

Realization of JFFS2 File System in μClinux

XING Xiliang,LIU Shudong,DAI Xuefeng

(School of Computer and Control Engineering,Qiqihaer University,Qiqihaer,161006,China)

Abstract:FLASH as a new type of non-volatile semiconductor memory plays an important role in embedded systems development.For achieving operating the data dynamically under embedded system,the FLASH file system under μClinux,in particular the design principles and charactertistecs of JFFS2(log-file system)is introduced.Using MTD interface provided by Linux,through adding map driver and FLASH driver,modifying the device nodes,such as configuring core etc,transplanting JFFS2 file system to the FLASH chips of s3c44b0.Through the mount,users can operate the files under this directory as an ordinary hard driver partition,achieving operating dynamicly and managing for FLASH.The results show that files can be read and write after the creation under the JFFS2 file system.The files can′t be lost even if the power is down.

Keywords:FLASH;JFFS2;MTD;embedded system

0 引 言

嵌入式系統(tǒng)開發(fā)中,一些重要的工藝參數(shù)在控制過程中需要動態(tài)地改變和保存,使用硬盤等存儲介質(zhì)又顯得不太現(xiàn)實,而FLASH芯片以相對低廉的價格提供了高可靠性和高密度的存儲,已成為嵌入式系統(tǒng)重要的存儲設(shè)備。在很多嵌入式系統(tǒng)中,操作系統(tǒng)及應(yīng)用程序直接固化在FLASH上,系統(tǒng)啟動時,代碼可以直接在FLASH上開始運行。但是僅將FLASH作為ROM使用是大材小用,需要充分發(fā)揮FLASH可擦寫的優(yōu)勢,在系統(tǒng)運行過程中,動態(tài)擦寫FLASH來保存數(shù)據(jù)。

然而,μClinux的文件系統(tǒng)可以有多種選擇,ROMFS是使用得較多的文件系統(tǒng)。它是一種簡單、緊湊的文件系統(tǒng),占用的空間小,但由于是只讀的,使用起來有局限性。若采用EXT2作為文件系統(tǒng),雖然可以把信息保存在ramdisk盤中,但系統(tǒng)掉電后,ramdisk中的信息將丟失,這對于需要保存運行過程中參數(shù)的應(yīng)用程序是不允許的。建立在FLASH設(shè)備上的JFFS文件系統(tǒng)就是為解決這個問題而誕生的。

1 JFFS/MTD/JFFS2介紹

日志閃存文件系統(tǒng)(The Journalling FLASH File System,JFFS)最初由瑞典的Axis Communications開發(fā),Red Hat的David Woodhouse對它進行了改進。通過JFFS文件系統(tǒng),Linux用戶就可以將FLASH作為系統(tǒng)的硬盤來使用,可以像操作硬盤上的文件一樣操作FLASH芯片上的文件和數(shù)據(jù)。系統(tǒng)運行的參數(shù)可以實時保存到FLASH芯片中,在系統(tǒng)斷電后數(shù)據(jù)仍然存儲在FLASH芯片中。但是在使用過程中,JFFS設(shè)計中的局限被不斷地暴露出來。2001年年初,Red Hat 決定實現(xiàn)一個新的JFFS2。

JFFS2在閃存上順序地存儲包含數(shù)據(jù)和原數(shù)據(jù)的meta-data的節(jié)點。JFFS2的日志結(jié)構(gòu)存儲方式使得它能對閃存進行out-of-place更新,它提供的垃圾回收機制,只需要對擦寫越界的塊設(shè)置一個“臟”塊標志。當(dāng)可用的塊數(shù)不足時,垃圾回收機制才開始回收這些節(jié)點。目前,市場上的FLASH芯片千差萬別,而JFFS2文件系統(tǒng)并不考慮這些差異,它只是要求下面有一個抽象平臺屏蔽底層硬件差異,提供統(tǒng)一訪問接口。這個抽象平臺就是MTD層。

內(nèi)存技術(shù)設(shè)備(Memory Technology Device,MTD)是用于訪問Memory設(shè)備(ROM,FLASH)的μClinux的子系統(tǒng)。它的主要目標是在系統(tǒng)硬件驅(qū)動程序的上層或用戶模塊之間提供通用接口。硬件驅(qū)動程序不需要知道像JFFS和FTL那樣的用戶模塊所使用的方法,它們真正需要提供的就是一組對底層閃存系統(tǒng)進行read,write和erase操作的簡單例程,以及對MTD原始設(shè)備層的統(tǒng)一接口。

MTD支持的FLASH芯片主要有兩種:HAND FLASH和NOR FLASH,它們的驅(qū)動程序有著很大的差異。NOR和HAND是現(xiàn)在市場上兩種主要的非易失閃存技術(shù),其主要區(qū)別在于:

(1) NOR的特點是芯片內(nèi)執(zhí)行(eXecute In Place,XIP),這樣應(yīng)用程序可以直接在FLASH閃存內(nèi)運行,不必再把代碼讀到系統(tǒng)RAM中。NOR的傳輸效率很高,在1~4 MB的小容量時具有很高的成本效益,但是較低的寫入和擦除速度大大影響了它的性能。而HAND結(jié)構(gòu)能提供極高的單元密度,可以達到高存儲密度,并且寫入和擦除的速度也很快。應(yīng)用HAND的困難在于FLASH的管理和需要特殊的系統(tǒng)接口。

(2) 在對FLASH芯片中存儲器單元塊進行編程之前必須先執(zhí)行擦除。HAND器件執(zhí)行擦除操作是十分簡單的,而NOR則要求在進行擦除前先將目標塊內(nèi)所有的位都寫為0。

(3) NOR FLASH帶有SRAM接口,有足夠的地址引腳來尋址,可以很容易地存取其內(nèi)部的每一個字節(jié)。HAND器件使用復(fù)雜的I/O口來串行地存取數(shù)據(jù),各個產(chǎn)品或廠商的方法可能各不相同。8個引腳用來傳送控制、地址和數(shù)據(jù)信息。

引入MTD和JFFS2概念后,FLASH設(shè)備驅(qū)動在Linux內(nèi)核中的組織層次如圖1所示。

從圖1中可以看出,MTD設(shè)備分為四層(從設(shè)備節(jié)點直到底層硬件驅(qū)動),這四層從上到下依次是:設(shè)備節(jié)點、MTD設(shè)備層、MTD原始設(shè)備層和硬件驅(qū)動層。

設(shè)備節(jié)點:通過mknod在根文件系統(tǒng)/dev子目錄下建立MTD字符設(shè)備節(jié)點(主設(shè)備號為90)和MTD塊設(shè)備節(jié)點(主設(shè)備號為31)。這些節(jié)點為應(yīng)用程序訪問FLASH設(shè)備提供了通道,通過訪問此設(shè)備節(jié)點即可訪問MTD字符設(shè)備和塊設(shè)備。

MTD設(shè)備層提供了兩種不同訪問MTD原始設(shè)備的方式,即字符設(shè)備、塊設(shè)備。

MTD原始設(shè)備:為MTD的塊設(shè)備(主設(shè)備號31)和字符設(shè)備(設(shè)備號90)提供一個統(tǒng)一的底層抽象。

FLASH硬件驅(qū)動層:負責(zé)具體FLASH芯片的讀寫,向內(nèi)核注冊FLASH設(shè)備上的分區(qū)等任務(wù)。

由于目前μClinux內(nèi)核支持的ramdisk只能運行ROMFS,EXT2FS兩種文件系統(tǒng),所以JFFS2格式的FLASH分區(qū)必須通過mount命令掛載到根文件系統(tǒng)上才能使用。

2 在FLASH上建立JFFS2過程

JFFS2文件系統(tǒng)在μClinux下有兩種使用方式:一種是作為μClinux的根文件系統(tǒng),另一種是作為一般文件系統(tǒng),在系統(tǒng)啟動時或啟動以后掛載到系統(tǒng)上。針對JFFS2文件系統(tǒng)所保存的數(shù)據(jù)比較少,這里選擇后者。具體的實現(xiàn)步驟有以下幾個:添加與FLASH對應(yīng)的map driver和FLASH驅(qū)動;修改設(shè)備節(jié)點;配置內(nèi)核。

進行試驗的s3c44b0使用的FLASH是intel 28f320b,大小為4 MB,類型為NOR FLASH,工作在16 b雙字節(jié)模式。使用的μClinux包為μClinux-dist-20040408.tar.gz。

設(shè)計NOR FLASH驅(qū)動程序時,只要讓它能夠被其上層MTD原始設(shè)備層正確地識別和操作,就能保證其正常工作。現(xiàn)實NOR FLASH驅(qū)動核心是定義map_info 結(jié)構(gòu)體,它指定了NOR FLASH的基址、位寬、大小等信息及FLASH的讀寫函數(shù),見圖2。

其中:name用來在內(nèi)核中惟一標識這塊芯片的字符串;width用來訪問FLASH芯片的總線寬度;size是FLASH芯片的容量,在該芯片中用字進行讀取。其主要的函數(shù)原型為:

void(*read) (struct map_info *,unsignde long);

void(*write) (struct map_info *,const map_word,unsignde long);

void(*copy_from) (struct map_info *,void *,unsignde long,ssize_t);

void(*copy_to) (struct map_info *,unsignde long const void *,ssize_t);

2.1 添加FLASH上的map文件和FLASH的驅(qū)動

在μClinux-dist/linux-2.4.x/drivers/mtd/maps下添加自己的map文件。map文件可以根據(jù)具體的FLASH和掛載方式選擇合適的文件加以修改,本系統(tǒng)是選擇m5272c3.c修改的,并命名為s3c44b0.c。修改的關(guān)鍵點有:

(1) 定義FLASH的基地址、容量和寬度

#define WINDOW_ADDR 0x00000000

#define WINDOW_SIZE 0x00400000

#define BUSWIDTH 2

(2) 根據(jù)系統(tǒng)要求建立FLASH設(shè)備中的分區(qū)

static struct mtd_partition s3c44b0_partitions[ ] = {

{

name: "bootloader (64K)",

size: 0x00010000,

offset: 0x00000000

},

{

name: "μClinux kernel (960K)",

size: 0x00100000,

offset: 0x00010000

},

{

name: "ramdisk (1024K)"

size: 0x00100000,

offset: 0x00200000

},

{

name: "jffs2 (1024K)"

size: 0x00100000,

offset: 0x00300000

}

};

(3) FLASH芯片的內(nèi)存映射

s3c44b0x_map.map_priv_1=(unsigned long)

ioremap(WINDOW_ ADDR,WINDOW_SIZE);

// if( !s3c44b0x_m ap.m ap_priv_1){

// printk(”Failed to ioremap\n");

// return -EIO;

// }

這里的ioremap()主要是將I/O端口映射到虛擬內(nèi)存區(qū)域。對于有MMU的CPU,它會將對應(yīng)的地址映射到高端區(qū)域,不過使用的是s3c44bOX處理器,這是一款沒有MMU的處理器,其重映射就是會將端口地址按原地址返回;又由于這里的FLASH的起始地址是0x0,其映射后的起始地址也是0x0,所以ioremap()函數(shù)的返回值是0。在該系統(tǒng)中將接下來的4行注釋掉。

(4) 為了把map文件集成到μClinux配置中,需要修改

μClinux-dist/linux-2.4.x/drivers/mtd/maps/config.in file:

if [ "MYMCONFIG_S3C44B0" ];then

dep_tristate 'CFI FLASH device mapped on samsung S3C44B0' CONFIG_MTD_S3C44B0 MYMCONFIG_MTD_CFI

fi

Clinux-dist/linux-2.4.x/drivers/mtd/maps/Makefile file:

Obj-MYM(CONFIG_MTD_S3C44B0) +=s3c44b0c.o

2.2 配置內(nèi)核

選中和JFFS2文件系統(tǒng)相關(guān)的內(nèi)核選項,在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

CONFIG_MTD_CFI=Y

CONFIG_MTD_JEDECPROBE=Y

CONFIG_MTD_GEN_PROBE=Y

CONFIG_MTD_CFI_AMDSTD=Y

CONFIG_MTD_S3C44B0=Y

2.3 修改μClinux內(nèi)核并添加MTD設(shè)備

由于ROM設(shè)備和MTDBLock設(shè)備的主設(shè)備號(major)都是31,所以必須修改其中之一,在這里修改ROM的major,在μClinux-dist/linux-2.4.x/include/linux/major.h和μClinux-dist/linux-2.4.x/drives/block/blkmem.c中,把#define BLKMEM_MAJOR 31改為#define BlkMEM_MAJOR 30,在μClinux-dist/vendors/samsun/44B0/Makefile中rom的主設(shè)備號改為30并添加下面的行:

DEVICES=

tty,c,5,0 console,c5,1 cua0,c,64 cual,c,5,6,

mtd0,c,90,1 mtd1,c,90,3 mtd2,c,90,5 mtd3,c,90,0

mtdblock0,b,31,1 mtdblock1,b,31,3

mtdblock2,b,31,5 mtdblock3,b,31,0

編譯內(nèi)核后,可以看到MTD設(shè)備添加成功。

2.4 重新配置內(nèi)核

選中JFFS2文件系統(tǒng)和相關(guān)的輔助工具,編譯內(nèi)核。在File systems下選中:

CONFIG_JFFS2_FS=Y

CONFIG_JFFS2_DEBUG=2

在μClinux application Configuration下選中:

CONFIG_USER_MTDUTILS=Y,

在BusyBox下,選中cat,cp,dd,mount,umount,mkdir工具。配置內(nèi)核后,重新編譯內(nèi)核,編譯好的內(nèi)核已經(jīng)實現(xiàn)了JFFS2文件系統(tǒng)??梢允褂肕TD工具mkfs.jffs2創(chuàng)建JFFS2文件系統(tǒng)的鏡像。

如果編譯內(nèi)核前,在rc文件中加上mount-t jffs2 /dev/mtd-block3/mnt 系統(tǒng)啟動后不用再執(zhí)行掛載命令,則JFFS2 文件系統(tǒng)就被掛載到/mnt/ 目錄下。在此目錄下保存的文件可讀寫,系

統(tǒng)掉電后創(chuàng)建的文件也不會丟失。

3 結(jié) 語

JFFS2以其優(yōu)異的性能在嵌入式系統(tǒng)中被越來越廣泛的使用。這里只介紹了JFFS2以普通文件掛載的方式及其在μClinux中的應(yīng)用,解決了如何動態(tài)保存少量數(shù)據(jù)的問題。JFFS2仍存在一些不足之處,由于壓縮和解壓算法的運算,數(shù)據(jù)存取的速度慢。

參考文獻

[1]華清遠見嵌入式培訓(xùn)中心,宋寶華.Linux設(shè)備驅(qū)動開發(fā)詳解[M].北京:人民郵電出版社,2008.

[2]Kadionik:How to Use Mtd/Jees2 Under μClinux[EB/OL].http://uuu.enseirb.fr/~kadionik/embedded/μClinux/mtd/howto_mtd.html,2004.

[3]周斌,林喜榮,黃析偉.嵌入式Linux系統(tǒng)下NOR FLASH的配置和使用[J].單片機與嵌入式系統(tǒng)應(yīng)用,2004(2):82-84.

[4]王學(xué)龍.嵌入式Linux系統(tǒng)設(shè)計與應(yīng)用[M].北京:清華大學(xué)出版社,2001.

[5]黃布毅,鄭安平,陳曉雷,等.μClinux下JFFS2文件系統(tǒng)的實現(xiàn)[J].單片機與嵌入式系統(tǒng)應(yīng)用,2004(5):69-70,76.

[6]胡晨峰.JFFS2文件系統(tǒng)在μClinux中的應(yīng)用[J].電子產(chǎn)品世界,2003(7):48-51.

[7]鄭良辰.日志文件系統(tǒng)在嵌入式存儲設(shè)備上的設(shè)計和實現(xiàn)[Z].北京:中國科學(xué)院軟件研究所,2001.

[8]趙復(fù)生.JFFS2文件系統(tǒng)及其新特性介紹[EB/OL].http://www.128.ibm.com/developerworks/cn/linux/jffs2/,2005.

[9]張翔,劉鵬,戴國駿.嵌入式Linux閃存文件系統(tǒng)JFFS2的研究[J].杭州電子工業(yè)學(xué)院學(xué)報,2003,23(3):62-65.

[10]李桂良,劉發(fā)貴.JFFS2文件系統(tǒng)的關(guān)鍵技術(shù)及其在嵌入式系統(tǒng)中的應(yīng)用[J].計算機應(yīng)用,2003,23(7):135-137.

[11]陳智育.嵌入式系統(tǒng)中的FLASH文件系統(tǒng).單片機與嵌入式系統(tǒng)應(yīng)用,2002(2):5-8.

[12]代新冠,張超,田永鵬.基于S3C2440的嵌入式多媒體控制器設(shè)計.現(xiàn)代電子技術(shù),2006,29(8):19-21.

猜你喜歡
嵌入式系統(tǒng)
辦公自動化系統(tǒng)的設(shè)計
基于物聯(lián)網(wǎng)項目驅(qū)動的嵌入式系統(tǒng)教學(xué)改革的研究與實踐
嵌入式系統(tǒng)課程“中斷、異常與事件”教學(xué)實踐及啟示
面向?qū)嵺`創(chuàng)新人才培養(yǎng)的嵌入式系統(tǒng)教學(xué)研究
江陵县| 兴隆县| 宝应县| 余干县| 武乡县| 习水县| 浦江县| 德江县| 巩留县| 福鼎市| 潼南县| 拜泉县| 莱西市| 兰考县| 南陵县| 泰安市| 镇原县| 甘南县| 翼城县| 临沧市| 北流市| 广安市| 梧州市| 鄱阳县| 长海县| 海丰县| 磐石市| 英吉沙县| 梧州市| 东辽县| 城固县| 满洲里市| 东乡| 将乐县| 德保县| 延庆县| 广灵县| 诸暨市| 四平市| 大城县| 察雅县|