随着嵌入式技术在电子信息等领域的快速发展,对数据存储设备容量和性能的要求也日益提高。Nand Flash在这一领域的应用越来越广泛,由于Nand Flash在写操作之前需要擦除整块且使用寿命有限,因此,如何更有效的管理好Nand Flash提高其使用寿命成为一个研究热点。就目前已经实现高效管理Nand Flash的研究成果来看,主要是在读写操作过程中引入控制机制来实现闪存各单元的均衡擦除,从而提高其使用寿命。其中ZLG/FFS是周立功公司开发的 Nand Flash通用驱动程序,虽然其很好的实现了均衡管理,但在追加文件内容时需要擦除整块,这与提高Nand Flash的使用寿命而尽量少擦除闪存块观点是相违背的,为此本文设计了一个新的FFS,其最突出的特点是尽可能保证在追加文件内容时不擦除闪存块,从而提高FLASH的使用寿命,而且根根据需要,还可改写读写接口以支持多种文件系统。
1 FFS引入
由于Nand Flash的物理特性:出厂之前可能存在坏块以及操作过程中再次出现坏块,擦除次数有限,页读写块擦除,写之前须先擦除,存储器中的数据只能由1变0等,要想更有效的使用闪存,提高其使用寿命和利用率,擦除操作必须尽可能的少,并且,擦除操作必须尽可能的均匀分布在整个闪存上。为此需设计一个文件系统来高效的管理闪存,提高其使用寿命。在引言中已提过ZLG/FFS,本文是在基于ZLG/FFS的基础上来设计一个改进了的FFS,用FFS来封装底层的具体硬件操作,向上层文件系统提供一个与底层具体硬件操作无关的通用驱动接口,可以使上层文件系统更方便的访问闪存。
2 通用驱动程序FFS的设计
2.1 保存FFS硬件信息的结构体变量
根据Nand Flash 特性,需要一个变量ValidBlock来记录当前物理盘的有效块(可以保存数据的块)数;需要一个擦除次数表来记录每个物理块的擦除次数;需要一个物理块使用状况表来表示每个物理块是否使用以及是否是坏块,并且,由于上层提供给FFS是逻辑扇区,同时由于有坏块的存在,逻辑扇区与物理扇区之间不是简单的映射关系,因此需要一个逻辑块与物理块之间的映射表;最后还需一个指向硬件信息的结构体指针。FFS硬件信息的结构体如下:
const FlashDriver *Drive里包含了闪存的硬件参数(物理盘总块数、总扇区数、每块扇区数、每扇区字节数据)以及相应的闪存读写、擦除闪存和检验写入扇区数据函数。
2.2 FFS物理盘存储结构
2.2.1
物理盘数据结构
(1)系统区。由于坏块表是与Nand Flash存储器相对应的,它必须保存在芯片上。而Nand Flash的第0块比较特殊,它在出厂时一定是有效块,并且可以保证在擦除一定的次数后还是有效块。因此,将坏块表保存于第0块比较合适。此块不保存有效数据,称为系统区,其它块为数据区,真正保存坏块表的是第0块每扇区的前512字节,第0扇区的备用16字节是系统标志。[page]
(2)数据区。在一般的文件系统里,存储数据用的每扇区字节数为512,在这里,用每扇区的备用16字节来存逻辑块索引、物理擦块除次数、物理状态等信息是比较合适的,该区域称为属性域,每扇区前512字节称为数据域。物理盘数据结构图见图1
… |
… |
数据域 |
属性域 |
… |
属性域 |
数据域 |
属性域 |
数据域 |
属性域 |
坏块表第31部分 |
未使用 |
… |
未使用 |
坏块表第1部分 |
未使用 |
坏块表第0部分 |
系统标志 |
图1 物理盘数据结构图
2.2.2系统标志、属性域数据结构和坏块表
(1) 系统标志域。该域值现设定为“NANDFFS”,占据备用数据区的前8个字节,不足部分和保留区域置为0。
(2)坏块表。根据Nand Flash的性质,可以将“1”写为“0”,所以将物理坏块表设置成位表,一位对应一个物理块的状况。如果某一块是坏块,则将第0块对应位置为0。位与物理块的对应关系为:第0扇区第0字节位0对应第0块,位1对应第1块,位2对应第3块,以此类推。
(3)属性域。属性域占据数据区的512B-527B字节区域,数据结构如下:
逻辑块索引:占据扇区的512B-515B区域,记录扇区在物理块的逻辑块号,如果没有使用,则值可能为0X00000000(擦除后方可使用)和0XFFFFFFFF(不需擦除可直接使用)。
有效标志:仅使用数据区的516B区域,其值为‘V’时为有效,其他无效。系统第一次格式化闪存时,置该字节的值为‘V’。
保留区域:数据区517B区域, 在第一次使用时根据该字节确定该块是不有效;
使用标志:占据数据区的518B区域,0XFF未被使用,不为0XF0表示被使用。
页使用情况:占据数据区的519B-520B区域,每两位(页追加标志域)表示一次追加,值0b11表示该页数据域512字节未被追加,0b10表示追加未完成,0b00表示追加完成,这里可以保证在一页数据区8次追加文件,在文件恢复时也会用到该域根据该域判断是追加还是修改文件;
块擦除次数:占据数据区的521B-524B,每次擦除块时,该域值加1;剩余为保留区。
2.3 FFS的写平衡的实现
图2 实际写扇区[page]
写平衡主要在文件读写过程中实现,读扇区只是将上层提供的逻辑扇区转化为物理扇区,直接读出相应数据,而写扇区是整个FFS里重点,在这里实现了写平衡,同时进行相应的坏块管理,坏块管理主要在第一次格式化时和擦除操作中完成。写扇区有两种情况,一种是扇区还未使用,可以直接写;另一种是已写过数据,此种情况又可分为两种情况,追加数据和修改已写数据,在扇区中追加数据时,追加次数高于8次时不可以直接写,由于Nand Flash不支持‘0’变‘1’,需要分别对待追加和修改,追加和修改是通过程序来判断的,对一个扇区进行写操作,将原扇区数据与要写进扇区的数据进行比较,如里某个字节的位从0变为1,说明是修改数据,否则说明此次是追加文件。如里是修改数据,假设所修改数据对应物理块号为A,此时,先在整个物理盘中查找擦除次数最少的块B,如果B块有数据,则在空闲块中查找擦除次数最少的物理块C,将B块数据复制到C块并擦除B块使其成为空闲块,再将A块中不需改变的扇区数据复制到对应的B块扇区中,最后将要修改的扇区数据写到B块相应扇区,同时擦除A块;如果B块没有数据,就将A块中不需修改的扇区数据复制到对应B 块扇区中,同时将修改扇区数据写入对应B块扇区中,在写操作过程中同时对使用标志域进行相应处理。如果是追加文件,首先在页使用情况域里找一未使用的页追加标志域,使其为10,然后将数据写入页内,再将页追加标志域置为00,如果此次掉电,则系统加载时根据该域恢复文件。写扇区对应程序流程图见图2、图3。
3 结束语
本文分析了Nand Flash的特性及ZLG/FFS存在的不足,并根据这些特性研究与设计一个FFS,该FFS实现了Nand Flash写平衡与坏块管理,解决了在不可靠的存储介质上实现可靠数据存储的问题,尤其是在追加文件时,由于每512字节可以追加8次,根据需要还可增加追加次数,从而从整体上尽可能保证在追加文件时不需要擦除闪存块。该软件已应用于水情自动测报系统中的Nand Flash管理,取得了良好的效果,提高了Nand Flash的使用寿命。本文作者创新观点:在Nand Flash的每页后16字节中增加了一个页使用情况标志域来记录追加完成状态及追加次数记录,从整体上尽量保证在追加文件时不需擦除闪存块,从而提高了 Nand Flash的使用寿命。
参考文献:
[1]谷葆春;周洪利;K9F56XXX0B系列Flash Memory的存储组织与操作实现;微计算机信息 , 2004,(04)
[2]Seung-Ho Lim,Kyu-Ho Park, An Efficient NAND Flash File System for Flash Memory Storage,IEEE TRANSACTIONS ON COMPUTERS, VOL. 55, NO. 7, JULY 2006
[3]李强,杜威,慕春棣.基于大容量闪存的嵌入式文件系统,计算机工程,2005年第31卷
[4]周立功等编著.ARM嵌入式系统软件开发实例(二),北京航天航空大学出社,2005
[5]沈建华,罗悦怿 基于Nand Flash的FFS设计与实现,计算机应用与软件,Vol122,No. 6 Jun 2005
上一篇:基于单片机的嵌入式USB主机系统的实现
下一篇:嵌入式轻量Agent平台的构建研究
推荐阅读最新更新时间:2024-03-16 12:56