在C51系统上实现YAFFS文件系统

随着nand flash存储器作为大容量数据存储介质的普及,基于nand闪存的文件系统yaffs(yet another flash file system)正逐渐被应用到各种嵌入式系统中。本文将详细阐述yaffs文件系统在c51系统上的实现过程。

1 nand flash的特点

  非易失性闪速存储器flash具有速度快、成本低、密度大的特点,被广泛应用于嵌入式系统中。flash存储器主要有nor和nand两种类型。nor型比较适合存储程序代码;nand型则可用作大容量数据存储。nand闪存的存储单元为块和页。本文使用的samsung公司的k9f5608包括2 048块,每一块又包括32页,一页大小为528字节,依次分为2个256字节的数据区,最后是16字节的备用空间。

  k9f5608具有以下特点: 以页为单位进行读/写操作,而擦除操作以块为单位,读、写和擦除操作均通过命令完成;不能字节擦除,在每次改写操作之前需要先擦除一整块;出厂时有一定比例的坏块存在;每一块的擦除次数有限,为10万次左右[1]。

2 yaffs文件系统简介

  yaffs是第一个专门为nand flash存储器设计的嵌入式文件系统,适用于大容量的存储设备;并且是在gpl(general public license)协议下发布的,可在其网站免费获得源代码。

  yaffs中,文件是以固定大小的数据块进行存储的,块的大小可以是512字节、1 024字节或者2 048字节。这种实现依赖于它能够将一个数据块头和每个数据块关联起来。每个文件(包括目录)都有一个数据块头与之相对应,数据块头中保存了ecc(error correction code)和文件系统的组织信息,用于错误检测和坏块处理。充分考虑了nand flash的特点,yaffs把这个数据块头存储在flash的16字节备用空间中。当文件系统被挂载时,只须扫描存储器的备用空间就能将文件系统信息读入内存,并且驻留在内存中,不仅加快了文件系统的加载速度,也提高了文件的访问速度,但是增加了内存的消耗。

  为了在节省内存的同时提高文件数据块的查找速度,yaffs利用更高效的映射结构把文件位置映射到物理位置。文件的数据段被组织成树型结构,这个树型结构具有32字节的节点,每个内部节点都包括8个指向其他节点的指针,叶节点包括16个2字节的指向物理地址的指针。yaffs在文件进行改写时总是先写入新的数据块,然后将旧的数据块从文件中删除。这样即使在修改文件时意外掉电,丢失的也只是这一次修改数据的最小写入单位,从而实现了掉电保护,保证了数据完整性。

  结合贪心算法的高效性和随机选择的平均性,yaffs实现了兼顾损耗平均和减小系统开销的目的。当满足特定的小概率条件时,就会尝试随机选择一个可回收的页面;而在其他情况下,则使用贪心算法来回收最“脏”的块[2]。

  yaffs文件系统是按层次结构设计的,分成以下4部分: yaffs_guts.c,文件系统的主要算法,这部分代码完全是用可移植的c语言编写的;yaffs_fs.c,linux vfs层的接口;nand 接口,yaffs_guts 和nand 内存访问函数之间的包装层,例如调用linux mtd 层或者ram模拟层;可移植函数,服务的包装函数。最重要的一点是,为了获得更好的移植性,yaffs提供直接调用的模式,这才使得我们有机会来实现yaffs文件系统在c51系统上的移植。

3 移植过程

  可在http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/获得direct源码,包括以下几个文件及其头文件。

  ◆ yaffscfg.c: 设置各种设备参数和系统参数。

  ◆ yaffsfs.c: 主要实现直接调用的接口函数,如打开文件、写文件和关闭文件等。 使用时在应用程序中包含其头文件即可。

  ◆ yaffs_flashif.c: nand flash操作函数接口,就是直接对存储器操作的底层函数。为了测试,此文件中用ramdisk模拟的方法实现了对flash存储器的操作。实际应用中,需要修改其中对flash硬件操作函数的定义,包括yflash_eraseblockinnand()、yflash_writechunktonand()、yflash_readchunkfromnand()和yflash_initialisenand()。

  ◆ yaffs_guts.c: yaffs文件系统的主要实现算法。

  ◆ nand_ecc.c:: ecc算法。

  ◆ yaffs_ramdisk.c:: ramdisk支持代码。

  ◆ yaffs_fileem.c: 用主机上的一个文件来模拟flash存储器,仅用于测试。

  ◆ dtest.c:: 直接调用文件系统的测试函数。

  获得源码以后,移植的过程可以分为2步:① 根据自己的需要进行裁减;② 将代码向c51风格转化。

3.1 裁减

  yaffs是一个功能强大的文件系统,考虑到c51系统的程序代码存储器和ram资源都很有限,而应用中可能不需要某些文件操作的功能,所以有必要对这个文件系统进行裁减。裁减包括代码裁减和数据结构的修改。

  首先,将用来测试的yaffs_ramdisk.c、yaffs_ramdisk.h、yaffs_fileem.c和interface.h这几个文件去掉,

  • 在C51系统上实现YAFFS文件系统已关闭评论
    A+
发布日期:2019年07月02日  所属分类:参考设计