在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > uClinux下Nor Flash的JFFS2文件系統(tǒng)構(gòu)建

            uClinux下Nor Flash的JFFS2文件系統(tǒng)構(gòu)建

            作者: 時間:2004-12-11 來源:網(wǎng)絡 收藏
            摘要:目前的嵌入式多使用FLASH作為主存,因此,如何有效管理FLASH上的數(shù)據(jù)非常重要。文章以SST39VF160芯片為例,討論了在 上建立uClinux的的一般步驟,從而為FLASH上的數(shù)據(jù)管理提供了理想的選擇方式。

            關鍵詞:uClinux; ;MTD;;

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

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

            1 JFFS2系統(tǒng)簡介

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

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

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

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

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

            2?。剩疲疲樱驳讓樱停裕尿?qū)動設計

            本文采用的系統(tǒng)以三星公司的SND-100為母板,CPU為ARM7TDMI芯片S3C4510B,16M的SDRAM,Nor Flash為SST39VF160,容量為1M16bit,速度為70ns,通過16位數(shù)據(jù)總線與CPU交換數(shù)據(jù),擦寫次數(shù)典型值為10萬次。

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

            (1) 定義SST39VF160在系統(tǒng)中的起始地址、大小、總線寬度

            #define WINDO DDR 0x1000000|0x04000000 //注意FLASH分區(qū)地址必須是non-cacheble

            #define WINDOW SIZE 0x200000

            #define BUSWIDTH 2

            (2) 定義SST39VF160分區(qū)

            典型的內(nèi)存分區(qū)應包括:內(nèi)核引導區(qū)、Linux內(nèi)核區(qū)、應用區(qū)。其中內(nèi)核引導區(qū)用來保存內(nèi)核加載程序,Linux內(nèi)核區(qū)存放的是經(jīng)過壓縮的uClinux內(nèi)核,應用區(qū)則用來保存用戶的數(shù)據(jù)和應用程序,該區(qū)設為我們要采用的JFFS2文件系統(tǒng)。具體如下:

            static struct mtd_partition s3c4510_partitions[]={

            {

            name: ″bootloader(128K)″,

            size: 0x20000,

            offset: 0x0000,

            mask_flags:MTD_WRITEABLE //設置成只讀區(qū)域

            },

            {

            name: ″uClinux_kernel(832K)″,

            size: 0xd0000,

            offset: 0x20000,

            },?

            {

            name: ″jffs2 (1088K)?″,

            size: 0x110000,

            offset: 0xf0000

            }

            };?

            (3) 定義SST39VF160字節(jié)、半字、字的讀寫操作函數(shù)。

            (4) 初始化SST39VF160函數(shù)int_init init_s3c4510b()。

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

            3 內(nèi)核相關配置的設定

            3.1 內(nèi)核配置文件設置

            為使內(nèi)核支持JFFS2,需在內(nèi)核配置選項菜單里選擇相關選項。首先把SST39VF160的MTD驅(qū)動加入配置菜單。并在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塊設備配置

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

            接著應添加MTD設備節(jié)點到/vender/--你所使用的目標機類型--/Makefile文件中。其中字符設備的主設備號為90,次設備號為0、2、4、6...(奇數(shù)次設備號為只讀設備),塊設備的主設備號為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

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

            當系統(tǒng)啟動時,可以看到以下信息:

            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)建文件系統(tǒng)鏡像文件

            系統(tǒng)會編譯生成JFFS2的輔助工具:mkfs.jffs2、eraseall、erase。其中mkfs.jffs2會產(chǎn)生JFFS2文件系統(tǒng)鏡像的工具,eraseall和erase用來對FLASH芯片的擦除。mkfs.jffs的使用方法如下:mkfs.jffs -d根目錄?-b| l??-e 擦除塊大小??-o 輸出文件??-v ?0-9???-q?。

            另外,為了使系統(tǒng)在啟動時自動掛載建好的JFFS2文件系統(tǒng),在啟動腳本里應加入:

            mount -t jffs2 /dev/mtdblock2 /mnt4 結(jié)束語

            本文討論了在uClinux下建立基于Nor Flash的JFFS2的文件系統(tǒng)的一般步驟。Nor Flash的特性決定了它在對數(shù)據(jù)存儲要求不高的嵌入式系統(tǒng)中有著廣泛的應用,因此JFFS2文件系統(tǒng)對Flash上的數(shù)據(jù)管理非常方便。對于一些高端的掌上設備來說,Nand Flash更為適合,其單元存儲密度比較高,成本較低,這樣系統(tǒng)可以在不增加成本的情況下擴大存儲容量。目前有一種新型的文件系統(tǒng)YAFFS更適于Nand Flash,本文不再予以討論。



            評論


            相關推薦

            技術專區(qū)

            關閉