基于闪存平台的嵌入式文件存储空间管理系统的设计与实现

描述

这里开发了一个基于闪存平台的嵌入式文件系统。为保证闪存扇区的平均使用率和均衡擦写次数,引入了损坏管理办法,在这种办法中采用了动态存储空间管理模式和先入先出(FIFO)策略。所采用的冗余设计、快速计算和跟踪办法还可以延长核心扇区使用寿命,保证系统启动可靠的服务。

1 FFS存储结构和框架

嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统对功能,对可靠性、成本、体积、功耗有严格要求的专用计算机系统。

闪存的英文名称是 \“Flash Memory\” ,一般简称为 \“Flash\” ,它也属于内存器件的一种。不过闪存的物理特性与常见的内存有根本性的差异:目前各类 DDR 、 SDRAM 或者 RDRAM 都属于挥发性内存,只要停止电流供应内存中的数据便无法保持,因此每次电脑开机都需要把数据重新载入内存;闪存则是一种不挥发性 (Non-Volatile) 内存,在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础。

嵌入式系统中闪存有以下特点:(1)闪存以扇区为单位执行,如果修改扇区内1 B的数据,则整个扇区的数据都将被重写;(2)通常任一扇区可重写大约0.1~1万次;(3)损坏扇区难免。在计算机数控系统中应用了闪存特性和局部处理程序访问特征,在逻辑上非结构化的数据流模式被应用到FFS,在物理上存储空间以扇区为基础分成不同的块。闪存文件系统(FFS)不仅提供了根据文件名查找和访问文件,使得有限的存储空间得到合理和充分利用,而且还提供基于存储内容的擦写策略损坏扇区的适应性管理。

为了使闪存文件系统在不同的平台上更易于进行维护、升级和移植,基于Madnick分层模型设计了一个文件系统分层结构。图1所示的文件系统包括2个主要部分:文件管理单元和存储空间管理单元。较低层为上层部分提供服务。每一层仅涉及接口,而不是更低或上层内部结构。

存储

2 存储空间管理

作为嵌入式系统的一部分,闪存存储管理的主要功能包括提高使用效率、加快执行速度和根据其物理特性使用特殊算法管理闪存内存单元的使用频率。存储空间管理单元在逻辑上由3个层次组成:文件物理层、存储设备分配层和闪存驱动层。闪存驱动层为上层提供最基本的驱动程序,如下:

存储

2.1 存储扇区管理

本文开发的FFS存储结构类似于MS-DOS的FAT,是FAT系统的修改。图2显示了一系列模式的基本存储结构。

存储

系统记录区(SRA)存储介质信息和最重要的文件系统信息,如闪存类型、容量、扇区数和扇区利用现状。这个扇区的利用状况包括文件数、损坏扇区数、第一个和最后一个未使用的扇区编号。图3显示了在SRA上的内存分配。文件信息区域(FIA)用于存储文件的详细信息,如文件名、文件类型、文件大小、文件属性和闪存链表项。程序数据区(PDA)用于存储程序数据。图3为SRA上的内存分配情况,不同部分存储特定的记录信息:1为闪存内存类型;2为闪存内存容量;3为扇区数;4为文件数;5为未使用扇区数;6为损坏的扇区数;7为最后一次写入FIA的扇区组数;8为第一个未使用扇区号;9为最后未使用扇区号;10为系统记录控制的关键字;11为下一个要写入的扇区号。

存储

不同的系统有不同的存储空间管理模式,最简单的可能是一个命令模式。另一个常用的方式是静态存储模式,这意味着每一个文件分配固定的扇区数。在这种情况下,如果文件大小超过了给定的空间,虽然仍有未使用的扇区,但写操作却不能成功完成。同样,小文件显然将导致存储空间浪费。另外,由于过度频繁地访问同一个文件,与其他的扇区相比这种更容易损坏。所以,静态存储模式不是一个很好的选择。

基于MS-DOS的FAT系统只为数据区提供损害管理,忽视了文件系统结构区域。相对地,SRA作为FFS结构区域,由于存储了系统关键信息而成为最重要的区域。而且因频繁访问, SRA往往更易损坏。所以,这一区域应当运用一种安全策略。可以充分利用闪存存储能力,写校验时间将会减少,从而写速度将有所改善。

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)

通过组合式(1)和式(2)可以得到每组SysKeyword的值,因此,可以迅速查出最新和最旧的记录。该方法是一种快速计算和跟踪策略,这样,根据得到的组号和SysKeyword的值,写操作可以顺利执行。

该系统记录扇区的详细参数值如表1所示。

存储

3 文件管理

文件管理层(FML)封装了整个文件系统,并且为操作系统和上层的应用程序提供统一标准的程序接口(APIs)。用户操作请求将被APIs移交到文件的逻辑层(FLL),然后将请求发送到文件的物理层(FPL)。

3.1 文件编辑

文件系统应提供友好的用户界面,图4显示编辑一个存储在闪存的文件流程图。首先要遍历文件信息链表,根据文件名来查找存储此文件信息的节点。因此,该文件存储空间的第一个扇区可获取,后续扇区依次获取。然后,每个扇区将逐个读取,数据将被写入缓冲区。通过建立一个双链表显示数据,然后通过人机界面进行编辑操作。最后,将修改后的数据写回到闪存,文件信息和系统记录将自动更新。

存储

3.2 文件存储和文件删除

连续的文件存储结构模式(如图5中的文件N005和N011)在存储前,文件通常被划分成为大小相等的多个数据块。块的数量是由文件和块大小决定,而块的大小与存储介质有关。在本文中,闪存的存储单元(即扇区)为256 B,因此,该块的大小建议不超过256 B。块的数量(即被占用的扇区数)可以计算出,这是最低整数不少于文件字节大小除以块字节大小所得的商数。然后未使用的扇区链表的头节点作为这个文件存储空间的第一个扇区。紧随第一个扇区,很多未使用的扇区被取出后,整个文件的存储空间可用。该文件成功保存。

存储

闪存的地址空间不允许随意被删除,删除一个文件时必须把扇区作为一个删除单元。因此,删除一个文件,要使用与编辑操作相同的手段获得该文件节点的存储信息,这样文件的信息可以使用。有了文件信息,文件的存储空间的第一个扇区可以得到,其他的也可以依次得到。然后未使用的扇区链表上的扇区可以通过调用函数FreeSect释放第一个扇区。最后,根据双链表的原则,这个节点将被删除。

要创建一个文件(文件名为N005,大小为912 B,第一个扇区是5号),未使用扇区链表的头节点作为这个文件的存储空间的第一个扇区。同时,在文件信息链表的尾节点写文件信息。这个文件的存储扇区数可以计算出来,结果被证明是4。然后,从未使用的扇区链表头部,4个扇区依次用于存储文件数据。从而,文件信息和系统记录更新后,文件的创建操作完成。

为了提高存储及管理嵌入式平台上文件数据的性能,本文提出了一种新的应用于闪存文件系统(FFS)的办法,有以下特点:

(1)减少写周期提高写入速度;

(2)采用动态分配存储空间,提高利用效率和延长闪存的使用寿命;

(3)相应的文件被删除后,存储扇区可以很快被释放,并可以连接到未使用的扇区链表;

(4)当损坏扇区的数量到达设置值时自动报警,确保系统处于良好状态;

(5)FAT分配的内存空间存储指针以数组的形式作为全局变量;

(6)为延长内核扇区寿命确保系统启动可靠服务,采用冗余设计、快速计算和追踪策略。

因此,本文中的FFS,特别是在可靠性、存储效率和良好的可移植性方面已获得明显的成效。


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分