SWF文件结构大解剖<2>

来源:百度文库 编辑:神马文学网 时间:2024/04/20 09:33:59
SWF文件结构大解剖
Flash各种实例剖析我们都看过不少,不过你有没有想过swf文件内部到底是怎样的结构呢?不少闪客都想制作自己的Flash播放器,除了对控件的掌握和使用,更需要我们对swf文件的结构有深入的了解。于是我用WinHex分别打开一个swf文件和由它生成的exe文件,经过仔细分析对比后,我不仅发现了swf文件转变成exe可执行文件的秘密,并且将Flash自带播放器具备而控件却无法实现的那些功能的谜底也同时解开了。
既然要“解剖”swf文件我们就要有“解剖”工具,我使用的是WinHex 9.2,你也可以用其它的二进制编辑器来查看。
一、swf文件结构和信息
左侧“偏移量”一格代表一个字节,相同或相关功能的字节用同一种背景色表示。偏移量用十进制数表示,每个字节的值均用十六进制数表示。
偏移量
含义
0
固定为46 57 53,也就是字母‘F’‘W’‘S’
也有的文件为43 57 53,也就是字母‘C’‘W’‘S’
1
2
3
文件版本号
在播放一个swf文件之前,可根据此值与当前播放器控件的版本号比较,看是否需要更新。
(Flash MX 生成的swf文件版本号为6)
4
文件大小
正确的文件大小应该是按7、6、5、4的顺序来排列得到的十六进制数,单位是字节。
5
6
7
8
影片宽高数据控制码
(详细说明见后)
9
·
·
·
影片的宽度与高度数据存放区
所占字节数由控制码决定
(详细说明见后)
N1
(作用不详)
N2
影片放映速度
设计时指定的速度,单位是(帧/秒)。
N3
影片的总帧数
正确的帧数应该是按N4、N3的顺序排列得到的十六进制数。
N4
N5
(作用不详)
N6
(作用不详)
N7
背景色中红色值
N8
背景色中绿色值
N9
背景色中蓝色值
·
·
·
影片数据区
文件的最后四个字节为40 00 00 00
注:因长宽控制码所占字节数不确定,故其后的偏移量无法用具体数字来表示,改用N1、N2、N3等符号。
以上表格中所展示的是swf文件的结构,通过它你就能很清楚地明白哪部分对你编程有用,哪部分可以解决长期困绕的你的问题,怎么样?是不是开始偷着乐了?别着急 ,继续看更精彩的还在后面呢!
二、swf文件中记录影片宽、高的方式
前面表中第八个字节“影片宽高数据控制码”指的是下表中控制码一栏中的数字。第九个字节至第N个字节“影片的宽度与高度数据存放区”指的是下表中控制码右边的那一行数字。由于控制码的不同,宽度与高度的数据存放区的字节长度也不同。
下表中将控制码所在的字节分为两部分(高四位和低四位)。高低位不同的组合决定了数据区占用字节数以及不同的高度算法。
相应的控制码后的蓝色条表示数据区所占用的字节。五星代表有效数据(注意每个五星只占半个字节),其中前面几个连续的五星对应的数据记录了高度值,后面几个连续的五星 对应的数据记录了宽度值。
将连续的五星所在位置的数(十六进制)组合起来,得到四位或六位的十六进制数,将此数转换成十进制数,白色五星得到的数除以10就是影片宽度数值,红色五星得到的数除以40就是影片高度数值。
我对每一种控制码都给出一个具体例子,请对比文件中相应的字节和实际的宽度和高度值。
控制码
0
1
2
3
4
5
6
7
8
宽×高
50








18×18
0
0
B
4
0
0
0
B
4
0
58








36×18
0
0
5
A
0
0
0
0
B
4
0
0
60








100×48
0
0
3
E
8
0
0
0
1
E
0
0
68








160×100
0
0
1
9
0
0
0
0
0
3
E
8
0
0
70








400×320
0
0
0
F
A
0
0
0
0
0
C
8
0
0
78








550×400
0
0
0
5
5
F
0
0
0
0
0
F
A
0
0
0
80








1600×1200
0
0
0
3
E
8
0
0
0
0
0
2
E
E
0
0
88










2880×2880
0
0
0
1
C
2
0
0
0
0
0
0
7
0
8
0
0
0
注:由于Flash的图像尺寸的限制,控制码只有以上几种情况,编程时只需对以上几种情况进行判断,分别做不同的计算处理。
三、swf与exe文件之间的互相转换
用Flash自带的播放器可将一个swf文件转换成一个可自动播放的exe文件,这个转换过程只不过是在该swf文件前后加上播放器的代码而达到的,当我们知道了这个转换原理后,我们就可以实现由exe向swf转换了。
对由swf文件转换成的exe文件进行分析后,我发现Flash自带的播放器只是对swf文件做了如下几步修改:
1、在一个swf文件前加上exe文件头,共5BFFF字节;
2、接下来是完整的swf文件内容;
3、再接下来四个字节是exe文件的结束标志;
4、最后是记录swf文件大小的四个字节。
将一个Flash影片的exe文件转换成swf文件,我们只需把swf文件转换成的exe文件的过程反着做一下就可以了,也就是将上述1、3、4步骤加上的东西 删除掉就可以了。
详见下表:

偏移量
字节内容
备注
0
4D 5A 90···00 00
exe文件头
·
·
·
5BFFF
5C000
46(或43)
swf文件头
5C001
57
5C002
53
5C003
(可能为05、04、03、02、01)
swf文件版本号
5C004
记录swf文件大小的四个字节
5C005
5C006
5C007
·
·
·
swf文件内容
40
swf文件的结束标志
00
00
00
56
exe文件的结束标志
34
12
FA
记录swf文件大小的四个字节
与5C004~5C007的内容相同
到这里我们对swf文件的解剖分析就结束了,你可以结合着Flash控件动手制作一个你自己的flash播放器,一定会很棒!
Posted by kevinwu 11:11 AM | 全文 | 引用 (0) | FLASH(6)
最强大的Flash反编译工具
Action Viewer 4.0可以分析Flash文件(.swf)文件的内部结构,并将其中的动作脚本(actions)分解出来,软件支持Flash4、Flash5、Flash MX和Flash MX2004制作的swf文件,分解出的动作脚本可以保存为文本格式,在编辑过程中可以随时对Flash文件进行预览,是一个不可多得的好东东!
下载地址:http://binok.com/bbs/plug-ins/download/list.asp?id=26
Action Viewer 4.0是最强大的Flash反编译工具,在你丢失源文件的情况下可以将Swf还原成Flash文件。
Action Viewer 4.0功能非常强大,共有六个菜单,分别是File(文件)、Utility(效用)、Options(选项)、Window(窗口)、Tools(工具)和Help(帮助)。下面主要通过讲解File(文件)、Utility(效用)、Options(选项)和Tools(工具)四个菜单,说明Action Viewer 4.0的功能。
1、File(文件)
相关图片如下:
在File菜单中,Action Viewer 4.0有很多批量功能在此实现。它可以将组成Swf文件的各种按钮、图片、文本等成批的转换成单一的结构,以便于用户提取。如上图所示,在“File”菜单下的“Batch(成批转换)”下选择:   (1)Save All Library Symbols as SWF…
将所有样式成批转换;
从下图可以看出,Swf文件中所含的样式有很多,包括Movie clips(动画剪辑)、Buttons(按钮)、Graphics(图片)、Text symbols(文本样式)、Bitmaps(BMP图片)、Fonts(字体)、Sounds(声音)、Imported symbols(导入的样式)、Embedded Video(内涵动画)、Streaming Sound(流声音)等。
相关图片如下:
下面就是转换了大小猪.Swf所有样式的文件夹:
相关图片如下:
(2)Save All Layers as SWF…   将所有图层成批转换;
(3)Save all Sounds as WAV/MP3…
将所有声音文件转换为WAV或MP3文件;
(4)Save all Text
保存所有的文本。包括两种转换方式,其一转换为ANSI格式,其二是转换为UTF-8格式;
(5)Save All Class s…
保存所有脚本;(2)Save All Layers as SWF…
将所有图层成批转换;
(3)Save all Sounds as WAV/MP3…
将所有声音文件转换为WAV或MP3文件;
(4)Save all Text
保存所有的文本。包括两种转换方式,其一转换为ANSI格式,其二是转换为UTF-8格式;
(5)Save All Class s…
保存所有脚本;
2、Utility(效用)
相关图片如下:
(1)Movie Information(动画信息)   用于保存Swf文件的大小、位置、颜色等信息,并且可以点击“Modify”按钮对其进行修改。
相关图片如下:
(2)Change Background Color…(更改背景颜色)
点击这个二级菜单,会弹出一个Windows颜色对话框,允许用户通过该对话框改变Swf文件的背景颜色。
(3)Save Selected as Swf(选择一部分保存为Swf文件)
该功能主要用于对Swf的裁剪,用户如果想对原有的Swf文件进行裁减,想选取其中的一部分桢,就可以通过这一项,将在s中选择好的桢集结成新的Swf文件。
3、Options(选项)
该菜单项主要对应于软件主界面的5个页标签项,如下图所示:
相关图片如下:
包括Timeline(时间轴)、s(桢)、Library(库)、Actions(动作脚本)和Special Tags(标签)。Timeline(时间轴)、s(桢)、Library(库)的功效和MarcoMedia的Flash中的功效类似,这里就不再多阐述了。下面主要介绍一下Actions(动作脚本)。
相关图片如下:
Change Action Font 改变动作脚本的字体颜色。
\U模式仅支持6.0及其以上版本。在\U模式下Action Viewer 4.0以Unicode格式显示所有的Action,如果低于6.0版本的,有些格式就显示不出来,而是以’?’代替。
其他几项:包括Show Long Actions、Word wrap Actions、Colorize Actions等功能主要是针对脚本格式的,这里就不一一悉数了。
4、Tools(工具)
Action Viewer 4.0的主要工具包括三个:
> Compress/Uncompress…
编译与反编译,在这里Action Viewer 4.0将打开的Flash文件编译生成Swf文件;如果有Swf文件,想得到原始的Flash文件,则通过反编译即可。
相关图片如下:
> Create Projector…
创建Projector,就是将Flash动画生成exe文件,这样更利于传递和保存。
相关图片如下:
> Search IE Cache…
Action Viewer 4.0设计者真的是真心为用户考虑,随着网页上的Flash动画的增多,有些网友喜欢看看曾经登陆过的网站上的Flash动画,这里就可以使用搜寻IE缓存来查找Flash动画。
5、小结
以上是对Action Viewer 4.0功能的简单介绍和使用方法的阐述,ASV的功能技巧还有很多,它是一款功能强大的Flash编译和反编译软件,闪客大虾们快来试试吧^_^
Posted by kevinwu 10:56 AM | 全文 | 引用 (0) | FLASH(6)
详细讲解 FLASH 的文件结构
1.结构的基本分类
这里所讲的FLASH的文件结构不是指文件的存储格式结构,而是指FLASH文件特有的运行结构。了解它对做好FLASH会有一定的帮助。FLASH 作为一个动画制作工具,其最终成品是以.SWF文件表现的,一个复杂的SWF文件,无论从时间还是空间范围都是由一定结构组成的,组成时间顺序的最基本单位是帧,而组成空间范围的基本单位是物体对象。FLASH文件结构按时间顺序和空间范围可分为顺序结构和层叠
结构两类,下面我们进一步分析。
2.顺序结构及应用
如前述,顺序结构的基本单位是帧,由无数个顺序帧构成了场景,由无数个场景构成了一个SWF文件。在物理上第一个帧与下一个帧是连续的,第一个场景与下一个场景也是连续的,同一时间点上的帧如同一幅图,连续时间内的多个帧构成了由多幅图形成的画面,把这些多画面进行顺序播放,就形成了动画。(变形动画和移动动画只不过是把中间的过渡帧交由FLASH自动处理)如果不施加Actions,FLASH的运行按顺序结构依次进行,同一时间点上的对象同时出现,一个场景播完后紧接着播第二个场景,直至到最后一个场景的最后一帧。施加了Actions后,则按Actions指令进行转向,指令作用结束又按一定的时间顺序依次运行播放。帧是物体对象的载体,场景是物体对象的载体集合。
在实际应用中,可以利用顺序结构来安排物体对象出场的先后、出场时间的长短(帧越占得多,时间占得越长);把相对类同的主题设成一个场景则便于制作和调试(检测功能中有 检测电影 和 检测场景 之分,前者播放的是整个影片,后者播放的是当前一个场景)。
可见,顺序结构主要与播放的时间顺序和时间长短有关。
3.层叠结构及应用
层叠结构表现在空间范围上,最基本的单位是画面物体,多个画面物体可以同处一帧,同一帧上的画面物体如果是符号的话(严格说应该称为例子或实例)存在着前后叠放的关系,后放上的符号总是处于前面并把先放上的符号遮住,要改变这种先后叠放的关系,可以选中符号后用Ctrl+上下箭头键进行。这是最基本的层叠结构。我称为物体层。
用X、Y、Z 三维座标轴来描述的话,顺序结构相当于X 轴,上面的符号叠放的关系相当于Z轴,什么相当于 Y 轴呢?就是同一时间点上的不同层(Layer)。Layer 有三种类型:一是普通层,此类应用最为广泛。二是引导层,用来制作运动轨迹。三是遮罩层,用来制作遮罩效果。引导层和遮罩层要放在被引导或被遮罩的物体层上面。普通层中,上面的层上的物体总是复盖下面层的物体,与层名无关。改变上下层关系的方法是:拖动层标示处上下移动便可。这是FLASH的又一种层叠关系,我们可以利用它调整同一时间点上Z轴的物体前后关系,也可用大块与背景相同的色块遮住暂时不用显示的物体。这种层叠结构应用最多,大家也较熟悉,我称之为功能层。多个功能层的同一时间点上不同帧的Action如分别有不矛盾语句,则所有指令都执行,如果语句冲突,如上层 GO TO (12),下层 GO TO (15),这时系统执行下层命令,忽略上层冲突的命令。
最后也是最高级别的层叠结构是文件层,首先载入的SWF文件默认载入到第 0 层,用_FLASH0 或 _Level0表示,当这个处于第 0 层的SWF 文件载入其它的 SWF 文件时,可以任意设置载入的层次,如果设为 0 则取代了首先载入的那个SWF 文件,如果设为 1至16000,则与首先载入的SWF文件各自独立同时运行,并且相互显示相交。对同时载入的多个SWF 文件,可以通过定位,后进行任意帧的控制,定位的方法是注明您载入的层既可,如您载入的是在第 1 层,要从第 0 层的文件中控制它,
则在Actions 加:Begin Tell Target ("_flash1"
End Tell Target
在上面的两句中间加上 GO TO 到您要调用的帧号或帧标号,就可以从第 0 层的文件控制第 1 层的文件了。各文件层上的相互调用依上法类推。
综上述,了解层叠结构,对于FLASH的主动控制会有很大的帮助,不知您懂了吗?
最后我用一个图把层叠结构进行表示如下
补充一点, Flash里的层叠结构在实际应用时还要考虑一个变数, 就是MC, MC有它自己的时间线,有它自己的功能层,还可以包含另外的MC, 这也是flash 功能强大的原因, Director和Flash 相比, 缺少类似MC的控制, 是Director的一个劣势。
Posted by kevinwu 10:40 AM | 全文 | 引用 (0) | FLASH(6)
适宜于嵌入式多媒体应用的Flash文件系统
摘要:嵌入式多媒体应用中大量数据存储在Flash上,本文以文件系统的方案解决数据存储的管理问题。对嵌入式多媒体应用中Flash文件系统的应用特点与关键设计进行了分析,设计实现了一个功能完整的文件代号管理、文件指针存取以及对应用透明的自动坏损管理的文件系统。针对嵌入式系统应用的需要,改进了本Flash文件系统的应用可靠性,降低了其系统资源开销。针对多媒体应用的数据特点,提出了存储内容自适应的坏损管理策略。仿真与实用的效果表明,本Flash文件系统适宜于嵌入式多媒体应用。
关键词:嵌入式系统 多媒体 Flash存储器 文件系统
随着电子技术的不断发展,嵌入式系统越来越多地在控制类、消费类、通讯类等电子产品中广泛应用,并且随着数字信号处理与人机交互界面等相关技术的不断成熟,嵌入式多媒体应用数量也逐渐上升。多媒体业务的数据量大,数据内容复杂,在多媒体应用中数据的存储与管理是不容回避的问题。Flash存储器因制造成本低廉、存储容量大、数据非易失、无机械故障,在目前的嵌入式系统中被广泛用作外存储器件。然而Flash存储器却是一种数据正确性非理想的器件,应用中可能会出现坏损数据单元,这又给应用Flash存储器的嵌入式系统进行数据存储管理增添了新的难度[1]。
在嵌入式系统中应用Flash存储器最好的办法是在其上构造一个文件系统,对Flash存储器中的数据内容进行基于文件代号的存储管理,同时对于Flash存储器本身的坏损单元自动进行应用透明的坏损管理。目前在通用计算机上已经有很多成熟的文件系统,如DOS下的FAT文件系统、Windows NT下的NTFS文件系统及UNIX文件系统等[2]。但是这些文件系统并不适合直接用到嵌入式系统中进行多媒体数据内容的存储:第一,嵌入式系统的应用条件远比计算机恶劣,电源电压的不稳定以及突发性断电将对Flash的存储造成灾难性的影响,通用文件系统对于可靠性的设计考虑不足;第二,通用文件系统是针对系统资源非常丰富的计算机平台并基于速度较慢的磁盘驱动器,它们常常大量使用缓存技术,如注重文件系统的速度特性,要耗费比较多的系统资源。这与嵌入式系统中系统资源十分有限,Flash存储器又相对于磁盘驱动器较快的应用情况不同;第三,嵌入式系统中存储于Flash上的内容很多是多媒体数据资料,这些数据内容往往允许一定程度的误码损伤,未必需要如通用文件系统那样严格保证存储的正确性。通过灵活的校验机制与坏损管理,达到更优化的存储速度与更高效的存储空间利用,这对成本敏感的嵌入式系统来说尤其具有帮助。
基于上述考虑,设计了一个适合嵌入式多媒体应用的Flash文件系统。它不仅支持文件代号管理、文件指针存取以及对应用透明的自动坏损管理这些通用文件系统所具有的功能,并且在文件系统的可靠性以及文件系统的额外资源消耗方面进行了改善;此外还引入了基于存储内容自适应的坏损管理策略,从而使该Flash文件系统更加适合嵌入式多媒体应用。
1 Flash存储器的操作特点
Flash存储器在读取方面与普通的SRAM存储器类似,一般可以实现完全随机的读取。Flash存储器最大的不同在于写操作方面。Flash存储器的写操作需要经过"擦除-写入"两个操作过程。当希望对Flash存储器的某一个单元进行写入时,首先必须对这个存储单元所在的区块(Block)执行擦除操作,擦除操作成功完成后,整个区块的数据内容都被清空(一般被设置成0xFF);然后对目的单元所在的页面(Page)执行写入操作,需要一次写入整个页面的全部数据内容(也有一些Flash存储器支持部分页的写入,这样可以分多次写完一个页面,但是一旦写过的存储单元数据就不能再被更改),操作成功后要进行数据正确性的校验。
一个区块(Block)包含一个或多个页面(Page),一个页面包含多个数据存储单元(字节或字)。
为了增强所设计Flash文件系统在不同Flash存储器上的移植能力,选取了3个最基本的操作作为本Flash文件系统与Flash存储器设备的应用接口:区块擦除(Block_Erase)、页面写入(Page_Write)、页面读出(Page_Read)。这样虽然可能会忽略某些Flash存储器产品的独有特性,但却增加了所设计的Flash文件系统对不同Flash存储器产品的适应能力。另外,Flash存储器写入的时间瓶颈并不在于数据传递,而是Flash存储器内部的擦除和写操作等待;Flash存储器读出的速度和微处理器处理数据的速度都很快,因此虽然将读和写的基本单位扩大到了页面,但额外增加的操作时间是很短的。
2 Flash文件系统的基本结构
本Flash文件系统在基本结构上与MS-DOS的FAT文件系统类似[3]。MS-DOS是一个应用了几十年的商业化软件产品,其FAT文件系统技术成熟、结构简单、系统资源开销小,易于在嵌入式系统的硬件平台上实现。本Flash文件系统的基本结构如图1所示,整个文件系统包括如下几个部分:
(1)系统记录(SR, System Record) 存放媒质信息和最重要的文件系统信息。媒质信息诸如Flash存储器的类型、容量,划分成多少个区块,每区块包含多少个页面等。文件系统信息包括版本信息、保留区块的数目和位置、文件分配表和文件登记表所在的位置和大小、数据区域的位置和大小等。
(2)文件分配表(FAT, File Allocation Table) 存放着Flash存储器上所有区块的占用与空闲情况以及每个文件的存储链接结构。MS-DOS FAT文件系统中有12位、16位、32位三种不同的FAT格式。考虑到在微处理器上实现的方便性并权衡Flash文件系统应用的规模,选择将文件分配表固定为16位的格式。
(3)文件登记表(FRT, File Register Table) 存放着Flash文件系统中每一个文件的文件代号、文件长度、文件属性以及该文件的存储链在文件分配表中的入口。考虑到嵌入式系统的应用范围,本Flash文件系统不支持子目录结构。
(4)数据区域(Data Area)用于存放文件的数据内容。本Flash文件系统中,数据分配的最小单位是Flash存储器的一个基本擦除单位,即一个物理区块(Block)。
本Flash文件系统提供:文件系统的格式化(Format)、文件的创建(Create)、删除(Delete)、打开(Open)、关闭(Close)、读(Read)、写(Write)、文件指针的移动(Seek)、位置读取(Tell)等基本的功能。程序主体代码以ANSI C语言写成,使用一个非常小的Flash存储器设备驱动接口,扩展及移植的能力都比较好。
3 提高Flash文件系统的可靠性
在MS-DOS的FAT文件系统中,仅仅对数据区域提供坏损管理,而对于它的主引导记录、文件分配表和根目录这三个极重要的文件系统数据结构却未做任何保护(虽然MS-DOS的FAT文件系统中存在着两张FAT表,但是DOS只是简单地复写第二张FAT表而从不使用它。一旦这三个区域的内容出现一点失效,将必然导致文件数据的大量损失。另外,如果这些数据结构的存储区域发生物理性损坏,更会导致整张磁盘的报废。这在由Flash存储器占据很大成本比重的嵌入式应用中,是非常不希望的。
归结起来,嵌入式系统中的Flash存储器主要面临两大类不稳定因素:一是Flash存储器本身可能出现物理性的损坏;二是嵌入式系统面对较多的突发掉电与重启动,造成Flash存储器写操作的异常终止。
针对Flash存储器的物理损坏问题,除对文件数据区域提供坏损管理外,还将系统记录、文件分配表和文件登记表这三个文件系统重要数据结构采用浮动位置的方法存储。即不仅对文件数据存储进行动态的分配管理,对于Flash文件系统中的这三个重要数据结构也不固定其存储位置。这样可以避免因它们的存储区域发生物理损坏造成整个文件系统失效。具体做法是:对于系统记录定义一个系统记录保留区,将系统记录存在这个区域内,确切的位置在文件系统初始化的时候通过标识幻数(Magic Number)的方法扫描找到;而文件分配表和文件登记表则存放在文件数据区域内,通过系统记录中的索引项找到。
针对Flash存储器的写操作异常终止问题,将系统记录、文件分配表和文件登记表这三个对Flash文件系统最重要的数据结构均进行双份的存储以改善其安全性。在文件系统的操作中,程序对每一个表结构的两个备份进行顺次修改,以此确保Flash存储器上总是存有一整套完好的系统记录表、文件分配表和文件登记表。在系统被启动运行时,文件系统会首先进行自检,通过这三个表结构中的标识幻数,以及最开头和最末尾的更新序列号可以确定每一张表备份的合法性和时效性,判断出前次系统关闭中存在着的操作异常终止并及时更正。通过这样的设计,即使文件系统在使用中出现了写操作异常终止的情况,错误将只涉及当时被操作的文件数据,不会扩散给Flash文件系统中的其它文件,更不会因此损坏三个文件系统表结构,造成整个文件系统的彻底瘫痪。
通过以上两个方面的改进,本Flash文件系统的可靠性相比于MS-DOS FAT文件系统有了很大的提高。从实验1和实验2的仿真结果可以看到,即使在Flash极不可靠和写操作异常终止频发的最恶劣工作条件下,本Flash文件系统也能够保持可靠工作,从而使之能够适合于嵌入式系统的应用。
实验1 高坏损率状况下本Flash文件系统的可靠工作
实验条件 Flash存储器规格:16KB/Block× 1024Block,设定Flash页面的写入坏损概率为1%,对单一文件重复进行(打开文件,写入1KB数据,关闭文件)10000次操作。
实验结果 完成后文件总长度 10,240,000Bytes
被文件数据占用的Flash空间 625 Blocks
损坏块占据的Flash空间 342 Blocks
FAT和FRT被操作的次数 11583次
SR被操作的次数 223次
同等条件MS-DOS FAT文件系统仍能保持工作的概率(即其主引导记录、文件分配表、根目录区域无物理损坏的概率) 2.9E-52
实验2 频繁写操作异常终止状况下本Flash文件系统的可靠工作
实验条件 Flash存储器规格:16KB/Block × 1024Block,预先存储5个文件,文件长度分别为k×100KB(k=1..5),模拟写操作进行当中,发生系统掉电类事故,造成写操作异常中止。
实验结果 实验次数 100次
导SR、FAT或FRT出错的次数 71次
Flash文件系统启动自检时发现并更正文件系统错误的次数 71次
Flash上已有的5个文件受损的次数 0文件×0次
4 降低Flash文件系统的资源消耗
嵌入式系统相对于通用计算机系统来讲,往往有苛刻得多的成本要求,需要嵌入式系统尽可能低的系统资源配置。尤其对于Flash文件系统这种用于增强系统功能的服务性质模块,就更需要降低对系统资源的消耗,才能够扩大其使用的范围。
就Flash文件系统的资源消耗来讲,主要包括程序代码开销、处理器占用时间、运行时内存开销以及额外的Flash存储器消耗。其中,运行时内存开销最限制Flash文件系统的应用,同时设计结构的改善与运行时内存开销直接相关。所以针对资源消耗的结构优化主要着重于降低运行时的内存开销。
Flash存储器的擦除单位是区块(Block),这是本Flash文件系统中数据存储分配的最小单元。如果不采用任何措施的话,运行时内存开销中将至少包括备份一个完整区块数据的缓冲区。但一个Flash存储器的区块可能很大(Sumsung[TM] KM29U128是16KB),这在很多嵌入式系统中都是过大的资源开销(最通用的8位微处理器MCS-51系列,总线寻址的能力只有64KB),必须进行改进。
为此,采用交换缓冲区(Swap Buffer)技术来解决这个困难。当需要准备某一个区块的数据时,并不直接向该区块写入,而是首先擦除用于做交换缓冲区的区块,然后逐步向交换缓冲区填入目的数据内容。因为此时,任何有用数据内容都未被破坏,所以运行内存中的缓冲就可以做得比较小。当交换缓冲区填写完成后,再擦除目的区块,拷贝交换缓冲区内容到目的区块。
采用交换缓冲区后,对内存中的缓冲区大小没有特别要求,考虑到Flash存储器的操作特性,选取Flash存储器的页面(Page)容量作为内存缓冲区大小。在结构上作了上述改进后,虽然大大降低了Flash文件系统的运行时内存消耗,但代价是将一个数据区块的写入时间延长了一倍。不过一般的Flash存储器中都有一特别制作的区块,该区块保证不会损坏,正好适用做交换缓冲区。这样就可以省去中间交换缓冲过程的数据完整性检验,加快写操作的速度。
表1给出了在与MCS-51兼容的微处理器上本Flash文件系统实例,对Sumsung KM29U128 Flash存储器(16KB/Block×1024Block)[4]进行管理应用中的系统资源开销。对于一般的成本要求来讲,是可以接受的。
表1 一个应用实例中本Flash文件系统的系统资源开销
程序代码开销 8.28 KB
额外的Flash占用 8 Blocks/1024 Blocks=0.78%
运行时RAM开销 总和 0.79KB
页面缓冲区 0.50KB
文件打开表 0.13KB
FAT项更新表 0.08KB
其它 0.08KB
5 基于存储内容的自适应坏损管理策略
嵌入式系统中应用Flash存储器,与多媒体相关的应用占据相当的比例,如数码相机、语音监录、MP3播放器等。存储在Flash上的内容多数是多媒体数据流,这种应用相对于普通文件系统的单纯数据业务具有其自己的数据特点。据此在本Flash文件系统上提出了基于存储内容的自适应坏损管理策略。
Flash存储器上存储的内容包括数据文件和多媒体数据流。数据文件对于数据完整性要求很严格,不允许存储中出现任何错误。但多媒体数据流则不同,很多种多媒体数据流允许一定情况下传输差错,一些甚至允许传输差错很严重,如CVSD编码的语音。而Flash存储器的区块发生物理损坏时,经常是只有几个bit出现错误,其它部分却是完好的。综合考虑这两个方面的因素,就可以对不同内容的数据流赋予不同的数据完整性要求。这样一方面充分发挥了Flash存储器的存储能力,另一方面也可以降低弱数据完整性要求的数据检验强度,提高数据写入速度。
在本Flash文件系统中,把不同数据内容对于数据完整性的要求分成三个级别:0、1和2级。其中,0级的数据完整性最高,不允许在存储中出现任何差错,用于数据型的存储。2级的数据完整性要求最低,允许出现较多的差错,用于抗差错性强的多媒体码流。相应地,对于Flash存储器的每个可用区块,也按照其物理损坏的程度分成对应的三个级别:0级的区块所有的存储单元都完好;2级的区块则存在着比较多的损坏位;损坏程度超过2级允许的区块成为彻底损坏块,不能再使用。存储的原则为:对于特定的存储内容用损坏级别不超过其数据完整性要求级别的Flash区块存储。
同时,在存储不同数据完整性要求的内容时,采用不同强度的差错校验。存储0级内容时,每一次写入都进行差错校验,存储1级和2级内容时,以1/N的概率进行差错校验。差错校验的结果更新该物理存储区块的损坏级别,但是损坏级别只升不降。最初的损坏级别在格式化并建立文件系统时设定。
通过实验3的结果可以看到,采用存储内容自适应的坏损管理策略后,对于可容错的多媒体码流,存储效率和存储速度都可以得到明显提高。并且,设定合适的校验概率所发生的漏检率是很低的。
针对嵌入式多媒体应用中大量数据在Flash上存储的管理问题,文件系统是一种比较全面优秀的解决方案。本文对嵌入式多媒体应用中Flash文件系统的应用特点与关键设计进行了分析,设计实现了一个适宜于嵌入式多媒体应用的Flash文件系统。其主要特点包括:
(1)完全支持文件代号管理、文件指针存取以及对应用透明的自动坏损管理这些通用文件系统所具有的功能。
(2)针对嵌入式系统的应用环境,设计改进了本Flash文件系统的可靠性,使其可以工作在很恶劣的条件下。
(3)针对嵌入式系统的成本与系统资源限制,改进降低了本Flash文件系统的系统资源开销,扩大了其应用范围。
(4)针对多媒体应用的数据特点,提出了基于存储内容自适应的坏损管理策略,提高了在多媒体应用中的存储效率与存储速度。
最终设计的Flash文件系统其结构如图2。
通过仿真分析,本Flash文件系统相对于类似MS-DOS FAT的基础系统,在可靠性、系统资源开销等方面的性能提高是可观的,对于多媒体数据流在Flash存储器资源有效利用和改善存储性能等方面,也有明显的改善。因此,本Flash文件系统很适合于嵌入式多媒体应用。