嵌入式linux下jffs2文件系统的实现

1 文件系统
    文件系统是一个操作系统中最重要的部分之一,它为操作系统提供了一种结构化存储和管理数据的方式。文件系统的主要功能是对数据的物理存储进行管理,并向用户提供对数据的访问接口。用户程序建立在文件系统上,通过文件系统访问数据,而不需要直接对物理存储设备进行操作。
   
最初的操作系统一般都只支持单一的一种文件系统,并且文件系统和操作系统内核紧密关联在一起,而linux操作系统的文件系统结构是树状的,在根目录“/’下有许多子目录,每个目录都可以采用各自不同的文件系统类型。linux中的文件不仅指的是普通的文件和目录,而且将设备也当作一种特殊的文件,因此,每种不同的设备,从逻辑上都可以看成是一种不同的文件系统。
   
linux操作系统中,为了支持多种不同的文件系统,采用了虚拟文件系统(vfsvisual filesystem switch)技术,虚拟文件系统是对多种实际文件系统的共有功能的抽象,它屏蔽了各种不同文件系统在实现细节上的差异,为用户程序提供了统一的、抽象的、标准的接口对文件系统进行访问,如open()read()write()等。这样,用户程序就不需要关心所操作的具体文件是属于哪种文件系统,以及这种文件系统是如何设计与实现的,对所有文件的访问方式都是完全相同的。vfs与实际文件系统的关系如图1所示。
 

2 flash存储器
   
由于具有高可靠性、高存储密度、低价格、非易失、擦写方便等优点,flash存储器取代了传统的eprom eeprom,在嵌入式系统中得到了广泛的应用。flash存储器可以分为若干块,每块义由若干页组成,对flash的擦除操作以块为单位进行,而读和写操作以页为单位进行。flash存储器在进行写入操作之前必须先擦除目标块。根据所采用的制造技术不同,flash存储器主要分为nor flashnand flash两种。
1)nor flash

    nor flash
通常容量较小,其主要特点是 片内执行(xipexecute in place)就是指程序代码可以直接在flash内运行,而不需要将代码读取到ram中再执行。nor flash具有ram接口,易于访问,它的缺点是擦除电路复杂,写速度和擦除速度都比较慢最大擦写次数约10万次,典型的块大小是128kb

2)nand flash

    nand flash
通常容量较大,具有很高的存储密度,从而降低了单位价格。nand flash的块尺寸较小,典型大小为8kb,擦除速度快,使用寿命也更长,最大擦写次数可以达到100万次,但是其访问接口是复杂的i/o口。并且坏块和位反转现象较多,对驱动程序的要求较高。由于nor flashnand fiash各具特色,因此它们的用途也各不相同,nor flash一般用来存储体积较小的代码,而nand flash则用来存放大体积的数据。

3 flash文件系统
   
在嵌入式系统中,也可以在flash上运行传统的文件系统,如ext2等,但是这类文件系统没有考虑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_charmtd_block这两个模块用于对flash的访问,mtd_charflash表现为字符设备,与其关联的设备文件是/dev/mtd0等,mtd_blockflash表现为块设备,与其关联的设备文件是/dev/mtdblock0等;jffs2文件系统就建立在mtd_block模块的基础之上。

3.3 jffs2
文件系统
    jffs(journaling flash file system)
是瑞典的axis communications公司专门针对嵌入式系统中的flash存储器的特性而设计的一种日志文件系统。redhat公司的david woodhousejffs的基础上进行了改进,从而发布了jffs2(journaling flash file system version 2)。和jffs相比,jffs2支持更多节点类型,提高了磨损均衡和碎片收集的能力,增加了对硬链接的支持jffs2还增加了数据压缩功能,这更利于在容量较小的flash中使用。和传统的linux文件系统如ext2相比,jffs2处理擦除和读写操作的效率更高,并且具有完善的掉电保护功能,使存储的数据更加安全。在嵌入式系统中使用jffs2文件系统的缺点很少,只是当文件系统快要满时,jffs2会放慢运行速度,这是由于碎片收集的原因。

4 jffs2文件系统的实现
   
文中所用的目标板cpu是韩国samsung公司的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.cmap文件中需要定义flash的基地址、大小、宽度、分区表、读写函数、初始化和释放函数等。其中分区表的一个例子如下:
static struct mtd_partition s3c2410_partitions[]=
{
 {
  name:"bootloader"

  size:0x00030000

  offer:0x0

  mask_flags:mtd_writeable,
 }

 {
  name:"kernel"

  size:0x000d0000

  offset:mtdpart_ofs_append

  mask_flags:mtd_writeable

 }

 {
  name:"rootfs"

  size:mtdpart_siz_full,
  offset:mtdpart_ofs_append

 }
}

   
这里将flash分成3个分区,分别存放引导装载程序(bootloader)、内核和根文件系统。mask_flags:mtd_writeabie表示分区是只读的;mtdpart_ofs_append表示分区位置紧挨着上一个分区;mtdpart_siz_full表示占用剩余的全部空间。文中将jffs2文件系统的映像存放在第3个分区上,作为系统的根文件系统。
    然后修改makefile文件,在其中加入以下语句:
obj -$(config_mid_s3c2410) + = s3c2410-strata.o
再修改config.in文件,在适当位置加入以下语句
:
dep_tristate 'intel strata flash device mapped on s3c2410' config_mtd_s3c2410 config_mtd_cfi
然后回到linux源码目录下,运行make menuconfig对操作系统内核进行配置与裁减,要在intel e28f128 flash上使用jffs2文件系统,要特别注意以下两个选项
:
1)
“memory technology devices(mtd)”选项中选择
:
<*>memory technology device(mtd)support
<*>mtd partitioning support
<*>cashing block device access to mtd devices ram/rom/flash chip drivers--->
<*> detect flash chips by common flash interface(cfi) probe
<*> support for intel/sharp flash chips mapping drivers for chip access--->
<*> cfi flash device in physical memory map(0)physical start address of flash mapping (1000000)physical length of flash mapping(2)buswidthin octets
<*> intel strataflash device mapped on s3c2410
   
这里设置了flash芯片的起始地址、大小以及宽度,比如:起始地址为“0”,大小为“1000000”,即16mb,宽度为“2”,即16字节。然后选中自己加入的“intel strata flash device mapped on s3c2410”这一项。

2)
“file systems”选项中选择:
<*>joumalling flash file system v2(jffs2)support
   
对于其他功能,可根据自己的实际情况,进行裁减,然后保存退出,接下来编译出操作系统内核映像。


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下的应用程序开发奠定了基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值