当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]基于ARM的嵌入式文件系统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/

[!--empirenews.page--]

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

 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭