在Linux中实现大容量 NAND Flash的YAFFS2文件系统

分析了嵌入式环境中YAFFS/YAFFS2文件系统的优点,提出YAFFS2不仅支持小容量的NAND flash,对大容量NAND flash更具有优势。并介绍了YAFFS/YAFFS2文件系统结构。着重将YAFFS2文件系统在嵌入式Linux系统中的实现过程包括配置、编译以及测试整个完整过程作了详细的论述。
关键词 NAND flash,YAFFS/YAFFS2,嵌入式Linux系统
随着嵌入式系统在消费电子、航空航天、汽车电子、医疗保健、网络通信、工业控制等各个领域的广泛应用,嵌入式系统中的数据存储和管理已经成为一个重要的研究课题。Flash存储器具有存取速度快、容量大、成本低等很多优点,广泛用在嵌入式系统中做存储器件。目前,市场上Flash存储器主要有NOR(或非)和NAND(与非)两种类型。针对NOR Flash专门设计的文件系统JFFS/JFFS2(Journaling Flash File System)在嵌入式系统中已得到广泛的应用;随着NAND作为大容量存储介质的广泛应用,专门针对NAND flash特点编写的日志文件系统YAFFS/YAFFS2(Yet Another Flash File System)正逐渐被应用到嵌入式系统中。
一、NAND Flash简介
NOR 和NAND是现在市场上两种主要的非易失性闪存技术。Intel 公司于1988年首先开发出NOR Flash技术,NOR的传输效率较高,在1~4MB的小容量时有明显的成本优势,主要应用在代码存储介质中;NAND则是高密度数据存储的理想解决方案,其容量可达1GB以上,并且写入和擦除速度很快,更适合于数据存储。NAND Flash的存储单元为页和块,一般来说,该芯片的一页大小为512字节(简称小页),依次分为2个256字节的主数据区,最后是16字节的备用空间;而128MB以上的的芯片使用大小为2K的页(即大页)。若干页组成一个块,通常为32页,整个存储设备又由若干块组成,这更类似于硬盘管理的操作,因此可以取代硬盘或其他块设备。NAND Flash跟NOR Flash相比,写入和擦除速度快,但大多数写入操作需要先进行擦除操作, 擦除操作以块为单位进行,而读写操作通常以页为单位进行, NAND器件中的坏块是随机分布的所以不是完全可靠,每块芯片出厂时都有一定比例的坏块存在,每个块的最大擦写次数是一百万次甚至千万次。此外, NAND因为有特殊的时序,访问起来要复杂一些。向NAND器件写入信息需要相当的技巧不能向坏块写入数据,也不能尝试擦除坏块。
二、 YAFFS/YAFFS2文件系统
1. NAND Flash简介
YAFFS/YAFFS2是效果很理想的NAND Flash上的文件系统,是专门为NAND Flash设计的嵌入式文件系统,适用于大容量的存储设备。YAFFS文件系统分为文件系统管理层接口、YAFFS内部实现层和NAND接口层,这简化了与系统的接口设计,便于集成到系统中去。它为日志文件系统提供了损耗平衡和掉电保护,保证数据在系统对文件系统修改的过程中发生意外而不被破坏。但YAFFS文件系统不支持数据压缩,不支持大容量的NAND Flash,为此 YAFFS2文件系统被开发了出来。YAFFS2包括了YAFFS 的代码,它利用YAFFS 实现对小页Flash的支持,用YAFFS2实现对大页的支持。同时, YAFFS2在内存空间占用 、垃圾回收速度、读/写速度等方面均有大幅提升。
YAFFS中用数据结构来描述每个擦除块的状态。该数据结构记录了块状态,并用一个32位的位图表示块内各个页面的使用情况。在YAFFS中,有且仅有一个块处于“当前分配”状态。新页面从当前进行分配的块中顺序进行分配,若当前块已满,则顺序寻找下一个空闲块。
YAFFS/YAFFS2采用一种多策略混合的垃圾回收算法,将贪心策略和随机选择策略按一定比例混合使用:当满足特定的小概率条件时,垃圾回收器会试图随机选择一个可回收的页面;否则,使用贪心策略回收最“脏”的块。这种多策略混合法能够有效地改善贪心策略造成的不均;通过不同的混合比例,控制损耗平均和系统开销之间的平衡。由于NAND的擦除很快,YAFFS将垃圾收集的检查放在写入新页面时进行,而不是采用JFFS那样的后台线程方式,从而简化了设计。
2.文件系统结构
YAFFS/ YAFFS2根据NAND闪存以页为单位存取的特点,将文件组织成固定大小(512字节/2K)的数据段。每个文件都有一个文件头(保存了文件的模式、所有者id、组id、长度、文件名等信息),还有一个专门页存放。数据段都组织成树形结构,这便于提高文件数据块的查找速度。YAFFS/ YAFFS2在文件进行改写时总是先写入新的数据块,然后将旧的数据块从文件中删除。YAFFS/ YAFFS2利用NAND闪存提供的每个页面16字节的备用空间来存放ECC(Error Correction Code)和文件系统的组织信息,不仅能够实现错误检测和坏块处理,也能够提高文件系统的加载速度。
YAFFS/ YAFFS2参考了SmartMedia的设定,利用NAND闪存提供的16字节页面备用空间中的6个字节作页面数据的ECC,2个字节分别用作块状态字和数据状态字,其余的8字节(64位)用来存放文件系统的组织信息,即元数据。由于文件系统的基本组织信息保存在页面的备份空间中,因此,在文件系统加载时只需要扫描各个页面的备份空间,即可建立起整个文件系统的结构,而不需要像JFFS那样扫描整个介质,从而大大加快了文件系统的加载速度。
三、具体实现
1.开发环境
本移植是在REDHAT9.0纯Linux开发环境中进行的,采用宿主机加目标板的开发模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值