分类: 嵌入式
2013-08-14 21:59:51
函数库FLtl主要定义了两个函数,flMount和flFormat函数。
1. FLStatus flMount(unsigned volNo, TL *tl, FLFlash *flash)
函数flMount将MTD,socket、tl层连接起来。它首先调用函数flIdentifyFlash对指定volNo(socketNo)的socket中的flash卡进行识别,识别成功后用数组tlTable[]中每个元素的mountRoutine函数尝试性地安装TL层,从而将MTD、socket以及tl层联系起来。
2. FLStatus flFormat(unsigned volNo, FormatParams FAR1 *formatParams)
这个函数是根据指定的参数对某个socket中的flash卡进行格式化。
格式化之前首先要通过函数flIdentifyFlash(socket,&flash)对flash卡的型号进行识别,识别后就可以得到通用的MTD层接口——FLflash结构。利用该结构就可以完成对flash卡的操作,其操作和flMount类似,也是根据tlTable[]中每个元素的formatRoutine函数尝试性地进行格式化。
注意:该函数中存在一个bug,就是如果flIdentifyFlash函数识别失败则直接退出,否则status的状态为flOK,此时根本不能够进入for循环,修改的方法是将for循环中的判断status == flUnknownMedia改为status != flOK。
图7.14描述了TL层、socket层以及MTD层的相互关系。
图7.14 函数mountFtl填充的主要数据结构
每个时刻一个socket中最多只有一张flash卡,一张卡则对应一个TlRec结构变量,所有的Tlrec结构变量共用一个TL结构。
前面的静态分析中已经看到了TrueFFS的复杂性,本节将沿着TrueFFS的建立过程,对TrueFFS进行动态分析。图7.11描述了TrueFFS的总的框架,但是对于通用的结构TL、Tlrec、Flsocket和Flflash,将其与具体的设备关联起来。这也是动态分析的主要线索。
由于socket控制芯片是计算机系统的一部分,在计算机启动之前就已经确定了的,因此socket层驱动的安装和初始化可以放在系统启动的过程中。文件Flsocket.c中定义了static FLSocket vols[DRIVES],文件tffsConfig.c中flRegisterComponents调用了文件sysTffs.c中的sysTffsInit函数,它填充了FLSocket vols[DRIVES]从而完成的socket层驱动的安装。图7.15说明了socket层驱动的安装和初始化过程。
图7.15 socket驱动的安装及初始化过程
与socket驱动所不同的是,如果系统中没有插入flash卡,那么flash卡的生产厂商、容量以及类型都死不能确定的,相应的TL层也是不能确定的,因此TL层以及MTD层驱动并不是一开始就安装的,而是在检测到flash卡才能安装和初始化。
在文件tffsConfig.c中,通过宏定义了MTDidentifyRoutine mtdTable[]、mtdTable[]中包含了不同型号flash卡的识别安装函数,通过函数flIdentifyFlash依次尝试可以完成对flash的识别以及MTD层驱动的安装。
在文件tffsConfig.c中,通过宏定义了TLentry tlTable[]、tlTable[]中包含了不同TL层格式的识别安装及格式化函数,通过函数flMount依次尝试可以完成对flash卡TL层格式的识别安装以及TL层驱动的安装以及TL层、socket层以及MTD层的关联。图7.16说明了MTD层和TL层驱动的安装和初始化过程。
图7.16 MTD层和TL层驱动的安装和初始化过程
TrueFFS使得访问flash卡就像访问普通的硬盘一样,而无需考虑其擦除等复杂的过程。但即便是硬盘,上面文件的存放也不是杂乱无章的,而必须沿用一定的格式和标准,这就是磁盘文件系统。常见的磁盘文件系统有FAT、NTFS、EXT2等等。vxWorks则实现了基于TrueFFS的FAT12和FAT16文件系统。该文件系统的实现主要是由函数库DosFormt和函数库Fatlite来完成的。其实现过程和其他操作系统并无明显不同,因此这里不再过多分析。