嵌入式系统中的Flash存储管理
*掉电数据恢复,可以保证系统的稳定性;
创建坏块表进行坏块管理,保证系统的可靠性。
为了更好地介绍FMM的操作流程,这里先作几点说明。
(1)存储空间管理
为了实现以扇区为基础的数据管理,FMM首先对Flash中的块内存储空间逻辑上进行了重新定义,每个物理块内部又重新划分成了若干物理扇区。每个物理块内部又重新划分成了若干物理扇区。每个物理扇区由512+4字节=516(0x204)字节组成。512字节为有效数据空间,另外4字节(32位)用于存放逻辑扇区另和当前状态。定义如下:
扇区状态逻辑扇区号数字空间4位28位125字节
扇区状态有4种,用于进行掉电数据恢复:
FREE—空扇区(0xF);
DVALID—扇区数据无效(0xE);
INUSE—扇区数据有效(0xC);
DIRTY—扇区数据无用,可擦除(0x8)。
以64K大小的块为例,可以计算出每个块中可以划分出127个扇区;另外,还会有4字节的空间,专门用于标志下一个被整理块。标记为0x80,否则为0xffffffff。
因此可以得出物理扇区和绝对地址之间的对应关系:
绝对地址=Flash基地址+物理扇区号×0x204+所在块号×4
(2)扇区分类
FMM中将扇区分为ID扇区和数据扇区两类:
①FMM会占用N个扇区作为标识ID(Identification)扇区,占用逻辑扇区号0~N。这一部分扇区是文件系统不能使用的,是FMM用于管理所占用的存储空间。因此文件系统所管理的逻辑扇区号必须从N+1开始。
ID扇区主要包含如下数据:FMM版本号、写入(擦除)次数EraseCount、用户标识和坏扇区表。
N的取值与坏扇区表的大小有关,每个FMM管理的物理扇区占用表中的1位。在每次存储数据时,可以通过查询表中的相应位来确定该扇区的有效性。
②数据扇区,用于存储数据。
(3)空间映射表(MappingTable)
由于Flash不能像普通磁盘那样进行字节的修改,甚至不能以扇区为单位进行修改;而只能以块为单位进行修改;但如果只是简单将物理扇区和逻辑扇区一一对应,那么如果我们想对扇区修改就必须将整个块的内容都擦除,然后再将修改后的内容回写;势必会造成时间和Flash寿命的损失。因此,建立一个物理扇区号和逻辑扇区号的空间映射表,使逻辑扇区与物理扇区号进行动态的匹配。这样,在修改某个扇区的内容时只要将数据写入一个新的扇区,然后将原扇区标记为DIRTY就可以了。这样,还可以消除频繁修改某个扇区带来的寿命不均的影响。
映射表是建立在内存中的项数为M(扇区总数)的数组,每项占用4字节,用于存放对应的物理扇区号。当某项为空(NULL)时,认为该扇区空闲,未使用,如图2所示。
4FMM模块操作
按功能,可以将FMM分解为4个基本模块:格式化模块、初始化模块、存取模块和空间整理模块。以下简单扫描各模块的操作流程。
(1)格式化模块
对数据空间进行初级格 《嵌入式系统中的Flash存储管理(第2页)》