摘要:作为一种新型的存储介质,flash以其优良的特性,在嵌入式领域中得到了广泛的应用。本文通过分析flash介质的自身特性,并结合嵌入式系统的特点,设计实现于兼容性、可靠性以及开销等方面都得到充分优化的flash存储系统。
关键字嵌入式系统文件系统flash
1引言
flash(闪速存储器)作为一种安全、快速的存储体,具有体积小、容量大、成本低、掉电数据不丢失等一系列优点,已成为嵌入式系统中数据和程序zui主要的载体。由于flash在结构和操作方式上与硬盘、e2rom等其他存储介质有较大区别,使用flash时必须根据其自身特性,对存储系统进行特殊设计,以保证系统的性能达到zui优。
2flash的特点
flash是一种非易失性存储器nvm(non-volatilememory),根据结构的不同可以将其分成norflash和nandflash两种。但不管哪一种都具有如下特点:
1.区块结构
flash在物理结构上分成若干个区块,区块之间相互独立。比如norflash把整个memory分成若干个sector,而nandflash把整个memory分成若干个block;
2.先擦后写
由于flash的写操作只能将数据位从1写成0,不能从0写成1,所以在对存储器进行写入之前必须先执行擦操作,将预写入的数据位初始化为1。擦操作的zui小单位是一个区块,而不是单个字节。
3.操作指令
除了norflash的读,flash的其它操作不能像ram那样,直接对目标地址进行总线操作。比如执行一次写操作,它必须输入一串特殊的指令(norflash),或者完成一段时序(nandflash)才能将数据写入到flash中。
4.位反转
由于flash固有的电器特性,在读写数据过程中,偶然会产生一位或几位数据错误。这就是位反转。位反转无法避免,只能通过其他手段对结果进行事后处理。
5.坏块
flash在使用过程中,可能导致某些区块的损坏。区块一旦损坏,将无法进行修复。如果对已损坏的区块进行操作,可能会带来不可预测的错误。尤其是nandflash在出厂时就可能存在这样的坏块(已经被标识出)。
3关键设计
3.1flash通用设计
对于一个嵌入式系统,设备的兼容性越好,系统可行性就越好,产品也就越有竞争力。所以,为了兼容不同类型的flash设备,对flash进行通用设计至关重要。
对于norflash,数据的读操作可以通过独立的数据总线和地址总线快速完成,然而norflash的其他操作需要通过特殊的指令来完成,更糟糕的是不同厂商生产的芯片这些指令互不相同。这就导致了设备的不兼容。
对于nandflash,也存在这样的问题。nandflash可以根据相同的指令读取芯片的厂商号和设备号,从而通过识别设备号调用对应的时序流程实现操作。但是,系统中太多的判断,会使得程序的结构变得非常复杂。所以,在一定的条件下,nandflash设备还是不兼容的。
为了解决这一问题,一个较好的方法是将flash的各个操作指令以及结构特性按照统一的格式存放到flash中固定位置。系统初始化时,将这个结构读入系统,通过分析这个结构,可以获得关于芯片所有相关信息,包括操作指令,区块分布等等。这样,系统可以轻松实现对不同型号flash的所有操作,极大地提高了设备的扩展性。
3.2双模式文件系统设计
嵌入式系统中文件数据的存放一般有两种结构,一种是索引格式的线性结构,一种是非线性的链表式结构。这两种结构各有优缺点。比如对于系统配置、点阵字库等一些具有固定结构的系统数据,索引结构比链表式结构更有效率。但对于经常更新的用户数据,链表式结构要比索引结构更灵活。如果系统能将两种结构集成,势必能将性能发挥到zui优。
实现这种集成的方法是将设备定义成若干个分区,每个分区相互独立,不同分区可以使用不同的文件模式。这样,不同类型的数据就可以根据自己的属性选择存放的分区。比如系统数据存放在使用索引线性结构的分区,用户数据存放在使用链式非线性结构的分区。
3.3坏块处理
flash中的坏块处理是一件很棘手的问题,如果没有有效的管理,对系统的稳定性会造成严重影响。一个可行的解决方法是生成一张坏块表,坏块表中记录所有坏块的块号,并且按块号从小到大排序,坏块表在读写过程中动态更新。当读写数据时,遍历坏块表中的块号,将文件的逻辑地址转换成对应flash物理地址,以保证所用的flash地址空间不存在坏块。
4系统实现
4.1结构定义
图1-存储结构
系统的存储结构如图1所示,在flash的block0位置存放整个系统zui重要的数据——系统记录sr(systemrecord)。选择block0的原因是一般flash出厂时,都能保证block0是完好的,因此可以避免坏块问题带来的不便。sr其实就是一个定义好的数据结构,它包括媒质信息和文件系统信息两部分。媒质信息包括flash存储器的类型、容量、块类型的大小和数量(blockinfo)、flash操作命令(commandinfo)等。文件系统信息包括版本信息、各逻辑分区的起始地址(物理地址)和结束地址。flash设备可以被分成一个或多个逻辑分区,每个逻辑分区采用的操作方式可以互不相同,如图1中device0分区采用的是线性文件系统,device1分区采用的是链式文件系统。如果采用的是线性文件系统,在分区信息后面加入文件索引表index起始地址、大小等信息;如果采用的是链式文件系统,则加入文件系统页大小、文件分配表fat和文件登记表frt所在的位置等信息。
文件登记表frt位于fat后的页中,存放着逻辑分区中文件的信息,如文件总数、每个文件的文件代号、位置、长度以及校验模式。其中,校验模式用来标识文件读写时采用差错校验的级别。不同类型的文件采用不同级别的校验方式。0级不进行校验,1级ecc校验,2级逐个字节比较。
对于线性文件系统分区,所有文件顺序存储,读取数据时,直接通过index索引得到某个文件的逻辑起始地址,然后从这个地址开始顺序搜索,获取某个偏移位置下的n个连续byte。链式文件系统是将地址空间分成若干个等分,即sector,它是操作的zui小单位;一个大文件可以分布在不连续的多个sector中,然后通过fat表将它们连接起来;在flash介质上实现链式文件系统,sector大小的选择是一个关键,由于flash的写操作,擦操作是以page,block为单位的,设小了使大块结构的flash写操作复杂,设多了又浪费空间,因此zui好的选择是将sector大小设为擦操作的zui小单位16k。
整个逻辑分区中,index,fat,frt表中的内容非常重要,一旦因为异常产生错误,可能会影响到所有文件;所以,这三个文件都做了备份处理,备份存放于不同的block中。同时,在对他们处理时,改写表中的更新状态。0xff表示开始更新,0x00表示更新结束。在文件系统初始化时,读取它们的更新状态,如果表中的更新状态为0xff,说明该表存在操作异常,可用备份表更正。
4.2层次接口
整个存储系统分成三层,如图2所示。
图2–层次结构
1.操作系统层
在整个存储系统中,操作系统扮演的是使用者的角色。当需要数据时,它通过调用文件系统层提供的接口函数获取数据,它不关心数据的来源和正确性。
2.文件系统层
文件系统层的任务是实现它和操作系统层的函数接口。在实现方式上,线性文件系统和链式文件系统有较大区别。比如文件读取mfread,线性文件系统直接读取所要的字节,而链式文件系统是每次先把对应的整个页读到文件缓冲区,然后再把所需数据拷贝到读到指定内存。文件删除mfde-lete,线性文件系统需要重新整理,不然就会因为大量的数据空洞(由于空间太小,无法放入新文件的小块区域)使得系统很快没有可用空间。链式文件系统只需修改文件系统的fat和frt,而不用做其他任何处理,当下次写入操作用到该块时,自动完成擦除。
3.驱动层
驱动层的任务是完成与flash之间的通讯协议,实现它和文件系统层的函数接口。接口函数包括页面读mpageread,页面写mpagewrite,块擦除mblockerase,随机读取mrnread,随机写入mrnwrite。mpageread,mpagewrite,mblockerase对整页或块进行操作,在链式文件系统中调用;mrnread,mrnwrite对字节单位进行操作,在线性文件系统中调用。其中mrnwrite比较麻烦,以写一个byte为例,它的操作分三步,首先将目标块中的所有数据读到内存buffer中,然后将要写入的数据更新到buffer,擦除目标块,zui后将已更新的buffer写回到目标块,这里的buffer大小是一个block。由于嵌入式系统的内存资源比较紧张,系统采用了块交换技术以降低成本,方法是在flash中搜索一个空闲块,用它充当buffer的角色。
5结论
通过上面的设计,所实现的存储系统具有以下的特点:
1.使用通用模式设计,增强了系统对flash设备的兼容性;2.使用双模式文件结构设计,使不同类型的数据处理效率同时达到zui优;3.使用地址映射表,屏蔽了坏块带来的隐患,增强了系统的健壮性;4.对重要数据采用备份保护,保证不会因为断电等异常导致系统的崩溃,增强了系统稳定性;5.采用块交换技术,节约系统成本;6.进行分级差错校验,提高了系统的执行效率;
因此,本文所设计的flash存储系统,非常适合于嵌入式系统的应用。
参考文献
[1]mikeficco.《如何在嵌入式电子设备中建立多媒体文件系统》.电子工程专辑,2004.02[2]董明,刘加,刘润生.《适宜于嵌入式多媒体应用的flash文件系统》.21ic,2003.3[3]贾东耀.《uclinux下norflash的jffs2文件系统构建》.21ic,2004.12[4]吴雨俊.《嵌入式系统中的线性flash文件系统设计》.21ic,2004.12