微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > VxWorks文件系统和Flash的TFFS设计与实现

VxWorks文件系统和Flash的TFFS设计与实现

时间:04-12 来源:互联网 点击:

0 引言

在VxWorks的应用系统中,基于flash的文件系统通常都采用DOS+FAT+FTL的结构。

一般情况下,磁盘文件系统大多是基于sector的文件系统,磁盘按照物理上分为柱面、磁盘、扇区,扇区是基于块的文件系统操作的基本存储单位,磁盘的容量都是根据这些数据计算出来的,每个扇区大小通常都是512bytes。

VxWorks文件系统中的DOSFS是MS-DOS兼容的文件系统,可基于块对物理介质进行操作。由于Fish的物理特性,对Flash作基于块(不同于Flash的擦除块)的操作必须由软件作封装实现,这就是TFFS所起的作用。

1 VxWorks文件系统的总体结构

VxWorks文件系统的总体结构以及TFFS在整个文件系统的位置如图l所示。



Tomado下的TFFS文件系统是Tornado的一个可选组件,它可为种类繁多的Flash设备提供一个统一的块设备接口。在Tornado2.2版本中自带的TFFS版本为2.0,在文件系统中,TFFS的功能相当于磁盘驱动,通过TFFS可使上层的DOSFS或RTll文件系统像操作普通的标准磁盘一样来操作Flash。

2 TFFS文件系统的分层

图2所示为TFFS文件系统的分层图。图中的Core Layer内核层可将其他层连接起来协同工作;翻译层主要实现DOS和TFFS之间的交互、管理文件系统和Flash各个物理块的关系,同时支持TFFS的各种功能,如磨损均衡、错误恢复等;MTD层执行底层的程序驱动(map、read、write、erase等);socket层的名称来源于可以插拔的socket存储卡,主要提供与具体的硬件板相关的驱动。



3 FTL层分析

FTL是TFFS文件系统的核心,它是PCMCIS的一项标准,意思是Flash Translation Laycr Specification,这种类型的文件系统是目前嵌入式系统中最流行的,很多公司都提供这种文件系统的相关解决方案。

PTL为DOS BPB/FAT与Flash之间的中间层,FTL利用现成的基于块的文件系统(例如DOSFS)来实现应用层的操作,实质上就是在Flash设备上模拟磁盘块设备的实现,为基于块的文件系统提供统一的接口。FTL通过以下几步来模拟磁盘驱动:首先是在Flash擦除块之外定义小的读写块(相当于磁盘扇区);其次是逻辑扇区(对块文件系统如DOSFS呈现的地址)和物理地址(Flash的实际地址)之间的转换;然后管理Flash,使得能在空闲的地方写入数据。其核心就是将DOS上的扇区映射到Flash上去。

为了实现DOS层从逻辑上看扇区是连续的,可随时对任意bit读写操作,FTL必须提供对Flash芯片的管理,包括向上层(DOS层)提供可以任意读写的操作接口,向下对Flash的擦除、写入、读取统一管理,同时还必须提供磨损均衡,以防止一个擦除块提前损坏。

3.1 FTL的启动过程分析

在我们调用函数tffsDevCreate创建TFFS文件系统时,会以参数FL_MOUNT_VOLUME调用函数flcall→mountvolume→flmount→mountFTL,函数mountFTL是FTL层的加载函数人口,处理过程首先是初始化FTL,然后就可按下列步骤进行:

(1)查找第一个合法的unit头信息

合法性的判断依据是unit header头上的标志CISF..FTL100和部分头部的flag信息,由于bsp已把FS的相关信息注册到FTL的数据结构中,所以,FTL层可以找到第一块unit,并可以向后查,直到找到合法的unit为止。

(2)检验信息合法性

将所有有用的信息都读出到内部数据结构中后,即可检验信息合法性。由于unit header中的Unit ID和擦除次数都相同,所以整个文件系统的共用信息都可以从首先找到的头中读出来。

(3)给Mount每一个unit建立page表

这是mount最重要的过程,对每个unit调用mountunit()函数,并在mountunit()函数中首先判断,如果是非法unit,则作为交换unit,然后对每个BAM选项进行处理,并对垃圾BAM、空闲BAM进行统计,如果是缓冲的BAM数据和交换page的VBM,则将此page的逻辑扇区信息记录到内存的page表中,以便后续映射访问查询使用,而对于非缓冲的BAM数据,则不作处理,另外,对于交换page的VBM,则进行记录。考虑到上述过程,可见其系统中的page VBM和缓冲的数据BAM分布在各个unit的各个角落,需要将所有的VBM和缓冲数据BAM收集起来建立整个交换page表,这是FTL标准层设计时就要决定的。

(4)检验逻辑unit的完整性

当所有的unit都mount完成后,每个逻辑unit都应存在,否则mount失败。

(5)判断并关闭交换page

如果系统中已存在交换page,则对系统中存在的交换page进行关闭操作,以便后面检查page的完整性。

(6)检查page的完整性

系统中的page表必须是完整的,这个表中包含有缓冲的数据BAM映射信息和更重要的page映射信息,因此,缺少任何一个,都将导致DOS的虚拟扇区无法映射到相应的逻辑扇区。

从上述过程可见,整个mount过程是将文件系统信息读入内存数据结构并检验的过程,这个Mount PTL过程完成后,mountvolume ()函数即将隐蔽的0扇区和DOS的启动扇区信息读入内存数据结构,这样,DOS就可以访问FTL底层扇区了。

3.2 TFFS的块映射

图3中,FTL层将DOS上连续的扇区映射到Flash上某个R/W block块中,同时在某个位置记录一个映射表(称为MAP表),该表中记录了DOS的扇区映射到Flash中的哪个block,当DOS要进行读操作时,FTL首先查询这个MAP,以获得映射信息,然后读取相应的block信息并返回给DOS,从而实现读映射。当DOS需要写入操作时,可能存在将bit0修改为1的情况,于是FTL层将申请一个新的block块,并将新信息写入,然后修改map信息,记录这个DOS扇区已经重新映射了,从而实现写映射。所以,从逻辑上看,FTL层就实现了DOS扇区的映射和FLASH的写入管理。


3.3 垃圾收集过程

FTL格式化后,可用扇区将被不断申请使用,原有扇区被不断的废弃,系统中可用的free扇区越来越少,但这并不是由于上层DOS真的使用了这么多扇区,而是FTL为了方便管理、为了不需要每次擦除一块而付出的管理代价。所以,当系统中的可用扇区少于用户要申请写入的扇区时,FTL层就必须解决这些垃圾问题,这个过程在FTL中称为垃圾回收(garbage collect)。

当FTL中的可用sector小于用户要申请的扇区时,系统将启动垃圾收集,但系统中有很多个unit,到底收集哪个unit呢?FTL会考虑磨损均衡,它将采用一个伪随机的算法来决定收集策略:即用4/256的几率选择磨损情况少的块来收集;252/256的几率则根据垃圾最多为第一条件,当垃圾一样时,判断磨损次数小的优先选择。

3.4 FFL创建的DOS

TFFS的格式化函数需要调用tffsDevFormat来格式化,而不需要调用dosFsVolFormat来格式化;另外,在tffsDevFormat格式化参数中,需要传人的参数含有FAT个数参数,其原因是DOS是FTL层创建的,而不是在FTL基础上创建的,下面是TFFS的整个格式化过程:

tffsDevFormat→flcall(FL_FORMAT_VOLUME)→formatVolume→Format→formatFTL;

其中,函数formatFTL是执行FTL层格式化的操作函数,操作时,首先根据格式化参数和BSP参数对内部数据结构初始化;然后再对每个unit进行格式化,在擦除后,即可写入unitheader信息和控制BAM值;之后写入unit No;最后申请每个page的空间;

上述formatFTL函数执行完以后,FTL就已经准备好,可以接受上层的扇区读写函数了(当然还没有内容可以读写)。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top