你现在位置:首页>技术论文>软件知识>正文
uClinux下NorFlash的JFFS2文件系统构建
日期:2008-2-20 23:14:15 来源:本站整理  
点击: 作者:未知
点击【】放大字体.

摘要:目前的嵌入式系统多使用FLASH作为主存,因此,如何有效管理FLASH上的数据非常重要。文章以SST39VF160芯片为例,讨论了在Nor Flash上建立uClinux的JFFS2文件系统的一般步骤,从而为FLASH上的数据管理提供了理想的选择方式。

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

关键词:uClinux;Nor Flash;MTD;JFFS2;文件系统

WWW_P※LCJS_COM-PLC-)技.术_网

嵌入式系统正随着Internet的发展而在各个领域得到广泛的应用,作为嵌入式应用的核心,嵌入式Linux以其自由软件特性正日益被人们看好。Linux具有内核小、效率高、源代码开放等优点,还内涵了完整的TCP/IP网络协议,因此非常适于嵌入式系统的应用。而作为专门运行于没有MMU的微处理器的嵌入式操作系统,uClinux更是得到广泛应用。

WWW_PL※CJS_COM-PLC-技.术_网

当前的嵌入式系统开发,需要方便灵活的使用Flash。NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NORflash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。NOR的特点是芯片内执行XIP eXe-cute InPlace ,这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,因此在嵌入式系统得到广泛的应用。

WWW_P※LCJS_CO※M-PLC-技-.术_网

WWW_P※LCJS_COM-PLC-)技.术_网

1 JFFS2文件系统简介
WWcW_PLCJS_COM-PLC-技.术_网

uClinux通常默认ROMFS作为根文件系统,它相对于一般的EXT2文件系统具有节约空间的优点。但是ROMFS是一种只读的文件系统,不支持动态擦写保存。虽然对于需要动态保存的数据可以采用虚拟ram盘的方法来保存,但当系统掉电后,ram盘的内容将全部丢失,而不能永久保存,因此需要实现一个可读写的文件系统。JFFS2文件系统便是一个很好的选择。

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

JFFS文件系统是瑞典Axis通信公司开发的一种基于Flash的日志文件系统,它在设计时充分考虑了Flash的读写特性和用电池供电的嵌入式系统的特点,在这类系统中必需确保在读取文件时,如果系统突然掉电,其文件的可靠性不受到影响。对Red Hat的DavidWoodhouse进行改进后,形成了JFFS2。主要改善了存取策略以提高FLASH的抗疲劳性,同时也优化了碎片整理性能,增加了数据压缩功能。需要注意的是,当文件系统已满或接近满时,JFFS2会大大放慢运行速度。这是因为垃圾收集的问题。

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

JFFS2的底层驱动主要完成文件系统对Flash芯片的访问控制,如读、写、擦除操作。在Linux中这部分功能是通过调用MTD(memory technologydevice内存技术设备)驱动实现的。相对于常规块设备驱动程序,使用 MTD 驱动程序的主要优点在于 MTD驱动程序是专门为基于闪存的设备所设计的,所以它们通常有更好的支持、更好的管理和更好的基于扇区的擦除和读写操作的接口。MTD相当于在硬件和上层之间提供了一个抽象的接口,可以把它理解为FLASH的设备驱动程序,它主要向上提供两个接口:MTD字符设备和MTD块设备。通过这两个接口,就可以象读写普通文件一样对FLASH设备进行读写操作。经过简单的配置后,MTD在系统启动以后可以自动识别支持CFI或JEDEC接口的FLASH芯片,并自动采用适当的命令参数对FLASH进行读写或擦除。

WWW_PLCJS@_COM%-PLC-技.术_网

JFFS2在uClinux中有两种使用方式,一种是作为根文件系统,另一种是作为普通文件系统在系统启动后被挂载。考虑到实际应用中需要动态保存的数据并不多,且在Linux系统目录树中,根目录和/usr等目录主要是读操作,只有少量的写操作,但是大量的读写操作又发生在/var和/tmp目录(这是因为在系统运行过程中产生大量log文件和临时文件都放在这两个目录中),因此,通常选用后一种方式。根文件指的是Romfs、var和/tmp,目录采用Ramfs,当系统断电后,该目录所有的数据都会丢失。

WWW_PLCJS@_COM%-PLC-技.术_网

综上所述,通常在uClinux下采用的文件系统构成如图1所示。对于本文来说,图中Romfs和Ramfs两个文件系统的实现是很方便的,主要需要实现的是Nor Flash的底层MTD驱动,下面就以SST39VF160芯片为例来介绍MTD的驱动设计方法。

WW.W_PLC※JS_C,OM-PL,C-技.术_网

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

2 JFFS2底层MTD驱动设计
WWW_PLCJS@_COM%-PLC-技.术_网

本文采用的系统以三星公司的SND-100为母板,CPU为ARM7TDMI芯片S3C4510B,16M的SDRAM,NorFlash为SST39VF160,容量为1M×16bit,速度为70ns,通过16位数据总线与CPU交换数据,擦写次数典型值为10万次。

P.L.C.技.术.网——可编程控制器技术门户

在\linux-2.4.x\drivers\mtd\maps目录下,每一个文件都是一个具体的MTD原始设备的相关信息,包括该MTD原始设备的起始物理地址、大小、分区情况、读写函数、初始化和清除程序。设计时,需要对SST39VF160编写相关的程序,假设为S3C4510B.C。则需要进行以下几点操作:

WW.W_PLCJS_COM-PLC-技.术_网

(1) 定义SST39VF160在系统中的起始地址、大小、总线宽度

W1WW_P4LCJS_COM-PLC-技.术_网

#define WINDO DDR 0x1000000|0x04000000 //注意FLASH分区地址必须是non-cacheble

——可——编——程——控-制-器-技——术——门——户

#define WINDOW SIZE 0x200000

W1WW_P4LCJS_COM-PLC-技.术_网

#define BUSWIDTH 2

WWW.PLCJS.COM——可编程控制器技术门户

(2) 定义SST39VF160分区

WW.W_PLC※JS_C,OM-PL,C-技.术_网

典型的内存分区应包括:内核引导区、Linux内核区、应用区。其中内核引导区用来保存内核加载程序,Linux内核区存放的是经过压缩的uClinux内核,应用区则用来保存用户的数据和应用程序,该区设为我们要采用的JFFS2文件系统。具体如下:

WWW_P※LCJS_CO※M-PLC-技-.术_网

static struct mtd_partition s3c4510_partitions[]={

WWW_PLCJS@_COM%-PLC-技.术_网

{

W1WW_P4LCJS_COM-PLC-技.术_网

name: ″bootloader(128K)″,

WWW_PL※CJS_COM-PLC-技.术_网

size: 0x20000,

WWW_PLCJS_COM-PLC-技.术_网

offset: 0x0000,

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

mask_flags:MTD_WRITEABLE //设置成只读区域

——可——编——程——控-制-器-技——术——门——户

},

WWW_PLCJS@_COM%-PLC-技.术_网

{

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

name: ″uClinux_kernel(832K)″,

——可——编——程——控-制-器-技——术——门——户

size: 0xd0000,

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

offset: 0x20000,

WW.W_PLC※JS_C,OM-PL,C-技.术_网

},

WWW_PLC※JS_COM-PmLC-技.术_网

{

WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

name: ″jffs2 (1088K) ″,

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

size: 0x110000,

plcjs.技.术_网

offset: 0xf0000

WW.W_PLCJS_COM-PLC-技.术_网

}

WWcW_PLCJS_COM-PLC-技.术_网

};

WWW_PLC※JS_COM-PmLC-技.术_网

(3) 定义SST39VF160字节、半字、字的读写操作函数。

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

(4) 初始化SST39VF160函数int_init init_s3c4510b()。

WWW.PLCJS.COM——可编程控制器技术门户

该操作主要包括两个方面:第一是调用domap probe()检测搜索MTD设备。通常检测方式有两种:cfi probe和jedecprobe,这里采用后一种,该方法在jedec_probe.c文件中定义。另外,jedec probe.c中定义了各种jedecprobe类型芯片的信息,有些linux版本没有包含SST39VF160,需要手动添加;而操作的第二方面则是调用add_mtd_partitions()以将your_partiton的各个分区加入mtd_table。

本新闻共2页,当前在第11 2  
WWW_P※LCJS_COM-PLC-)技.术_网

评论内容
载入中...
载入中...
P
L
C



|










|


P
L
C









·最新招聘信息
·最新求职信息
·推荐产品
·推荐厂商
·栏目热门排行
·站内热门排行