原创 jffs2文件系统的实现[10][15]

2008-5-28 23:08 2867 1 1 分类: MCU/ 嵌入式

jffs2文件系统的实现[10][15]<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


jffs2文件系统是瑞典的Axis通信公司开发的一种基于Flash的日志文件系统。所谓日志文件系统,其工作原理是跟踪记录文件系统的变化,并将变化内容记录入日志,并保存在磁盘分区。写操作中断,系统重启时,会根据日志记录来恢复中断前的写操作。


jffs2文件系统有两种使用方法:1.直接作为根文件系统;2.作为普通文件系统启动之后挂载到romfs根文件系统下,本次设计选择了第二种。


1.    添加flash驱动程序


MTD在启动时必须能够正确识别芯片的类型。本文使用的SST39VF160是一款Nor FlashNor Flash分为CFI接口和JDEDEC接口,而在CFI标准接口中并不包含SST39VF160,所以为了正确识别SST39VF160,需要在MTD的芯片驱动层程序中添加SST39VF160的芯片信息,主要添加芯片名,容量,分区起始地址及大小,擦除扇区的大小等信息。系统在CFI标准接口上无法识别Flash芯片时就会选用jedec _ probe程序来继续监测,根据上面添加的内容就可以正确的识别SST39VF160


 


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


                       nor flash硬件电路原理图


2.创建针对具体SST39VF160Map文件


uClinux-dist\linux-2.4.x\drivers\mtd\maps目录下面的每一个map文件为一个具体的MTD原始设备的相关信息,包括设备的起始物理地址、大小、分区情况、读写函数、初始化以及清除程序。系统启动时正确识别Flash芯片之后就要根据该map文件中的这些信息来对Flash进行初始化工作。本文根据m<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />5272c3.c创建s3c44b0.c文件,以下是根据SST39VF160芯片而作的修改:


(1)定义Flash相关信息


包括定义Flash的物理地址,容量,以及总线带宽


(2)增加分区信息static struct mtd_partition s3c44b0_partitions增加的分区表结构体表明,Flash被分为两个区,从0开始的1600K保留给了bootloaderkernel(内核)以及romfs文件系统,并且设为只读(MTD_WRITEABLE为标志)0x1900000开始的448K作为jffs2分区。


(3)设置擦除的大小为4K(SST39VF160数据手册上说明了它的快擦除大小为4K)


3.配置内核和应用程序选项


(1)把修改的Map文件集成到uClinux的配置中:


通过修改uClinux-dist\linux-2.4.x\drivers\mtd\maps\Makefile,把修改的Map文件集成到uClinux的配置中


(2)配置uClinux内核选项


增加MTDJFFS2相关选项


(3)配置应用程序选项


添加ERASEERASEALLMKFSJFFS2工具用来实现擦除和制作jffs2文件系统镜像


4.添加MTD设备


默认情况下,ROM设备和MTD Block设备的主设备号(MAJOR)都是31,为了解除冲突,我们修改MTD Block的主设备号为30而保持ROM设备的主设备号不变。具体做法为,在uClinux-dist\linux-2.4.x\include\linux\mtd\mtd.h中,将#define MTD_BLOCK_MAJOR 31中的31改为30。然后应添加MTD设备节点到uClinux-dist\venders\myboard\Makefile文件中。需要说明的是,MTD字符设备的主设备号为90,次设备号为024……次设备号为偶数表示为读写设备,如果为奇数则表明为只读设备。


5.S3C44B0不能进行地址重映射的问题


S3C44B0不具备地址重映射功能,也就是说Flash的地址始终是0,而中断向量表必须也要放在0位置。当对flash操作时(如擦写操作),如果发生中断(比如串口和以太网口接收数据),那么中断就会访问flash,就造成冲突导致死机,使得擦写操作无法完成。这一问题的简单的解决方法是,在对flash操作时添加代码save_flags(flags)cli();关闭中断,操作完毕后添加代码restore_flags(flags)开启中断


4.3.3 jffs2文件系统的测试方法


将编译完成的zImage(内核镜像)romfs.img(romfs根文件系统)用相关的flash烧写工具烧入到Flash中,观察启动信息。


通过启动信息查看是否启动时MTDJFFS2是否已经起到作用,系统正确识别了Flash并且创建了两个MTD分区,进入Shell之后测试jffs2文件系统的挂载:主要看jffs2分区已经成功挂载到/mnt目录下面。测试表明,jffs2分区已经成功挂载到/mnt目录下面了。如果将mount命令添加到uClinux启动配置文件rc中,那么每次系统启动之后jffs2分区便会自动挂载到mnt目录下面,并且mnt目录下面所进行的操作断电之后依然可以保存。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
1
关闭 站长推荐上一条 /1 下一条