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

来源:互联网 发布:java打印ascii码代码 编辑:程序博客网 时间:2024/05/21 23:38

发布日期:2008-06-12 作者:杨磊,方康玲 来源:微计算机信息

摘要:本文分析了罪常用的两种嵌入式文件系统JAFFS和YAFFS文件系统的优缺点,通过修改Linux-2.6.14内核源码,重新配置内核,提出一种了如何在嵌入式系统上移植YAFFS文件系统的方法,并在ARM-S3C2410开发平台的NAND FLASH测试并挂载了移植后的YAFFS文件系统,为嵌入式开发人员提供了一种参考方案.

关键词:ARM-S3C2410;NAND FLASH;ARM-S3C2410;YAFFS;嵌入式文件系统;挂载

1引言
目前,嵌入式系统大多采用用JAFFS和YAFFS文件系统,但JAFFS文件系统主要用于NOR FLASH,由于NOR FLASH内部结构的局限性,只适合于小容量的存储,并且NOR FLASH读写速度慢,不能满足系统实时性的需要,在我的测试过程中,在NAND FLASH上挂载的JFFS2文件系统很不稳定,经常有CRC错误产生。特别是进行写操作的时候,每次复位都会产生CRC错误,可以说支持NAND FLASH的JFFS2文件系统目前还不成熟。YAFFS(Yet Another Flash File System)类似于JFFS/JFFS2,是专门为NAND闪存设计的嵌入式文件系统,适用于大容量的存储设备.YAFFS内部实现层和NAND FLASH接口层,这样就简化了其与系统的接口设计,可以方便地集成到系统中去,与JFFS相比,YAFFS减少了一些功能,因此速度更快,占用内存更少,更能满足系统实时性的要求。
2 硬件平台的简介
本系统采用目标机+宿主机开发模式,目标平台是ARM-S3C2410,宿主机是PC机+Linux操作系统.S3C2410是ARM920T处理器核的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/
6 配置和编译内核
1.选中对MTD(memory technology device内存技术设备)的支持.
Memory Technology Device (MTD)
support   --->                                                     
[﹡]   MTD concatenating support                                          
 • MTD partitioning support                                           
[﹡]     RedBoot partition table parsing                                  
[﹡]     Command line partition table parsing                             
 User Modules And Translation Layers                                
• Direct char device access to MTD devices                           
 • Caching block device access to MTD devices  
MTD 主要是用于访问memory设备(ROM、flash)的Linux的子系统.MTD可以使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口.
2.选中NAND Device Support
•  NAND Device Support --->
[﹡] Verify NAND page writes
•  NAND Flash support for S3C2410/S3C2440 SoC 
•  S3C2410 NAND driver debug 
[﹡] S3C2410 NAND Hardware ECC 
这样就完成了内核对NAND FLASH的支持.
3.由于添加了YAFFS2文件系统,所以在内核的配置菜单 [File systems] 中的[miscellaneous filesystems] 中增加了 [Yaffs2 file systems support] 选项.这个选项就是YAFFS2的配置内容.
File systems --->     Miscellaneous filesystems ---> 
•  YAFFS2 file system support 
 --- 512 byte / page devices 
•  Lets Yaffs do its own ECC 
•  Use the same ecc byte order as Steven Hill's nand_ecc.c 
 --- 2048 byte (or larger) / page devices  
•  Autoselect yaffs2 format  
•  Disable lazy loading  
•  Turn off wide tnodes  
•  Turn off debug chunk erase check  
•  Cache short names in RAM
选择这个选项的全部内容,保存配置,然后退到终端,输入make zImage,重新编译内核,这样就就完成了对YAFFS文件系统的定制.
7 测试挂载的YAFFS文件系统
1.    用imagewrite命令将YAFFS文件系统的映像文件烧写到mtdblock3分区.
2.    在ramdisk根文件系统中创建挂载目录,使用命令mkdir /mnt/yaffs. 
3.  执行mount –t yaffs /dev/mtdblock/3 /mnt/yaffs来挂载YAFFS文件系统.
4.  由于内核配置了proc文件系统,用cat /proc/mounts 可以查看已经成功挂载了YAFFS文件系统,用ls /mnt/yaffs可以查看YAFFS文件系统的内容.
8 结束语
本文为开发者提供了在ARM9平台上移植YAFFS文件系统的方法和过程的参考,创新之处是在当前嵌入式应用中比较新的2.6内核上测试完成的.测试过程中YAFFS稳定性能比JFFS2文件系统要稳定的多,而且mount分区的时间也比JFFS2文件系统少的多。需要注意一点是,即使NAND FLASH是512+16B的,不需要使用YAFFS2,也必须将对2kpage的NAND FLASH的支持这一项选上,否则编译无法通过.由于ARM-S3C2410不支持大容量的NAND FLASH,所以flash是512+16B / page的,即使你选择的是YAFFS2文件系统,内核也会自动选择挂载为YAFFS1文件系统,由于实验系统的局限性,本文只在ARM-S3C2410平台上实现了YAFFS1文件系统的移植,在功能更强大ARM芯片系列中已经加入了对大容量(512M)的NAND FLASH的支持,支持YAFFS2文件系统,移植方法与YAFFS文件系统移植方法大致相同.
参考文献:
[1] 杜春雷,ARM体系结构与编程[M]。北京:清华大学出版社,2003
[2] 潘巨龙,黄宁,ARM9嵌入式系统构建与应用[M]。北京:北京航空航天大学出版社,2006
[3] 陈 春,ARM9嵌入式技术及Linux高级实践教程[M]。北京:北京航空航天大学出版社,2005
[4] Wookey and Tak—Shing,Porting the Linux Kernel to a New ARM Platform,SOLUTIONS JOURNAL,2002,4:52—57
[5] 郝淑风等.基于ARM的uCLinux启动引导实现的分析[J].微计算机信息,2005,8-2:50—52

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝账号买家权限被限制怎么办 淘宝中店新品打不开怎么办 旺旺号被限制有退款怎么办 登陆微信收不到验证码怎么办 淘宝店注册成功后怎么办 充电宝掉进水里怎么办 空光盘读不出来怎么办 苹果8plus丢了怎么办 苹果8plus掉了怎么办 淘宝账户被限制使用怎么办 飞利浦电脑显示器黑屏怎么办打开 微信忘记密码手机号停用怎么办 淘宝账号登录密码忘记了怎么办 淘宝支付密码输错了怎么办 淘宝支付密码忘记了怎么办 淘宝货品上架后显示过期怎么办 被淘宝客监控了怎么办 助学贷款支付宝账号忘记怎么办 离婚支付宝的钱怎么办 扫码加载不出来怎么办 淘宝店铺被投诉售假怎么办 刚开的新店没人怎么办 淘宝访客量突然下降怎么办 支付宝账号封了怎么办 苹果x手机黑屏打不开怎么办 淘宝支付密码被锁定怎么办 淘宝支付密码锁定了怎么办 很抱歉手机淘宝停止运行怎么办 苹果手机桌面淘宝图标不见了怎么办 提示网页上有错误怎么办 淘宝定制家具违约两个月怎么办 同行在买家评价下面评论怎么办 淘宝知识产权侵权被投诉了怎么办 闲鱼买家说是假货退货怎么办 日验证失败次数上限怎么办 淘宝卖家发货不全怎么办 子账号登录不上怎么办 淘宝宝贝曝光量少怎么办 淘宝买东西退款卖家拒绝怎么办 华为手机淘宝不能收藏宝贝怎么办 包裹发出不想要了怎么办