嵌入式系统中基于闪存平台的存储管理策略
扫描二维码
随时随地手机看文章
由于嵌入式系统软硬件的限制,在应用于通用计算机系统的标准文件系统(例如用于Win32/DOS的FAT和用于Linux的EXT)时,必须进行相应修改以适应嵌入式环境。在通用的文件系统趋向于简单化和专业化的进程中,研究主要集中在以下几个方面[2,3]:在一个小的高速存储器上实现嵌入式系统处理速度和有限资源的平衡;实现特定性能,如用于满足不同的嵌入式应用环境的数据加密和运行的可靠性的功能;提高嵌入式系统的实时性能。事实上,不少嵌入式系统是根据客户的特殊要求定做的。针对这种情况,开发了具有高可靠性的简化嵌入式闪存文件系统,与复杂的商用文件系统相比,这个嵌入式计算机数值控制系统更实用。
1 FFS存储结构和框架
嵌入式系统中闪存有以下特点:(1)闪存以扇区为单位执行,如果修改扇区内1 B的数据,则整个扇区的数据都将被重写;(2)通常任一扇区可重写大约0.1~1万次;(3)损坏扇区难免。在计算机数控系统中应用了闪存特性和局部处理程序访问特征,在逻辑上非结构化的数据流模式被应用到FFS,在物理上存储空间以扇区为基础分成不同的块[4]。闪存文件系统(FFS)不仅提供了根据文件名查找和访问文件,使得有限的存储空间得到合理和充分利用,而且还提供基于存储内容的擦写策略损坏扇区的适应性管理,因此,在某种程度上FFS的可靠性有所提高。
为了使闪存文件系统在不同的平台上更易于进行维护、升级和移植,基于Madnick分层模型设计了一个文件系统分层结构。图1所示的文件系统包括2个主要部分:文件管理单元和存储空间管理单元。较低层为上层部分提供服务。每一层仅涉及接口,而不是更低或上层内部结构。
2 存储空间管理
作为嵌入式系统的一部分,闪存存储管理的主要功能包括提高使用效率、加快执行速度和根据其物理特性使用特殊算法管理闪存内存单元的使用频率[5]。存储空间管理单元在逻辑上由3个层次组成:文件物理层、存储设备分配层和闪存驱动层[6]。闪存驱动层为上层提供最基本的驱动程序,如下:
[!--empirenews.page--]2.1 存储扇区管理
本文开发的FFS存储结构类似于MS-DOS的FAT,是FAT系统的修改。图2显示了一系列模式的基本存储结构。
系统记录区(SRA)存储介质信息和最重要的文件系统信息,如闪存类型、容量、扇区数和扇区利用现状。这个扇区的利用状况包括文件数、未使用的扇区数、损坏扇区数、第一个和最后一个未使用的扇区编号。图3显示了在SRA上的内存分配。文件信息区域(FIA)用于存储文件的详细信息,如文件名、文件类型、文件大小、文件属性和闪存链表项。程序数据区(PDA)用于存储程序数据。在图2阴影部分是每个区域损坏的扇区。如果损坏的扇区数达到给定界限值,警报将自动启动。图3为SRA上的内存分配情况,不同部分存储特定的记录信息:1为闪存内存类型;2为闪存内存容量;3为扇区数;4为文件数;5为未使用扇区数;6为损坏的扇区数;7为最后一次写入FIA的扇区组数;8为第一个未使用扇区号;9为最后未使用扇区号;10为系统记录控制的关键字;11为下一个要写入的扇区号。
不同的系统有不同的存储空间管理模式,最简单的可能是一个命令模式,但它并不适用于某些特殊应用。例如,在计算机数控系统中使用命令模式,用户不方便编辑、修改或者删除由各种机器处理指令组成的G代码程序。另一个常用的方式是静态存储模式,这意味着每一个文件分配固定的扇区数。在这种情况下,如果文件大小超过了给定的空间,虽然仍有未使用的扇区,但写操作却不能成功完成。同样,小文件显然将导致存储空间浪费。此外,由于过度频繁地访问同一个文件,与其他的扇区相比这样的扇区更易于损坏。因此,静态存储模式不是一个很好的选择。
为了克服这些问题,提出了一个动态存储空间管理模式,采用平均擦除和写入策略。先入先出(FIFO)的引入,保证了闪存存储扇区的平均使用。当系统第一次加电,未使用的扇区都初始化为一个双链表。此后,这些扇区应该从链表头节点转到尾节点。这样,在访问每个扇区的频率将趋于平等,每个扇区将不会过度频繁读取/写入。假设链表有N个节点,每个扇区访问的概率只有1/N,因此,闪存的使用寿命可以明显延长。
相对而言,基于MS-DOS的FAT系统只为数据区提供损害管理,却忽视了文件系统结构区域。相对地,SRA作为FFS结构区域,由于存储了系统关键信息而成为最重要的区域。而且,由于频繁访问, SRA往往更易损坏。因此,这一区域应当运用一种安全策略。根据在SRA、FIA和PDA存放的数据的重要性不同,不同存储区域应当分配不同的可靠性要求。因此,可以充分利用闪存存储能力,写校验时间将会减少,从而写速度将有所改善。
2.2 SRA的平均擦除和写入管理
为了实现对System record area(SRA)平均擦除和写管理,避免由系统记录扇区物理损伤而导致整体系统的故障,SRA被平均划分成3个小组。3组依次进行写操作,可以为系统记录存储安全提供一个冗余策略,从而提高系统的可靠性,延长系统寿命。这对于每次在系统通电之后获取SRA代码值是必要的。由系统记录关键字(SysKeyword)控制的值,标记着系统关闭前最后一次写操作的系统扇区的执行记录,它显示为:
在系统初始化时,SRA中每组的相应系统变量关键字(1~3)初始化为0。在后续操作中,各组关键字(SysKeyword)的真实值应该更新,在系统每次启动时分别从SRA读出。因此,SysCodeValue的值可根据式(1)得到。执行最后一次写操作的组号可以通过调用函数GetLastGroup-Num()获得。一旦SRA的记录数据被更改,系统关键字应该相应更新。然后包括SysKeyword的记录数据,应写入到根据以下方法获得的相应扇区。
下一次将被写入的该系统记录扇区的组号与转移的参量LastGroupNum可以通过调用函数GetNextGroupNum(Uchar LastGroupNum)共同获得。SysCodeValue的值将更新如下:
SysCodeValue=SysCodeValue∧2NextGroupNum-1 (2)
[!--empirenews.page--]通过组合式(1)和式(2)可以得到每组SysKeyword的值,因此,可以迅速查出最新和最旧的记录。该方法是一种快速计算和跟踪策略,这样,根据得到的组号和SysKeyword的值,写操作可以顺利执行。
该系统记录扇区的详细参数值如表1所示。
3 文件管理
文件管理层(FML)封装了整个文件系统,并且为操作系统和上层的应用程序提供统一标准的程序接口(APIs)。用户操作请求将被APIs移交到文件的逻辑层(FLL),然后将请求发送到文件的物理层(FPL)。
3.1 文件编辑
文件系统应提供友好的用户界面,用户可以操作文件,无需考虑文件的结构或物理位置。图4显示编辑一个存储在闪存的文件流程图。首先要遍历文件信息链表,根据文件名来查找存储此文件信息的节点。因此,该文件存储空间的第一个扇区可获取,后续扇区依次获取。然后,每个扇区将逐个读取,数据将被写入缓冲区。通过建立一个双链表显示数据,然后通过人机界面进行编辑操作。最后,将修改后的数据写回到闪存,文件信息和系统记录将自动更新。
3.2 文件存储和文件删除
连续的文件存储结构模式(如图5中的文件N005和N011)在存储前,文件通常被划分成为大小相等的多个数据块(除最后一个块的大小可能小于其他块)。块的数量是由文件和块大小决定,而块的大小与存储介质有关。在本文中,闪存的存储单元(即扇区)为256 B,因此,该块的大小建议不超过256 B。在这里,把文件划分为252 B大小的块,每个数据块占用一个扇区的存储空间。因此,块的数量(即被占用的扇区数)可以计算出,这是最低整数不少于文件字节大小除以块字节大小所得的商数。然后未使用的扇区链表的头节点作为这个文件存储空间的第一个扇区。紧随第一个扇区,很多未使用的扇区被取出后,整个文件的存储空间可用。因此,该文件成功保存。
[!--empirenews.page--] 闪存的地址空间不允许随意被删除,删除一个文件时必须把扇区作为一个删除单元。因此,删除一个文件,要使用与编辑操作相同的手段获得该文件节点的存储信息,这样文件的信息可以使用。有了文件信息,文件的存储空间的第一个扇区可以得到,其他的也可以依次得到。然后未使用的扇区链表上的扇区可以通过调用函数FreeSect(Ulong SectNum)释放第一个扇区。最后,根据双链表的原则,这个节点将被删除。
图5为一个文件创建和删除过程的示例。要创建一个文件(文件名为N005,大小为912 B,第一个扇区是5号),未使用扇区链表的头节点作为这个文件的存储空间的第一个扇区(扇区号为5)。同时,在文件信息链表的尾节点写文件信息。这个文件的存储扇区数可以计算出来,结果被证明是4。然后,从未使用的扇区链表头部,4个扇区依次用于存储文件数据。从而,文件信息和系统记录更新后,文件的创建操作完成。
要删除文件(文件名是N011,文件大小为2 026 B,第一个扇区编号为6),根据文件名N011,通过遍历文件信息链表获取文件信息节点,根据存储在此节点文件信息,可以获得文件大小和存储空间项(即文件的第一个扇区)。扇区数目也可以计算出来。由于指针索引指向下一个节点,每个扇区被释放,并连接到未使用扇区链表尾节点。最后的操作是从文件信息链表删除这个节点。与此同时,文件信息和系统的记录应该更新。
通过在一个嵌入式计算机数控系统上的有效且成功应用充分展示了FFS的良好性能。这个FFS经过略微的修改即可在不同的嵌入式平台上进行移植,且具有一定的普遍性。
为了提高存储和管理嵌入式平台上文件数据的性能,本文提出了一种新的应用于闪存文件系统(FFS)的策略,其特点可以描述如下:
(1)减少写周期提高写入速度。
(2)采用动态分配存储空间,提高利用效率和延长闪存的使用寿命。
(3)相应的文件被删除后,存储扇区可以很快被释放,并可以连接到未使用的扇区链表。
(4)当损坏扇区的数量到达设置值时自动报警,确保系统处于良好状态。
(5)FAT分配的内存空间存储指针以数组的形式作为全局变量。
(6)为延长内核扇区寿命确保系统启动可靠服务,采用冗余设计、快速计算和追踪策略。
因此,本文中的FFS,特别是在可靠性、存储效率和良好的可移植性方面已获得明显的成效。
参考文献
[1] ZHAO Kui,ZHANG Fan.A storage management scheme for embedded system[J].Technological Development of Enterprise,2005,24(1):23-26.
[2] 周兴德,孟晓风.实时系统软件设计方法[J].计算机自动测量与控制,2000(4-6).
[3] NOERGAARD T.Embedded systems architecture:a comprehensive guide for engineers and programmers[M].Newnes,USA,2005:369-412.
[4] ROSENBLUM M,OUSTERHOUT J K.The design and implementation of a log-structured file system[J].ACM Transactions on Computer Systems(TOCS),1992,10(1):26-52.
[5] Kim Han Joon,Lee Sang Goo.A new flash memory management for flash storage system[C].In:Proceedings of the TwentyThird Annual International Computer Software and Applications Conference.IEEE Computer Society,Washington DC,USA,1999:284-289.
[6] WANG Tao.Research on developing platform for CNC system based on MCX314 motion control chip[D].School of Mechanical Engineering,Tianjin University,Tianjin,China,2005.