在C51系统上实现YAFFS文件系统_第1页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在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块

2、,每一块又包括32页,一页大小为528字节,依次分为2个256字节的数据区,最后是16字节的备用空间。k9f5608具有以下特点: 以页为单位举行读/写操作,而擦除操作以块为单位,读、写和擦除操作均通过指令完成;不能字节擦除,在每次改写操作之前需要先擦除一整块;出厂时有一定比例的坏块存在;每一块的擦除次数有限,为10万次左右。2 yaffs文件系统简介yaffs是第一个特地为nand flash存储器设计的嵌入式文件系统,适用于大容量的存储设备;并且是在gpl(general public license)协议下发布的,可在其网站免费获得源代码。yaffs中,文件是以固定大小的数据块举行存储的

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

4、s利用更高效的映射结构把文件位置映射到物理位置。文件的数据段被组织成树型结构,这个树型结构具有32字节的节点,每个内部节点都包括8个指向其他节点的指针,叶节点包括16个2字节的指向物理地址的指针。yaffs在文件举行改写时总是先写入新的数据块,然后将旧的数据块从文件中删除。这样即使在修改文件时意外掉电,走失的也只是这一次修改数据的最小写入单位,从而实现了掉电庇护,保证了数据完整性。结合贪心算法的高效性和随机挑选的平均性,yaffs实现了兼顾损耗平均和减小系统开销的目的。当满足特定的小概率条件时,就会尝试随机挑选一个可回收的页面;而在其他状况下,则用法贪心算法往返收最“脏”的块。yaffs文件系

5、统是按层次结构设计的,分成以下4部分: yaffs_guts.c,文件系统的主要算法,这部分代码彻低是用可移植的编写的;yaffs_fs.c, vfs层的接口;nand 接口,yaffs_guts 和nand 内存拜访函数之间的包装层,例如调用linux mtd 层或者ram模拟层;可移植函数,服务的包装函数。最重要的一点是,为了获得更好的移植性,yaffs提供挺直调用的模式,这才使得我们有机会来实现yaffs文件系统在c51系统上的移植。3 移植过程可在 获得direct源码,包括以下几个文件及其头文件。 yaffscfg.c: 设置各种设备参数和系统参数。 yaffsfs.c: 主要实现挺

6、直调用的接口函数,如打开文件、写文件和关闭文件等。 用法时在应用程序中包含其头文件即可。 yaffs_flashif.c: nand flash操作函数接口,就是挺直对存储器操作的底层函数。为了测试,此文件中用ramdisk模拟的办法实现了对flash存储器的操作。实际应用中,需要修改其中对flash硬件操作函数的定义,包括yflash_eraseblockinnand()、yflash_writechunk tonand()、yflash_readchunkfromnand()和yflash_initialisenand()。 yaffs_guts.c: yaffs文件系统的主要实现算法。

7、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_r

8、amdisk.h、yaffs_fileem.c和interface.h这几个文件去掉,并在yaffscfg.c加上include yaffs_flashif.h。本系统中,只是对k9f5608中的3个数据库文件举行读/写,一级名目足够,单用户不存在操作权限问题,容易的文件存储不涉及衔接(linux类操作系统文件间的关系)问题,所以可在系统中删除与名目操作、操作权限以及文件衔接相关的操作函数。在yaffsfs.c及其头文件中包括(省略yaffs_前缀): readlink(), dumpdir(), readdir(), opendir(), lstat(), stat(), freespace

9、(), chmod(), mkdir(), rename(),link(), closedir(), followlink(), fstat(), listclear(), fchmod(),sylink()和mknod()。在yaffs_guts.c及其头文件中包括(省略yaffs_前缀): renameobject(), mknodedirectoty(), mknodsymlink(), mknodspecial(), link(), getattributes(), getsymlinkalias(), root(), lostnfound(), gutstest(), dumpobj

10、ect(), getnumberoffreechunk(), getobjectlinkcount()和getequivalentobject()。然后按照自己的需要举行数据结构修改,与上文提到的名目操作、操作权限以及文件衔接相关的数据结构(如uid、gid、nlink等)对我们来说就没故意义了,因此需要修改相关的数据结构。为了节约内存,还要修改一些宏定义的数据常量,例犹如时在运行的句柄数目和文件名的最大长度等。裁减工作最好能在一台装有linux操作系统的机器上举行,可以边裁减,边利用模拟方式来检查是否能实现自己所需的功能。3.2 向c51风格转化yaffs文件系统是在linux环境下利用开发

11、用户程序的c语言开发的。它与c51是有些差别的,主要有: c51不支持_inline_函数修饰符,可以将其宏定义为空; u8、u16、u32都需要重新宏定义成为c51的数据类型unsigned char、unsigned int和unsigned long; off_t定义为long。在yaffs源代码中实用data和bit作为变量的,而在c51中这些都是关键词,须将其替换。在yaffs源代码中yaffs_device结构体的定义中用法了带参数的函数指针,通过调用该指针指向的函数来对flash硬件举行操作,而c51中通过寄存器函数指针来调用函数不能传递实际参数,除非所得参数可在寄存器间传递。因

12、此这里将yaffs_device结构体定义中的函数指针去掉,而挺直调用yaffs_if.c中的flash接口函数。向c51风格转化时,最好是在集成开发环境中一边修改,一边编译,发觉错误后再举行修改。当编译器提醒有多个错误时,要从第一个错误开头修改;可能前面的错误修改完毕,后面的错误就不再是错误了。4 c51系统下的yaffs用法实例下面的程序代码是设计中的对dbf数据库文件操作的关键代码。yaffs_startup();/设置一些参数,包括各分区在flash中的起始块和结束块的地址、预留块数等yaffs_mount(/flash); /yaffs支持多个分区,这里挑选挂载/flash分区新建文

13、件db1.dbff=yaffs_open(/flash/db1.dbf, o_creat,s_iread | s_iwrite);yaffs_close(f);/关闭文件db1.dbff=yaffs_open(/flash/db1.dbf, o_rdwr,0);/以读/写的方式打开文件db1.dbfr=yaffs_write(f,hello,5);/向文件写数据yaffs_lseek(f,2,seek_set);/移动文件读/写指针r=yaffs_write(f,world,5);r=yaffs_lseek(f,0,seek_set);r=yaffs_read(f,buffer,10);/从文件读取数据r=yaffs_close(f);/关闭文件db1.dbfr=yaffs_unlink(/flash/db1.dbf);/删除文件db1.dbf可见, yaffs的接口函数的用法办法与标准c语言中对文件的操作函数非常相像,容易易用。5 总结yaffs文件

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论