基于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文件系统位于mtdb
YAFFS 移植 系统 文件 ARM 嵌入式 基于 相关文章:
- 如何在C51系统上实现YAFFS文件系统(05-01)
- YAFFS文件系统在嵌入式Linux系统中的构建与改进(08-18)
- S5PV210(TQ210)学习笔记——8位HWECC与YAFFS2的OOB布局(11-28)
- Busybox编译及其yaffs2文件系制作(11-22)
- yaffs2中,mount mtd block设备后,insmod就死掉了(11-20)
- cramfs+yaffs嵌入式平台的实现(08-16)