在uClinux下建立基於NOR Flash的JFFS2的文件系統

admin @ 2014-03-25 , reply:0

         嵌入式系統正隨著Internet的發展而在各個領域得到廣泛的應用,作為嵌入式應用的核心,嵌入式Linux以其自由軟體特性正日益被人們看好。Linux具有內核小、效率高、源代碼開放等優點,還內涵了完整的TCP/IP網路協議,因此非常適於嵌入式系統的應用。而作為專門運行於沒有MMU的微處理器的嵌入式操作系統,uClinux更是得到廣泛應用。
當前的嵌入式系統開發,需要方便靈活的使用Flash。NOR和NAND是現在市場上兩種主要的非易失快閃記憶體技術。Intel於1988年首先開發出NOR Flash技術,徹底改變了原先由EPROM和EEPROM一統天下的局面。NOR的特點是晶元內執行??XIPexe-Cute In Place???這樣應用程序可以直接在Flash快閃記憶體內運行,不必再把代碼讀到系統ram中。NOR的傳輸效率很高,在1~4MB的小容量時具有很高的成本效益,因此在嵌入式系統得到廣泛的應用。

1、JFFS2文件系統簡介
       uClinux通常默認ROMFS作為根文件系統,它相對於一般的ext2文件系統具有節約空間的優點。但是ROMFS是一種只讀的文件系統,不支持動態擦寫保存。雖然對於需要動態保存的數據可以採用虛擬ram盤的方法來保存,但當系統掉電后,ram盤的內容將全部丟失,而不能永久保存,因此需要實現一個可讀寫的文件系統。JFFS2文件系統便是一個很好的選擇。
JFFs文件系統是瑞典AxIs通信公司開發的一種基於Flash的日誌文件系統,它在設計時充分考慮了Flash的讀寫特性和用電池供電的嵌入式系統的特點,在這類系統中必需確保在讀取文件時,如果系統突然掉電,其文件的可靠性不受到影響。對Red Hat的David Woodhouse進行改進后,形成了JFFS2。主要改善了存取策略以提高Flash的抗疲勞性,同時也優化了碎片整理性能,增加了數據壓縮功能。需要注意的是,當文件系統已滿或接近滿時,JFFS2會大大放慢運行速度。這是因為垃圾收集的問題。
JFFS2的底層驅動主要完成文件系統對Flash晶元的訪問控制,如讀、寫、擦除操作。在Linux中這部分功能是通過調用MTD(memory technology device內存技術設備)驅動實現的。相對於常規塊設備驅動程序,使用 MTD 驅動程序的主要優點在於 MTD 驅動程序是專門為基於快閃記憶體的設備所設計的,所以它們通常有更好的支持、更好的管理和更好的基於扇區的擦除和讀寫操作的介面。MTD相當於在硬體和上層之間提供了一個抽象的介面,可以把它理解為Flash的設備驅動程序,它主要向上提供兩個介面:MTD字元設備和MTD塊設備。通過這兩個介面,就可以象讀寫普通文件一樣對Flash設備進行讀寫操作。經過簡單的配置后,MTD在系統啟動以後可以自動識別支持CFI或JEDEC介面的Flash晶元,並自動採用適當的命令參數對Flash進行讀寫或擦除。
JFFS2在uClinux中有兩種使用方式,一種是作為根文件系統,另一種是作為普通文件系統在系統啟動后被掛載。考慮到實際應用中需要動態保存的數據並不多,且在Linux系統目錄樹中,根目錄和/usr等目錄主要是讀操作,只有少量的寫操作,但是大量的讀寫操作又發生在/var和/tmp目錄(這是因為在系統運行過程中產生大量log文件和臨時文件都放在這兩個目錄中),因此,通常選用后一種方式。根文件指的是ROMFS、var和/tmp,目錄採用ramfs,當系統斷電后,該目錄所有的數據都會丟失。
綜上所述,通常在uClinux下採用的文件系統構成如圖1所示。對於本文來說,圖中ROMFS和ramfs兩個文件系統的實現是很方便的,主要需要實現的是NOR Flash的底層MTD驅動,下面就以sst39VF160晶元為例來介紹MTD的驅動設計方法。

2、JFFS2底層MTD驅動設計
本文採用的系統以三星公司的SND-100為母板,CPU為ARM7 TDMI晶元s3c4510b,16M的sdram,NOR Flash為sst39VF160,容量為1M X 16bit,速度為70ns,通過16位數據匯流排與CPU交換數據,擦寫次數典型值為10萬次。
在\Linux-2.4.x\drivers\MTD\maps目錄下,每一個文件都是一個具體的MTD原始設備的相關信息,包括該MTD原始設備的起始物理地址、大小、分區情況、讀寫函數、初始化和清除程序。設計時,需要對sst39VF160編寫相關的程序,假設為s3c4510B。則需要進行以下幾點操作:

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


(2) 定義sst39VF160分區
典型的內存分區應包括:內核引導區、Linux內核區、應用區。其中內核引導區用來保存內核載入程序,Linux內核區存放的是經過壓縮的uClinux內核,應用區則用來保存用戶的數據和應用程序,該區設為我們要採用的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位元組、半字、字的讀寫操作函數。
(4) 初始化sst39VF160函數Int_InIt InIt_s3c4510B()。
    該操作主要包括兩個方面:第一是調用do map probe()檢測搜索MTD設備。通常檢測方式有兩種:cfi probe和jedec probe,這裡採用后一種,該方法在jedec_probe.c文件中定義。另外,jedec probe.c中定義了各種jedec probe類型晶元的信息,有些linux版本沒有包含SST39VF160,需要手動添加;而操作的第二方面則是調用add_mtd_partitions()以將your_partiton的各個分區加入mtd_table。

3、內核相關配置的設定
3.1 內核配置文件設置
為使內核支持JFFS2,需在內核配置選項菜單里選擇相關選項。首先把sst39VF160的MTD驅動加入配置菜單。並在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塊設備配置
下面是修改系統塊設備的主設備號。默認情況下,MTD BLOCK主設備號為31,與BLKMEM的主設備號衝突,因此 修改\MTD\MTD.h中 MTD BLOCK MAJOR的值為30。
接著應添加MTD設備節點到/vender/--你所使用的目標機類型--/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 以對內核進行編譯。
當系統啟動時,可以看到以下信息:

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 創建文件系統鏡像文件
系統會編譯生成JFFS2的輔助工具:mkfs.JFFS2、eraseall、erase。其中mkfs.JFFS2會產生JFFS2文件系統鏡像的工具,eraseall和erase用來對Flash晶元的擦除。mkfs.JFFs的使用方法如下:mkfs.JFFs -d根目錄??-b| l??-e 擦除塊大小???-o 輸出文件???-v ??0-9??-q???
另外,為了使系統在啟動時自動掛載建好的JFFS2文件系統,在啟動腳本里應加入:
mount -t JFFS2 /dev /MTD block2 /mnt

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




[admin via 研發互助社區 ] 在uClinux下建立基於NOR Flash的JFFS2的文件系統已經有1314次圍觀

http://cocdig.com/docs/show-post-42716.html