APP下载

非2的n次幂大小的TrueFFS文件系统的构建

2017-04-13

网络安全与数据管理 2017年6期
关键词:存储器嵌入式函数

周 翔

(中国电波传播研究所 第四研究部,山东 青岛 266107)

非2的n次幂大小的TrueFFS文件系统的构建

周 翔

(中国电波传播研究所 第四研究部,山东 青岛 266107)

介绍了嵌入式VxWorks的TrueFFS(True Flash File System)文件系统的结构和算法,针对项目开发中遇到的问题提出了非2的n次幂大小的TFFS文件系统的构建,描述了该理论的实现过程。经实践证明该方法可行,并且为Flash存储器的充分利用和通过TFFS加载镜像提供了参考。

嵌入式;VxWorks;TFFS;存储器

0 引言

Flash存储器以其体积小、耗电省、非易失的特性,越来越广泛地应用于嵌入式系统开发中,成为重要的程序和数据载体。TrueFFS 文件系统是M-systems 公司推出的Flash管理软件,它为种类繁多的Flash 提供了标准的块设备接口,因此被包括VxWorks在内的很多嵌入式操作系统所采用。建立TFFS 后,用户可以像操作标准磁盘一样实现对Flash的管理。

1 TrueFFS文件系统结构

图1 TrueFFS结构及其在系统中的位置

TrueFFS位于DOS文件系统和Flash存储器之间,可以实现对底层Flash的读写操作,同时对上层提供应用接口,使Flash像标准磁盘设备一样由操作系统和文件系统所管理。其在整个系统中的位置和结构如图1所示。

核心层为文件系统提供完整的块设备功能;翻译层负责管理文件系统和Flash各个块的关系,实现逻辑块到物理块的映射,另外它还实现设备模拟算法和Flash管理算法,如坏块管理、碎片回收、损耗均衡等;MTD(Memory Technology Driver) 层实现Flash底层驱动,如读、写、擦除等;Socket层提供TFFS与硬件之间的接口服务,如向系统注册Socket设备、检测插拔、硬件写保护等[1]。

2 TrueFFS文件系统算法

TrueFFS能均匀使用Flash,用冗余数据结构保证可靠的数据操作,能排除损坏以避免错误,实现了FTL(Flash Translation Layer)标准[2]。

(1)损耗均衡算法

Flash存储器的擦除寿命有限,随着使用次数的增多,它最终会变成只读状态。为延长其寿命,行之有效的方法就是平衡使用所有的存储单元,而不让某一单元过度使用。TrueFFS使用一种基于动态维护表的block-to-flash(块对应于Flash)传输系统来实现损耗均衡技术。当块数据被修改、移动或碎片回收后,这张维护表会自动调整。

(2)碎片回收

块数据的修改使得Flash的一些块区域被填满无效数据,这些区域在擦除之前变得不可写。TrueFFS使用一种碎片回收(garbage collection)机制来回收这些块。该机制从一个预擦除单元内拷贝所有的有效数据块到一个新的单元,然后更新block-to-flash映射表,最后擦除废旧的预擦除单元。

(3)块分配和关联数据集结

TrueFFS会将关联的数据(如出自同一个文件)集结到同一个单独擦除单元(erase unit)内的一段连续的区域中。为此,TrueFFS尽量在同一个擦除单元(erase unit)内维持一个由多个物理上连续自由的块组成的存储池。这就提高了数据的读取效率,减少碎片的产生。

(4)错误恢复

TrueFFS使用了一种“先写后擦”的策略。当更新Flash一个扇区的数据时,只有在更新操作完成并且新存储的数据校验成功后,先前的数据才会被允许擦掉。操作成功,新扇区的数据才有效,否则老扇区的数据有效。

3 开发背景介绍

在开发中使用的硬件电路板焊接了64 MB SDRAM,两片NOR Flash,每片8 MB。嵌入式VxWorks开发时生成bootrom.bin文件为256 KB,VxWorks镜像文件为5.13 MB。计划借助TrueFFS创建两个磁盘C和D,C中存放bootrom.bin和VxWorks镜像文件,D中存放数据文件和工作日志。但创建TFFS时,Flash大小必须以2的正整数次幂对齐,即C盘空间只能为1 MB、2 MB、4 MB或8 MB。由于bootrom.bin是直接固化到第一片NOR Flash中,所以无法实现将该Flash全部创建TFFS,导致不仅无法存放VxWorks镜像文件,而且还造成Flash空间的浪费。

4 实现过程

将第一片NOR Flash(Intel公司生产的JS28F640J3)起始处的2 MB空间用于固化bootrom.bin文件,上电后可自动运行bootrom;另外6 MB空间创建TFFS文件系统。构建TFFS的过程中涉及5个文件的修改:config.h、Makefile、sysTffs.c、tffsConfig.c、i28f640.c。各文件改动如下:

(1)config.h:加入必要的定义

#define INCLUDE_TFFS

#define INCLUDE_TFFS_DOSFS

#define INCLUDE_TFFS_SHOW

#define INCLUDE_DOSFS

#define INCLUDE_TL_FTL

/* 包含需要使用的翻译层 */

(2)Makefile:将生成的i28f640.o编译进系统映像,加入定义

MACH_EXTRA = i28f640.o

(3)sysTffs.c:配置TFFS各项参数

#define INCLUDE_MTD_I28F640

/* 可以调用i28f640Identify函数 */

#define INCLUDE_TL_FTL

/* 包含需要使用的翻译层 */

#undef INCLUDE_TL_SSFDC

/* 去掉不使用的翻译层 */

#define FLASH_BASE_ADRS 0

/* TFFS空间从0地址开始 */

#define FLASH_SIZE 0x00800000

/* 共8MB */

改写sysTffsFormat函数,完成格式化过程。此处必须弄清tffsDevFormatParams中各个参数的定义[3]。

typedef struct {

long int bootImageLen;

/*bootImage需要从flash开始处预留的长度*/

unsigned percentUse;

/*Flash被格式化的百分率,为了提高TrueFFS的性能,不要设为100%,以便任何时候都有空余空间。默认值为99%*/

unsigned noOfSpareUnits;

/*空余擦除单元数目,目的在于flash出现坏块时可以用它来替代,默认为1*/

unsigned long vmAddressingLimit;

/* FTL 在RAM中映射的大小,默认为61Kbytes*/

FLStatus (*progressCallback)(int totalUnitsToFormat, int totalUnitsFormattedSoFar);

/* 回调函数,用来监测flash擦除过程,如果返回值为OK,则继续,否则停止擦除*/

char volumeId[4];

/*Dos卷标号*/

char FAR1 * volumeLabel;

/*Dos卷标字符串,如果为NULL,则没有卷标*/

unsigned noOfFATcopies;

/* 文件分配表(FAT)的拷贝数,正常情况下只使用一个FAT,而另一个只有在使用的FAT被破坏的情况下用来恢复分配表,默认为2*/

unsigned embeddedCISlength;

/* CIS 嵌在单元头部(unit header)之后的字节长度*/

char FAR1 * embeddedCIS;

/* 单元头部被结构化用来作为一个PCMCIA ''tuple'' 链(a CIS)的起始,它包含了一个数据组织tuple,通常用16进制的0xFF来标示上一个单元头部结束的位置(''end-of-tuple-chain'')。*/

} FormatParams;

实际使用的格式化参数为 {0x00200000l, 99, 1, 0x10000l , NULL, {0,0,0,0}, NULL, 2, 0, NULL} 。此文件的改写是实现非2的n次幂TFFS文件系统创建的关键。在设置Flash地址和空间大小时依据NOR Flash的实际参数配置,而在对Flash格式化时修改bootImageLen参数,将2 MB空间给bootrom,而TFFS只使用后面6 MB空间。

(4)tffsConfig.c:在MTDidentifyRoutine mtdTable[]中加入定义

#ifdef INCLUDE_MTD_I28F640

i28f640Identify,

#endif

(5)i28f640.c:实现MTD层的功能

根据js28f640j3数据手册编写FLFlash结构体的各项成员,包括i28f640Write、i28f640Erase、i28f640Identify、lv28f640MTDMap。

程序中需要注意以下几点:

①对于NOR Flash,不需要编写i28f640Read函数;

②如果要创建多于1个TFFS文件系统,需要对每个文件系统编写lv28f640MTDMap函数;

③首次创建时,最好#define DEBUG_PRINT printf,可以观察整个创建过程,便于查找问题;

④需要在擦除和写操作中屏蔽中断,因为Flash在擦除、读写ID状态时,不能正常读取Flash中的数据。而VxWorks的异常入口位于Flash存储器的开始处,异常发生时不能得到正常的入口指令,会导致系统跑飞。

5 文件系统创建

第一次启动时设置通过网络加载映像,当系统启动成功后在Shell中执行以下命令:

-> tffsShowAll

TFFS Version 2.2

0: socket=RFA: type=0x17, unitSize=0x20000, mediaSize=0x800000

1: socket=RFA: type=0x17, unitSize=0x20000, mediaSize=0x800000

value = 48 = 0x30 = '0'

-> sysTffsFormat

value = 0 = 0x0

-> sysTffsFormat

-> usrTffsConfig 0,0,"/tffs"

value = 0 = 0x0

-> devs

drv name

0 /null

1 /tyCo/0

5 host:

6 /vio

3 /tffs

value = 25 = 0x19

此时可以看到“3 /tffs”,说明设备挂接已经成功。执行dosFsShow “/tffs/”命令,/tffs空间5.68 MB可用。

6 结束语

通过对TrueFFS相关函数的配置,可实现嵌入式VxWorks中非2的n次幂TFFS文件系统的构建。本文详细描述了创建过程及注意事项。这种方式已经应用到某发射系统的显控技术上,设备运行稳定、可靠,具有较大的实用价值。

[1] 曹桂平,等. VxWorks设备驱动开发详解[M]. 北京:电子工业出版社,2011.

[2] Wind River systems Inc. VxWorks reference manual[Z]. 1999.

[3] Wind River Systems Inc. VxWorks drivers API reference[Z]. 2006.

Establishing TrueFFS file system with non-2-degree power size

Zhou Xiang

(Fourth Research Department, China Research Institute of Radiowave Propagation, Qingdao 266107, China)

This paper introduces the structure and algorithm of TrueFFS in embedded real-time operating system VxWorks, proposes the establishmen of non-2-degree power size in the TFFS file system,and describes the realization process of this method. As practice confirms, this method can be realized. This paper also provides references for making full use of Flash memory and loading image through TFFS.

embedded; VxWorks; TFFS; memory

TP316.2

A

10.19358/j.issn.1674- 7720.2017.06.007

周翔. 非2的n次幂大小的TrueFFS文件系统的构建[J].微型机与应用,2017,36(6):19-21.

2016-10-19)

周翔(1984-),通信作者,男,硕士研究生,工程师,主要研究方向:嵌入式系统驱动设计、嵌入式系统应用程序开发。E-mail:zhouxiang0532@163.com。

猜你喜欢

存储器嵌入式函数
二次函数
Focal&Naim同框发布1000系列嵌入式扬声器及全新Uniti Atmos流媒体一体机
第3讲 “函数”复习精讲
静态随机存储器在轨自检算法
二次函数
函数备考精讲
TS系列红外传感器在嵌入式控制系统中的应用
搭建基于Qt的嵌入式开发平台
任意2~k点存储器结构傅里叶处理器
存储器——安格尔(墨西哥)▲