YAFFS2在嵌入式系统中的实现
FS/YAFFS2(Yet Another FLASH File Syst-em)。JFFS/JFFS2文件系统主要针对NOR FLASH设计,在NAND FLASH上性能不佳。YAFFS/YAFFS2文件系统是专门针对NAND FLASH设计,其具有可写入、修改并能永久保存文件的特性,并提供了损耗平衡和掉电保护。与JFFS相比,它减少了一些功能,因此速度更快、占用内存更少。此外YAFFS自带NANDFLASH芯片驱动,并为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD和VFS,直接对文件进行操作。
YAFFS文件系统已发展为两个版本,YAFFS和YAFFS2。YAFFS版本只支持512 B的小页NANDFLASH。而YAFFS2作为YAFFS的升级版,在向下兼容小页NAND FLASH的同时也能够更好地支持2 KB的大页NAND FLASH。YAFFS2的性能与YAFFS相比有很大提高,表1为YAFFS,YAFFS2(512 B×8),YAFFS2(2 KB×8)三者性能比较,从测试结果可以看出,YAFFS2和2 KB大页NANDFLASH的结合更好地提高了存储器操作效率。
YAFFS2文件系统在设计时就充分考虑了大页NAND FLASH的结构,根据大页NAND FLASH以页面为单位存取的特点,将文件组织成固定大小的页,利用大页NAND FLASH提供的每个页面(2 112 B,其中前2 048 B存储数据)64 B的备用空间(SpareData,OOB)来存放ECC和文件系统的组织信息,这样不仅能够实现错误检测和坏块处理,还能够提高文件系统的加载速度。以三星公司的K9F1G08UOA的NANDFLASH为例,它的单片存储容量为128 MB,由1 024 block组成,每个块包含64 page,每个页均包含一个2 048 B的数据区和64 B的备用空间,总共包含2 112 B。结构如图2所示。
表2说明了YAFFS2文件系统数据在NANDFLASH的备用空间内的存储布局。
blockState:描述该块的状态。如果不是OxFF,就说明是坏块。相对应的是,所有正常的块,里面所有数据都是OxFF的。
chunkld:描述该页在一个文件内的索引,所以文件大小被限制在232×2 KB。chunkld为O,说明此页面保存的是文件头。不为O,说明是数据页面。文件内偏移量为0,即放在第一个页面的文件,其chunkId为1,后面的以此类推。
ObjecTID:描述对象ID号,用来惟一标示一个文件。所以YAFFS2文件系统支持的文件总数限制在232个。
nBytes:记录该页面内的有效字节数。
blockSequence:记录着各块被分配出去的先后顺序,每分配出去一块,就加1。在YAFFS2文件系统建立的时候,块的扫描顺序就是由它决定的,而不是FLASH的物理介质顺序。在垃圾收集的时候也会以此作为参考之一,判断该块是否适合回收。
tagsEcc:Ecc,YAFFS Tags区域的ECC校验数据。
ECC:数据区的ECC校验数据。读/写数据区的数据时,每256 B生成3 B ECC校验和,一页面2 KB数据就会生成24 B的校验数据。
3 系统移植
此次开发采用宿主机+目标系统的开发模式。宿主机为PC+Fedora9,Fedora9安装在PC的虚拟机内。目标系统软硬件组成为目标板(CPU为S3C2440A)+U-Boot+嵌入式Linux,Linux版本为2.6.29.4。交叉编译工具为arm-linux-gcc-4.3.2。
选用嵌入式Linux系统是因为它有着技术上先进,健壮、安全;是多任务系统,支持ARM体系结构;源码开放,驱动程序及其他资源非常丰富,良好的可移植性等优点。嵌入式系统的移植从软件角度可以分为以下四个步骤。如图3所示。
(1)引导加载程序的移植,包括固化在固件(Fireware)中的boot代码和Bootloader两大部分。大多数嵌入式系统中并没有固件,Bootlo-ader是上电后执行的第一个程序。它主要用来初始化处理器及外设,然后调用Linux内核。
(2)嵌入式Linux内核移植。特定于嵌入式处理系统的定制内核以及内核的启动参数。内核的启动参数可以是内核默认的,或是由Bootlo-ader传递给它的。
(3)文件系统制作。包括根文件系统和建立于FLASH内存设备之上的文件系统。里面包含了Linux系统配置文件和运行应用软件所需要的库等。
(4)用户应用程序编写。特定于用户的应用程序,它所实现的功能通常就是设计该嵌入式系统所要达到的目标,它们也存储在文件系统内。
3.1 Bootloader移植
对于支持ARM架构的Bootloader有U-Boot,Vivi等。U-Boot(Universal Boot Loader)即通用Bootloader,是遵循GPL条款的开放源代码项目。它可以引导Linux,VxWorks,LynxOS等多种操作系统。支持PowerPC,x86,ARM等多种架构的CPU,具有丰富的设备驱动源码,如串口、以太网、SDRAM,FLASH等。系统采用U-Boot的版本为1.1.6,它已支持SMDK2410开发板,在其基础上进行修改。U-Boot 1.1.6中对NAND FLASH的支持有新旧两套代码,新代码在drivers/nand目录下,旧代码在driver/nand_legacy目
- linux文件系统基础(02-09)
- Linux下Ext2与Ext3文件系统的区别(04-10)
- 基于VxWorks的文件系统的研究与实现(09-18)
- 设备文件系统devfs详解(05-01)
- Linux的日志文件系统简要剖析(05-01)
- Flash文件系统剖析(05-07)