导言
在VxWorks的运用体系中,依据flash的文件体系一般都选用DOS+FAT+FTL的结构。
一般状况下,磁盘文件体系大多是依据sector的文件体系,磁盘依照物理上分为柱面、磁盘、扇区,扇区是依据块的文件体系操作的根本存储单位,磁盘的容量都是依据这些数据计算出来的,每个扇区巨细一般都是512bytes。
VxWorks文件体系中的DOSFS是MS-DOS兼容的文件体系,可依据块对物理介质进行操作。由于Flash的物理特性,对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就现已预备好,能够承受上层的扇区读写函数了(当然还没有内容能够读写)。
在函数formatVolume中,mount可进行卷操作,当内存的数据结构预备好后,FTL层即可调用函数flDosFormat来创立DOS。其间首要创立躲藏扇区,以用于记载该卷的部分信息,然后别离创立MBR、FAT和ROOT目录;这样,DOS创立完成后,再履行dosFsDevCreat函数,当然就无须格式化,找到0扇区天然就找到了MBR,由于DOS是FTL创立的。
从更深层次讲,FTL层之所以创立DOS层,是由于只要FTL层才知道有哪些扇区是能够供DOS运用的,哪些扇区是DOS不能运用的(作为FTL层办理运用),也正是由于DOS层不了解FTL层的运作状况,一切的扇区映射联系都被FTL层荫蔽,因此导致DOS层无法在上层作出有利于Flash擦写等优化动作,如大文件写入时的字节数更新,FAT表更新等操作,都会严峻糟蹋FTL层的映射联系运算。
4 依据M25P32 SPI Flash的TFFS规划
关于TFFS的完成,涉及到config.h、sysTffs.c、tffsConifg.c、tffsMtd.c、Makefile几个文件的装备和修正,其间编译是经过树立一个downloadalbe的tomado工程,来把这几个.c源文件编译进去生成.pl文件供给给bsp工程,然后由bsp工程把.pl文件编译进去,然后生成bootable image。
4.1 Config.h的相关装备
要在vxworks映像中参加TFFS文件体系,需求参加相关的组件,尽管也能够在该文件中直接参加相应的装备宏,但很简略形成遗失和有些需求依靠的宏没有界说或许抵触,本文选用的办法是建一个bootable的tornado工程,然后在这个工程中经过参加TFFS和DOSFS的相关组件来编译这个工程,然后生成一个prjParams.h文件,该文件里就包括了刚刚参加的组件对应的宏,因此,组件与组件之间依靠也是安全的,不会有任何抵触,最终再在Config.h中包括这个文件即可。
4.2 sysTffs.c文件的修正
该文件用于供给socket层的bsp完成代码。假如镜像文件包括TFFS相关组件,那么,体系发动时就会依照如下进程主动调用sysTffsInit()函数:
usrRoot()→tffsDrv()→flInit()→flRegisterComponent ()→sysTffslnit ()
sysTffsInit ()函数会顺次调用socket注册函数simmRegisterOfsl (),注册函数数量视需求构建的文件体系数量而定,本文构建了1个文件体系ofsl,并在simmRegisterOfsl()函数中对文件体系的基地址进行了设置,一起对FLSocket()结构体中的销毁处理函数进行了挂接,挂接函数也在该文件中完成,如卡上电、断电、写保护等。
对sysTffsFormaOfsl()函数的格式化参数可依据自己的需求进行修正。
4.3 tffsConfig.c和tffSMtd.c文件的修正
tffsConfig.c文件的修正便是在mtdTalbe []表中注册Flash辨认函数iUnifiedIdentifyOfsl();而tffsConfig.c文件则用于完成iUnifiedldentifyOfsl()函数,iUnifiedIdentifyOfsl()函数对FLFlash结构体中的回调函数进行了挂接,如flash的读、写、擦除等,挂接函数的详细完成可在Dry_MvSFlash.cpp文件中以一个类的办法供给针对M25P32 spi Flash操作的一切驱动接口。
4.4 TFFS文件体系的装置
经过上面的进程,socket层和mtd层就都预备好了,下面便能够装置tffs文件体系。装置时,首要用sysTffsFormatOfsl()函数依照上面设定的参数格式化TFFS文件体系,然后经过usrTffsConfig(0,0,”ofsl”)函数接口在已建好的TFFS上挂接DOS文件体系,成功后,即可经过open、read、write等来操作Flash上的文件体系,也能够经过FTP办法用IE拜访该文件体系中的内容。
4.5 Makefile文件的修正
关于Makefile的修正十分简略,由于几个和TFFS相关的源文件都是以.pl的办法被链人bsp工程的,所以只需求在makefile文件中把这个文件参加即可,即在makefile中加了如下的宏界说:
MACH_EXTRA+=../ArmPri/ARMARCH5gnu/ArmBspPrj.pl
5 结束语
本文对VxWorks下TFFS文件体系的层次结构和FTL层的发动进程、块映射算法、废物收回算法以及用FTL创立DOSFS进行了剖析,给出了在M25P32 SPI Flash上创立TFFS文件体系和将TFFS挂在DOSFS的完成办法。经过对TFFS中心层FIL的剖析给出的TFFS完成办法,能够从更根底的层面来知道VxWorks中的TFFS文件体系,然后给TFFS文件体系的问题定位和完成带来新的办法。