新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于ARM的嵌入式文件系统YAFFS的移植

基于ARM的嵌入式文件系统YAFFS的移植

作者:时间:2012-04-12来源:网络收藏

1引言

本文引用地址:http://www.amcfsurvey.com/article/171645.htm

目前,大多采用用JAFFS和,但JAFFS主要用于NOR FLASH,由于NOR FLASH 内部结构的局限性,只适合于小容量的存储,并且NOR FLASH读写速度慢,不能满足系统实时性的需要,在我的测试过程中,在NAND FLASH上挂载的JFFS2系统很不稳定,经常有CRC错误产生。特别是进行写操作的时候,每次复位都会产生CRC错误,可以说支持NAND FLASH的 JFFS2文件系统目前还不成熟。(Yet Another Flash File System)类似于JFFS/JFFS2,是专门为 NAND闪存设计的文件系统,适用于大容量的存储设备.内部实现层和NAND FLASH接口层,这样就简化了其与系统的接口设计,可以方便地集成到系统中去,与JFFS相比,YAFFS减少了一些功能,因此速度更快,占用内存更少,更能满足系统实时性的要求。

2 硬件平台的简介

本系统采用目标机+宿主机开发模式,目标平台是-S3C2410,宿主机是PC机+Linux操作系统.S3C2410是920T处理器核的 32位微控制器,它是SAMSUNG公司专门为PDA、Internet设备和手持设备等专门开发的微处理器.该芯片还包含有16KB一体化的 Cache/MMU,这一特性使开发人员能够将Linux操作系统该处理器的目标系统中.

该目标板的主要系统资源有:64M的 SDRAM、8M的NAND FLASH、32M的NOR FALSH、LCD控制器RAM控制器、NAND闪存控制器、3路UART、4路DMA、4路带PWM的Timer、并行I/O口、8路1O位ADC、Touch Screen接口、I2C接口、I2S接口、2个USB接口控制器、2路SPI,主频最高可达203MHz.

3 文件系统的概述

众所周知,文件系统是操作系统的一个重要的组成部分,每个操作系统都有自己的文件系统,文件系统直接影响着操作系统的稳定性和可靠性.Linux下的文件系统通常有两种,即日志式和非日志式文件系统,常见的嵌入式文件系统有 JFFS2,CRAMFS,RAMDISK,YAFFS文件系统,嵌入式文件系统的任务是对文件进行管理,其工作包括提供对逻辑文件的操作(包括检索、新增、修改、删除、拷贝)接口,方便用户操作文件和目录.

由于本文采用的Linux内核版本为2.6.14,不支持设备文件系统,可以在 /dev目录下手动添加设备结点.本系统的根文件系统为RAMDISK(虚拟硬盘),通过修改根文件系统下的/dev目录,使用命令mknod创建 mtdblock块设备文件,以便挂载YAFFS文件系统.

4 Yaffs文件系统的介绍

YAFFS(Yet Another Flash File System)文件系统是专门针对NAND 闪存设计的嵌入式文件系统,是一种类似于 JFFS/JFFS2 的专门为 Flash 设计的嵌入式文件系统,与JFFS 相比,它减少了一些功能,因此速度更快、占用内存更少,YAFFS不支持压缩,更适合存储容量大的系统. 目前有YAFFS和YAFFS2两个版本,两个版本的主要区别在于YAFFS2 能够更好的支持大容量的NAND FLASH芯片.

YAFFS文件系统有些类似于JFFS/JFFS2 文件系统,与之不同的是JFFS1/2 文件系统最初是针对NOR FLASH的应用场合设计的,而NOR FLASH 和NAND FLASH本质上有较大的区别,所以尽管JFFS1/2 文件系统也能应用于NAND FLASH,但由于它在内存占用和启动时间方面针对NOR 的特性做了一些取舍,所以对 NAND FLASH来说通常并不是最优的方案,YAFFS和JFFS都提供了写均衡,垃圾收集等底层操作,YAFFS中是从头到尾对块搜索,所以在垃圾收集上JFFS的速度慢,但是能延长NAND FLASH的寿命.

YAFFS将文件组织成固定大小(512字节)的数据段。每个文件都有一个页面专门存放文件头,文件头保存了文件的模式、所有者id、组id、长度、文件名等信息。为了提高文件数据块的查找速度,文件的数据段被组织成树形结构。 YAFFS在文件进行改写时总是先写入新的数据块,然后将旧的数据块从文件中删除。YAFFS使用存放在页面备用空间中的ECC进行错误检测,出现错误后会进行一定次数的重试,多次重试失败后,该页面就被停止使用。

YAFFS充分利用了NAND闪存提供的每个页面16字节的备用空间,参考了 SmartMedia的设定,备用空间中6个字节被用作页面数据的ECC,2个字节分别用作块状态字和数据状态字,其余的8字节(64位)用来存放文件系统的组织信息,即元数据。由于文件系统的基本组织信息保存在页面的备份空间中,因此,在文件系统加载时只需要扫描各个页面的备份空间,即可建立起整个文件系统的结构,而不需要像JFFS 那样扫描整个介质,从而大大加快了文件系统的加载速度。

5 Linux-2.6.14内核代码的修改

1.在arch/arm/mach-s3c2410/devs.c文件中添加static struct mtd_partition partition_info[]创建分区信息,使YAFFS文件系统位于mtdblock3.
static struct mtd_partition partition_info[]={
[0] = {
.name = u-boot,
.size = 0x00020000,
.offset = 0x00000000,
},
[1] = {
.name = param,
.size = 0x00010000,
.offset = 0x00020000,
},
[2] = {
.name = kernel,
.size = 0x00100000,
.offset = 0x00030000,
},
[3] = {
.name = root,
.size = 0x01900000,
.offset = 0x00130000,
},
[4] = {
.name = user,
.size = 0x025d0000,
.offset = 0x01a30000,
}
};注意,这里的分区信息应与U-BOOT中保持一致.

2.YAFFS 的校验算法和MTD NAND FLASH驱动的校验算法不同,如果在内核中由MTD来处理ECC,会造成MTD 认为所有的page都校验错误.所以要把要把NAND驱动中的ECC校验关闭.采用YAFFS2自带的校验算法,这个考虑,在drivers/mtd/nand/s3c2410.c中,将 chip->eccmode=NAND_ECC_SOFT修改为chip->eccmode=NAND_ECC_SOFT.

3.从开源网站下载YAFFS2文件系统的源码,在宿主机下用tar xzvf yaffs2.tar.gz命令解压,在的内核目录下建立yaffs文件夹,并将需要的文件拷贝到yaffs文件夹下.简单介绍下yaffs文件系统代码的函数功能.
# mkdir $LINUXDIR/fs/yaffs
# cp Makefile.kernel $LINUXDIR/fs/yaffs/Makefile
# cp Kconfig $LINUXDIR/fs/yaffs
# cp *.c *.h $LINUXDIR/fs/yaffs

4.修改fs/Kconfig,vi Kconfig ,添加 source fs/ /Kconfig

5.修改Makefile文件:
# cd $LINUXDIR/fs
# vi Makefile obj-$(CONFIG_YAFFS_FS) += yaffs/

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭