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 Flash,Nor 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.创建针对具体SST39VF160的Map文件
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保留给了bootloader,kernel(内核)以及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内核选项
增加MTD,JFFS2相关选项
(3)配置应用程序选项
添加ERASE,ERASEALL,MKFSJFFS2工具用来实现擦除和制作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,次设备号为0、2、4……次设备号为偶数表示为读写设备,如果为奇数则表明为只读设备。
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中,观察启动信息。
通过启动信息查看是否启动时MTD和JFFS2是否已经起到作用,系统正确识别了Flash并且创建了两个MTD分区,进入Shell之后测试jffs2文件系统的挂载:主要看jffs2分区已经成功挂载到/mnt目录下面。测试表明,jffs2分区已经成功挂载到/mnt目录下面了。如果将mount命令添加到uClinux启动配置文件rc中,那么每次系统启动之后jffs2分区便会自动挂载到mnt目录下面,并且mnt目录下面所进行的操作断电之后依然可以保存。
文章评论(0条评论)
登录后参与讨论