您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

YAFFS文件体系在嵌入式Linux上的实现

发布日期:2011-05-05


    随着嵌入式技能在种种电子产品中的广泛应用,嵌入式体系中的数据存储和办理已经成为一个告急的研究课题。Flash存储用具有速率快、容量大、资源低等很多长处,因此在嵌入式体系中被广泛用做外存储器件。Flash紧张有NOR和NAND两种典范。如今,针对NOR Flash筹划的文件体系JFFS/JFFS2在嵌入式体系中已得到广泛的应用;随着NAND作为大容量存储介质的广泛,基于NAND闪存的文件体系YAFFS(Yet Another Flash File System)正垂垂被应用到嵌入式体系中。 

    NAND闪存先容 

    NOR 和NAND是如今市场上两种紧张的非易失性闪存技能。NOR比较得当存储步调代码,其容量一样通常小于16MB;NAND则是高密度数据存储的抱负办理方案,其容量可达1GB以上。NAND闪存的存储单位为页和块。一样通常来说,128MB以下容量芯片的一页大小为528字节,依次分为2个256字节的主数据区,着末是16字节的备用空间;一个块由多少页构成,通常为32页;一个存储配置又由多少块构成。与其他存储器相比,NAND闪存具有以下特点:不是完全可靠的,每块芯片出厂时都有肯定比例的坏块存在;各个存储单位是不可直接改写的,在每次改写利用之前须要先擦除;擦除利用以块为单位举行,而读写利用通常以页为单位举行;各块的擦除次数有限,一样通常为10万~100万次;利用巨大的I/O口串行存取数据。 

    YAFFS文件体系简介 

    YAFFS雷同于JFFS/JFFS2,是专门为NAND闪存筹划的嵌入式文件体系,实用于大容量的存储配置。它这天记布局的文件体系,提供了斲丧均衡和失电掩护,可以有效地克制不测失电对文件系同划一性和完备性的影响。YAFFS文件体系是按层次布局筹划的,分为文件体系办理层接口、YAFFS内部实现层和NAND接口层,如许就简化了其与体系的接口筹划,可以方便地集成到体系中去。与JFFS相比,它淘汰了一些结果,因此速率更快,占用内存更少。 

    YAFFS充分思量了NAND闪存的特点,根据NAND闪存以页面为单位存取的特点,将文件构导致牢固大小的数据段。利用NAND闪存提供的每个页面16字节的备用空间来存放ECC(Error Correction Code)和文件体系的布局信息,不但可以大概实现错误检测和坏块处理惩罚处罚,也可以大概提大作件体系的加载速率。YAFFS采取一种多战略殽杂的垃圾采取算法,连合了贪婪战略的高效性和随机选择的匀称性,到达了分身斲丧匀称和体系开销的目标。 

    YAFFS文件布局布局 

    YAFFS将文件构导致牢固大小(512字节)的数据段。每个文件都有一个页面专门存放文件头,文件头生存了文件的模式、全部者id、组id、长度、文件名等信息。为了提大作件数据块的查找速率,文件的数据段被构导致树形布局。YAFFS在文件举行改写时总是先写入新的数据块,然后将旧的数据块从文件中删除。YAFFS利用存放在页面备用空间中的ECC举行错误检测,出现错误后会举行肯定次数的重试,多次重试失败后,该页面就被克制利用。 

    YAFFS物理数据布局 

    YAFFS充分利用了NAND闪存提供的每个页面16字节的备用空间,参考了SmartMedia的设置,备用空间中6个字节被用作页面数据的ECC,2个字节分别用作块状态字和数据状态字,别的的8字节(64位)用来存放文件体系的布局信息,即元数据。由于文件体系的底子布局信息生存在页面的备份空间中,因此,在文件体系加载时只须要扫描各个页面的备份空间,即可创建起整个文件体系的布局,而不须要像JFFS 那样扫描整个介质,从而大大加快了文件体系的加载速率。 

    YAFFS擦除块和页面分派 

    YAFFS中用数据布局来形貌每个擦除块的状态。该数据布局记录了块状态,并用一个32位的位图表现块内各个页面的利用环境。在YAFFS中,有且仅有一个块处于“当前分派”状态。新页面从当前举行分派的块中序次举行分派,若当前块已满,则序次探求下一个空闲块。 

    YAFFS垃圾网络机制 

    YAFFS利用一种多战略殽杂的算法来举行垃圾采取,将贪婪战略和随机选择战略按肯定比例殽杂利用:当餍足特定的小概率条件时,垃圾采取器会试图随机选择一个可采取的页面;而在其他环境下,则利用贪婪战略采取最“脏”的块。通过利用多战略殽杂的要领,YAFFS可以大概有效地改造贪婪战略导致的不匀称;通过差别的殽杂比例,则可以控制斲丧匀称和体系开销之间的均衡。思量到NAND的擦除很快(和NOR相比可敷衍不计),YAFFS将垃圾网络的查抄放在写入新页面时举行,而不是采取JFFS那样的背景线程要领,从而简化了筹划。 

    YAFFS实现开辟环境简介 

    本文采取的是宿主机+目标板的开辟模式。宿主机为PC+REDHAT9.0,目标板为三星公司的S3C2410+嵌入式Linux,版本为2.6.11.12。NAND闪存是三星公司64MB的K9F5608U0C。YAFFS的源码可以从网站下载。 

    YAFFS移植: 

    1)在内核中创建YAFFS目次fs/yaffs,并把下载的YAFFS代码复制到该目次下面。 

    2)修改fs/Kconfig,使得可以配置YAFFS。 

    3)修改fs/makefile,添加如下内容:obj-$(CONFIG_YAFFS_FS) += yaffs/ 

    4)在天生的YAFFS目次中天生Makefile 和Kconfig文件。 

    
[ 干系贴图 ]


    5)修改NAND分区。此分区要连合vivi里的分区举行设置,如下:
 
[ 干系贴图 ]

    6)配置内核时选中MTD支持和YAFFS支持。

    7)编译内核并将内核下载到开辟板的Flash中。

     YAFFS文件体系测试:

     1)内核启动之后,启动信息中应该含有如下内容:
[ 干系贴图 ]

    2)要是在内核内里添加了proc文件体系的支持,那么proc中应该包括有关YAFFS的信息。

    3)dev目次下的干系目次中包括有关NAND配置的信息。

    4)创建mount目次 
[ 干系贴图 ]

    将文件拷贝到mount上的目次下后,umount配置,再次mount后可以发明拷贝的文件仍旧存在。这时删除该文件,然后umount,再次mount后可以发明拷贝的文件已经被删除,由此可见该分区可以正常读写。

    5)在Flash上创建根文件体系:
[ 干系贴图 ]

   重新启动,并变革启动参数:param set linux_cmd_line "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0"再次重新启动后,开辟板就可以从Flash启动根文件体系了。 

    结语
    YAFFS是专门为NAND闪存筹划的,它的出现使得价格低廉的NAND闪存芯片具有了高效性和壮实性。YAFFS文件体系性能精良且易于移植,已经告成应用于Linux、?Clinux和Windows CE等嵌入式利用体系上。如今,每页大小为2Kb的新型超大容量NAND闪存已经出现,针对这种Flash的文件体系YAFFS2正处于研究和应用当中。可以预见,基于NAND闪存的文件体系YAFFS/ YAFFS2将会应用于更多的嵌入式体系。