jffs2文件系统及新特性介绍 嵌入式Linux中JFFS2文件系统的实现

1 文件系统

文件系统是操作系统最重要的部分之一,它为操作系统提供了一种结构化存储和管理数据的方法。文件系统的主要功能是管理数据的物理存储,并为用户提供访问数据的接口。用户程序建立在文件系统之上,通过文件系统访问数据,而不必直接操作物理存储设备。

原有的操作系​​统一般只支持单一的文件系统,文件系统与操作系统内核关系密切。Linux操作系统的文件系统结构是树状的,在根目录“/”下有很多子目录,每个目录都可以使用不同的文件系统类型。Linux中的文件不仅仅指普通的文件和目录,还将设备视为一种特殊的文件。因此,每个不同的设备在逻辑上都可以看作不同的文件系统。

在Linux操作系统中,为了支持多种不同的文件系统,采用了虚拟文件系统(VFS,Visual Filesystem Switch)技术。虚拟文件系统是对多种实际文件系统的公共功能的抽象,它屏蔽了各种文件系统实现细节的差异,为用户程序访问文件系统提供统一、抽象、标准的接口,如open()、read()、write()等。这样,用户程序就不需要关心所操作的具体文件属于哪个文件系统,也不需要关心这个文件系统是如何设计和实现的。对所有文件的访问方式都是完全相同的。VFS与实际文件系统的关系如图1所示。

2 闪存

Flash 存储器凭借高可靠性、高存储密度、价格低廉、非易失性、易擦写等优点,取代了传统的 EPROM 和 EEPROM,在嵌入式系统中得到了广泛的应用。Flash 存储器可以分为若干个块,每个块由若干个页组成。Flash 的擦除操作以块为单位进行,而读写操作则以页为单位进行。Flash 存储器在写入之前必须擦除目标块。根据所采用的制造工艺不同,Flash 存储器主要分为 Nor Flash 和 Nand Flash。

1)Nor Flash。

Nor Flash通常容量较小,其主要特点是片内执行(XIP,eXecute In Place),即程序代码可以直接在Flash中运行,而不需要将代码读到RAM中执行。Nor Flash具有RAM接口,访问方便。其缺点是擦除电路复杂,写入速度和擦除速度比较慢,最大擦写次数在10万次左右,典型块大小为128kB。

2)Nand Flash。

Nand Flash通常容量大,存储密度高,降低了单价。Nand Flash块大小较小,典型大小为8kB,擦除速度快,使用寿命较长,最大擦写次数可达100万次,但其访问接口为复杂的I/O口,另外坏块、位反转多,对驱动程序的要求高。由于Nor Flash和Nand Flash各有特点,用途也不同,Nor Flash一般用于存储较小的代码,而Nand Flash用于存储较大的数据。

3 Flash文件系统

在嵌入式系统中,传统的文件系统如ext2也可以运行在Flash上​​,但是这类文件系统没有考虑到Flash存储器的物理特性和使用特性。例如,Flash存储器每个块的最大擦写次数是有限的,如果能均匀地使用每个块,可以延长Flash整体的寿命,这就需要有磨损均衡功能;为了提高Flash存储器的利用率,还应该有收集存储空间碎片的功能;在嵌入式系统中,需要考虑系统意外断电的情况,因此文件系统应该具有断电保护功能,保证系统在意外断电的情况下不会丢失数据。因此,在Flash存储设备上,采用专门针对Flash存储器的要求而设计的JFFS2(Journaling Flash File System Version 2)文件系统更为合适。

3.1 日志文件系统

JFFS2 是一种日志文件系统。在日志文件系统中,所有文件系统内容的改变,比如文件的写操作,都会被记录在日志中。每隔一段时间,文件系统就会更新文件的实际内容,然后删除这部分日志并重新开始记录。如果文件内容的改变操作因为系统意外的错误而中断,比如断电,系统重启时会根据日志继续之前的操作。这样系统数据就更加安全,不会因为系统意外的错误而丢失文件内容。

3.2 MTD 驱动

JFFS2建立在MTD(Memory Technology Devices)技术的基础上。MTD是专门为访问Flash存储设备而设计的Linux子系统,它提供了一系列对Flash操作的标准接口,可以更好地支持Flash的擦除、读写操作。通过MTD技术,可以将硬件驱动设计和系统程序设计分开。为了使用JFFS2文件系统,需要将MTD子系统编译进内核。MTD子系统提供了MTD_CHAR和MTD_BLOCK两个模块用于访问Flash。MTD_CHAR代表Flash为字符设备,与之关联的设备文件为/dev/mtd0等;MTD_BLOCK代表Flash为块设备,与之关联的设备文件为/dev/mtdblock0等;JFFS2文件系统建立在MTD_BLOCK模块的基础上。

3.3 JFFS2文件系统

JFFS(Journaling Flash File System)是由瑞典Axis Communications公司专门针对嵌入式系统中Flash存储器的特点而设计的日志文件系统。Redhat公司的David Woodhouse在JFFS基础上进行了改进,发布了JFFS2(Journaling Flash File System Version 2)。与JFFS相比,JFFS2支持更多的节点类型,提高了磨损均衡和碎片收集能力,增加了对硬链接的支持。JFFS2还增加了数据压缩功能,更利于在体积较小的Flash中使用。与ext2等传统Linux文件系统相比,JFFS2处理擦除和读写操作的效率更高,并有完善的断电保护功能,使存储的数据更加安全。在嵌入式系统中使用JFFS2文件系统几乎没有什么缺点,只是在文件系统快满的时候,JFFS2会因为碎片收集而变慢。

4 JFFS2文件系统的实现

本文采用的目标板CPU为韩国三星公司的S3C2410X,这是一款基于ARM920T内核的嵌入式微处理器;采用的Flash存储器为Intel公司的Strata Flash系列的E28F128,是典型的Nor Flash芯片,容量为16MB;本文采用的操作系统内核版本为嵌入式系统中广泛使用的Linux-2.4.18-rmk7-pxal。

4.1 内核修剪

首先进入drivers/mtd/maps/目录,写入Flash芯片的map文件,例如文件名为s3c2410-strata.c。在map文件中需要定义Flash基地址、大小、宽度、分区表、读写函数、初始化和释放函数等。分区表示例如下:

静态结构mtd_partition s3c2410_partitions[] =

名称:“引导加载程序”

大小:0x00030000,

报价:0x0,

mask_flags:MTD_WRITEABLE, 复制代码

},

名称:“内核”,

大小:0x000d0000jffs2文件系统及新特性介绍

偏移量:MTDPART_OFS_APPEND,

mask_flags:MTD_WRITEABLE, 复制代码

},

名称:“rootfs”,

尺寸:MTDPART_SIZ_FULL,

偏移量:MTDPART_OFS_APPEND,

};

这里将Flash划分为三个分区,分别存放bootloader、kernel和根文件系统。mask_flags:MTD_WRITEABIE表示该分区为只读;MTDPART_OFS_APPEND表示该分区紧挨着上一个分区;MTDPART_SIZ_FULL表示剩余空间被占用。本文将JFFS2文件系统的映像存放在第三个分区中jffs2文件系统及新特性介绍,作为系统的根文件系统。

然后修改Makefile文件,添加如下语句:

obj -$(CONFIG_MID_S3C2410) += s3c2410-strata.O

再次修改Config.in文件,在适当的位置添加如下语句:

dep_tristate ‘Intel Strata Flash 设备映射到 S3C2410’ CONFIG_MTD_S3C2410 CONFIG_MTD_CFI

然后回到Linux源码目录,运行make menuconfig来配置和裁剪操作系统内核。要在Intel E28F128 Flash上​​使用JFFS2文件系统,请特别注意以下两个选项:

1)在“内存技术设备(MTD)”选项中,选择:

内存技术设备 (MTD) 支持

MTD 分区支持

兑现块设备访问 MTD 设备 RAM/ROM/Flash 芯片驱动程序—>

通过通用闪存接口 (CFI) 探针检测闪存芯片

支持Intel/Sharp闪存芯片映射驱动程序以进行芯片访问—>

CFI 物理内存映射中的闪存设备(0)闪存映射的物理起始地址 (1000000)闪存映射的物理长度(2)八位字节的总线宽度

Intel StrataFlash 设备映射到 S3C2410

这里设置Flash芯片的起始地址、大小和宽度,例如:起始地址为“0”,大小为“1000000”,即16MB,宽度为“2”,即16字节。然后选择你添加的“Intel Strata Flash device tagged on S3C2410”。

2)在“文件系统”选项中,选择:

Joumalling Flash 文件系统 v2(JFFS2)支持

其余函数大家根据实际情况裁剪即可,然后保存退出,再编译操作系统内核映像。

4.2 创建根文件系统映像

要创建根文件系统的映像,可以使用 BusyBox 生成所需的大部分文件,然后创建 /dev、/proc 和 /etc 等目录,并在 dev 目录下创建设备文件,例如:

$ mknod dev/console C 5 1

目录和文件创建完成后,使用mkfs.jffs2工具生成文件系统映像:

$./mkfs.jffs2 -e0x20000 -d./rootfsdir -ojffs2.img

其中,-e 0x20000表示擦除块大小为128kB;-d表示文件系统所在目录;-o表示文件系统映像名称。

4.3 烧掉然后跑掉

根据分配的分区表信息,将Bootloader、内核镜像、根文件系统镜像写入Flash中指定区域,并在Bootloader中设置内核命令行,例如“noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttyS0”,然后启动系统。

5 结论

JFFS2文件系统是专门针对嵌入式系统中的Flash存储芯片而设计的,由于其自​​身的特点,JFFS2适合在Nor Flash系列芯片上使用。本文以Intel Strata Flash E28F128为例,介绍在Nor Flash上​​实现JFFS2文件系统的过程,为嵌入式Linux下的应用程序开发奠定基础。

© 版权声明
THE END
喜欢就支持一下吧
点赞52赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容