文件系统中基于磨损均衡机制

  • 格式:pdf
  • 大小:1.66 MB
  • 文档页数:4

USB Key的文件系统都建立在
内嵌的Flash中,Flash的操作以扇
区为单位,一般一个扇区大小为
1KB。读写可以按字节进行操作,
但是擦除的时候必须按扇区来操作。如果在擦除Flash的时候掉电,将会导致原有数据的丢失。针对这种情况,现在通行的USB Key文件系统采用的防掉电保护措施如下:开辟一个备份数据扇区,写数据之前,先把数据读出,把老数据和新数据写到备份区,然后擦除原来的数据扇区,再把备份区的数据写回去,最后再擦除备份区。同时,还要有一个扇区用于记录备份。此方案有以下两个缺点:多次擦除,每次写数据,要至少执行两次擦除、两次写;没有磨损均衡,每写一次USB Key文件系统中基于磨损均衡机制的掉电保护数据,备份区都会擦除一次。针对USB Key中内嵌Flash的特点,笔者提出了一种Flash读写算法,简单、易用,支持掉电保护,只要擦除和写一遍,并且支持磨损均衡。此算法基于映射思想,通过把映射表分散存放到每个扇区,以实现掉电保护和磨损均衡,同时具有最优的速度。一、实现方法一般把Flash本身的物理存放结构当作物理地址,而通过COS中的函数写入的地址叫逻辑地址。对应的扇区分别称为物理扇区和逻辑扇区。文件系统中写文件时必须由逻辑地址转换为物理地址进行访问。传统的写入方法是基于物理地址和逻辑地址顺序一致的方式。即逻辑扇区0,存放在数据区的起始物理扇区0,逻辑扇区1,存放在物理扇区1,以此类推。本文中实现的方法,是通过映射表的方式实现逻辑扇区
和物理扇区对应关系。
1.Flash物理和逻辑空间映射
方法
扇区映射实际上是物理扇区和
逻辑扇区的对应关系。映射表原理
如图1所示。当访问逻辑扇区0所在
的地址区间时,通过映射关系,实
际上读取的物理扇区地址是26,访
问逻辑扇区1所在的地址区间时,实
际上访问的是物理扇区0。
2.Flash映射数据结构
为了存放物理扇区和逻辑扇区
的映射关系,需要在系统中设置
73

如下变量:BYTE gSFMap[64]、
WORD gCurBlockNum、WORD gStartFindBlock。gSFMap所存放64个物理扇区对应的逻辑扇区地址,因为至少要保留一个物理扇区是空闲状态,所以它的逻辑扇区地址最大只能达到62。gCurBlockNum所存放最近编程过的物理扇区的编程顺序号,扇区每编程一次,它的编号就需要加1。gStartFindBlock 表示从此物理扇区后面开始寻找空闲扇区。3.映射表的存放每写一次扇区,映射表就会更
新。在设备上电的时候,要首先建
立映射表。然后把逻辑扇区地址和
要写的数据存放在同一个物理扇区
当中,来实现更新数据的同时,更
新映射表。
单个物理扇区中数据的存放格
式见图2。
0~1019:存放实际的数据。
1020~1021:存放编程的顺
序号。
1022:存放扇区的状态。

1023:存放的是对应的逻辑扇
区地址,从0到62。

二、IO操作
1.初始化
系统上电的时候,需要建立物
理扇区和逻辑扇区的映射。对整个
数据物理空间进行扫描,读取对应
的逻辑地址,来完成gSFMap的初始
化。在初始化的过程中,要注意对
两个物理扇区有相同逻辑扇区的异
常情况的处理。
2.读操作
 读操作实际上就是找到逻辑
扇区对应的物理扇区,然后从物理
扇区中读取对应的数据。通过映射
表,可以找到逻辑扇区对应的物理
扇区地址,然后计算要读取的字节
的偏移量,就可以读取对应的数
据。
3.写操作
写操作时,先找到此逻辑扇区
对应的物理扇区,把物理扇区中的
数据读到内存中,然后找到一块新
的空闲扇区,把老的数据和新的
数据都写到新的扇区。最后擦除老
的物理扇区。在找空闲扇区的过程
中,需要考虑到磨损均衡的问题。
写操作流程如图3所示。
4.异常处理
在写Flash的过程中,存在新的
扇区已经写完、而老的扇区还没擦
除的情况,此时掉电会导致两个物

0
0

26
32
60
60

1
1

2
3
物理扇区逻辑扇区

图1 物理扇区和逻辑扇区映射示例
0.10191020~102110221023
数据区编程顺序号状态逻辑扇区
图2 扇区数据存放格式
理扇区中有相同的逻辑扇区地址。
需要对这种异常情况进行处理。前
面介绍了每个扇区的1020和1021字
节号存放的是编程顺序号,而且编程顺序号是每写一次就加1,因此后面写的比前面写的数据的编程顺序号要大,只要保留编号大的扇区,而把编号小的扇区擦除。三、磨损均衡分析磨损均衡策略就是尽可能将所有的写入和擦除操作均摊到每个物理扇区上,避免个别扇区擦写次数过多导致损坏,从而影响整个Flash的寿命。实现磨损均衡主要取决于寻找空闲扇区的策略。前文提到,在每个已经写过的扇区当中,有两个字节,即1020和1021字节,存放的是此扇区编程的顺序编号,此编号从0开始,每次编
程一个扇区时累加。在初始化时,可以读取到当前最近编写过的扇区的顺序编号gCurBlockNum和此扇区所在的物理地址,并用gStartFindBlock当做寻找下一个空闲扇区的起始扇区地址。从此扇区往后,开始寻找空闲扇区,如果往后找不到空闲扇区,循环从头开始找空闲扇区,找到后,把数据写到空闲扇区,同时此空闲扇区的顺序编号加1,一并写到此扇区中。gStartFindBlock也更新为当前扇区的地址。然后擦除老的扇区。这里存在一个问题,顺序编号只占用了两个字节,因此最大只能到65 535,超过此值后顺序编
号重新从0开始计算。对于这种情
况,在初始化时会检索最久没擦除
的扇区,如果一个扇区的顺序编
号和最新的顺序编号差值大于某
个值,可判断此扇区很久没擦除
过,在初始化过程中,强制把此
扇区的数据写到新扇区中,并且
把顺序编号更新。
通过以上方式,解决了均衡擦
除的问题,使每一扇区都有同等的
擦除机会。

找到逻辑扇区对应的物理扇区O开始内存中开辟一个1024字节的内存R把老扇区O中的数据读到内存R中把要写的数据更新到R中找一块空闲扇区B把此对应的逻辑扇区号放到R的10231022字节设置为已编程状态0xcc编程号加1,并放到R的1020、1021字节处把R中数据编程
到空闲扇区B

擦除老扇区O
的数据

更新内存中的
映射表

结束
图3 写操作流程
四、性能分析
性能分析包括此算法的空间
利用率、内存消耗、速度以及可
靠性等。
1.空间利用率
设定数据区总共有N个物理扇
区,每个扇区大小为X字节,其中
扇区最后的4个字节存放的是额外信
息。并且保留一个空闲扇区。则总
的空间利用率计算公式为:

N-1)(X-4)/NX
假设Flash扇区大小为1024字
节,以64块物理扇区当数据区的文

件系统,则Flash空间的有效利用率
为:1020×63/(1024×64)=98%。
2.内存消耗
为了支持此算法,需要开
辟几个存放逻辑映射关系的
表。以数据空间扇区数为N来计
算。需要用到的空间大小为:
N个字节的gSFMap、两个字节
的gCurBlockNum和两个字节的
gStartFindBlock,总共占用N+4个字
节。
一般常用的COS文件系统为64
个扇区大小,则占用的内存空间为
64+4=68个字节。

3.写文件速度
设定以E为擦除,W为写,R为
读,对于写某个扇区中的字节,具
体操作如下:先把老扇区的数据读
回来,执行一次读R,组合为新数
据并设定新标志后把数据写到空闲
扇区,此时执行一次写W,然后把
老扇区的数据擦除,执行一次擦除
E,因此写一个扇区中的字节需要
的操作和次数为:R+W+E。
4.可靠性
可靠性主要体现在掉电时对数
据的保护上,一般存在以下几种掉
电情况:一是往空闲扇区写数据的
时候,空闲扇区写好;二是老的扇
区还没擦除完的时候。
对于第一种情况,此时新的映
射关系还没建立,老的映射关系还
存在。上电初始化时,建立的还是
老的映射关系,因此数据不存在丢
失问题。
对于第二种情况,会导致两个
物理扇区对应同一个逻辑扇区的情
况。通过上文提到的异常处理方法
就能保障最新的数据不丢失。

笔者据此开发的COS系统通过
了国密认证。此方法具有速度快、
内存占用小、防掉电、磨损均衡等
优点,适合于现在所有的USB Key
文件系统,在实际应用中具有广泛
的前景。
FCC