您的位置首页>企业动态>

在嵌入式Linux上实现JFFS文件系统

导读大家好,我是极客范的本期栏目编辑小友,现在为大家讲解在嵌入式Linux上实现JFFS文件系统问题。通过在嵌入式操作系统uClinux上实现可读JFFS

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解在嵌入式Linux上实现JFFS文件系统问题。

通过在嵌入式操作系统uClinux上实现可读JFFS文件系统的实例,介绍了在嵌入式系统中使用Flash芯片的方法。

关键词:嵌入式系统;uClinux闪光;JFFS文件系统

0简介

近年来,随着电子技术的不断进步,嵌入式系统的发展成为一个热点,而Linux作为一个自由软件,也得到了很大的发展。嵌入式系统与Linux的结合越来越受到人们的重视。Linux具有内核小、效率高、源代码开放等优点。它还包含一个完整的tcp/ip网络协议,非常适合嵌入式系统。作为一款专为嵌入式微处理器设计的小型化linux,uClinux是嵌入式Linux的优秀代表。在嵌入式系统的发展中,Flash芯片以相对较低的价格提供了高可靠性和高密度的存储,已经成为嵌入式系统的重要组成部分。在很多嵌入式系统中,操作系统和应用程序直接固化在Flash上。当系统启动时,代码开始直接在闪存上运行。

1在嵌入式系统中使用闪存

目前,嵌入式系统的开发需要方便灵活地使用Flash。以嵌入式网络服务器为例。在运行过程中,需要动态保存一些数据,当系统重启时,保存的数据仍然存在。例如,嵌入式处理器应用于工业控制领域时,整个系统可能集成在一个小电路板上,控制过程中需要动态改变和保存一些重要的工艺参数,但使用硬盘等存储介质是不现实的。在这种情况下,用Flash做ROM只保存系统代码是“大材小用”,我们需要充分发挥Flash的可擦除优势,在系统运行时动态擦除Flash保存数据。根据嵌入式系统的多样性、灵活性和强专用性等特点,人们可以利用嵌入式操作系统的软件复用优势,找到一种方便快捷的方式使用Flash来缩短开发时间,提高系统性能。嵌入式Linux提供了这样的捷径。Linux得到了全世界自由软件开发者的支持,这使得在嵌入式Linux上使用Flash变得非常容易。

2 JFFS文件系统简介

我们使用的uClinux系统使用ROMFS作为根文件系统,与一般的EXT2文件系统相比,具有节省空间的优势。但是,ROMFS是只读文件系统,不支持动态擦除和保存。对于系统需要动态保存的数据,只能使用虚拟ram磁盘(ram磁盘使用EXT2文件系统)。

为了解决ROMFS文件系统的问题,我们可以使用JFFS文件系统(日志闪存文件系统)。JFFS文件系统是瑞典(www.axis.com)Axis communication s在GNU通用公共许可证下发布的自由软件,主要用于嵌入式Linux。我们只需要将JFFS文件系统添加到我们的嵌入式Linux中,并做一些更改来使用JFFS文件系统。通过JFFS文件系统,可以使用Flash保存数据,即使用Flash作为系统的硬盘。你可以像操作硬盘上的文件一样操作闪存芯片上的文件和数据。系统的运行参数可以实时存储在Flash芯片中,系统断电后数据仍会存储在Flash芯片中。

作为一种EEPROM,闪存可以分为两种主要类型:或非闪存和与非闪存。在未使用的闪存中,每个位的值为逻辑1,对闪存的写入操作是将特定位的逻辑1更改为逻辑0。擦除是将逻辑1变为逻辑0。闪存的数据存储以块的形式组织。Flash只能整块擦除,而Flash的寿命是按擦除次数计算的,一般每块擦除10万次。为了确保一个块不会比其他块更早达到其寿命,有必要尽可能在所有块之间平均分配擦除时间,这被称为“磨损平衡”。JFFS文件系统是一个“附加”文件系统,新数据总是附加到最后写入的数据上。这种“加法”结构自然实现了“亏损平衡”。

要加入JFFS文件系统,需实现Linux操作系统操作系统下对闪光芯片的驱动Axis,CommunicaTIons公司提供了实现代码。在笔者的系统中,代码包括uClinux/Linux/驱动程序/块/闪存。c和uClinux/Linux/include/Linux/flash。h。

在闪光灯c中的设备的初始化函数flash_init()里,将闪光作为块设备向系统注册。

# ifdef _ CONFIG _ BLK _ DEV _ FLash

if(register_blkdev(MAJOR_NR,DEVICE_NAME,flash _ block _ fops)){ 0

printk(KERN _ ERR DEVICe _ NAME ' :无法获取主要%d ',

MAjor _ NR);

退货-EBUSY;

}

 blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST; blk_size[MAJOR_NR] = flash_sizes; blksize_size[MAJOR_NR] = flash_blk_sizes; read_ahead[MAJOR_NR] = 1; printk("Flash/ROM block device v2.1, (c) 1999 Axis CommunicaTIons AB");#endif

3  开发环境简介    我们采用的是宿主机+目标板的开发模式,宿主机为PC+redhat7.2 ,目标板为Motorola Coldfire5272+uClinux, uClinux版本为2.0.38,在宿主机上将uClinux和应用程序编译后,下载到目标板的Flash中运行。我们使用的Flash是2片AMD AM29LV160BT,大小为2M字节,工作在16bit双字节模式。对于Motorola Coldfire5272,其RAM,Flash,外设I/O 参与统一平坦编码,也没有地址变换。2片FLASH的地址范围设置为:0xffb00000-0xffcfffff 和0xffd00000-0xffefffff。每片FLASH共有共35个扇区,除前四个扇区不规则,大小分别为:16K,8K,8K,32K 外,剩余31个扇区均为64K字节大小。

4  实现JFFS 文件系统的实例    为实现Flash上的JFFS文件系统,我们需要:在内核中加入对JFFS文件系统和Flash设备的支持;针对具体的Flash 芯片修改设备驱动程序;生成设备节点并将JFFS文件系统挂接到Flash 设备上。4.1  在内核中加入对JFFS文件系统和FLASH 设备的支持    标准 Linux可以以模块的形式加载各种类型的设备驱动,要求在设备驱动中编制两个入口点:init_module() 和 cleanup_module() ; uClinux 2.0 内核不支持内核模块 LKM(loadable kernel modules),设备驱动及文件系统要静态地编译进内核。我们需要:

 

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。