一种基于Linux的flash文件系统存储策略

时间:2022-09-10 09:31:27

一种基于Linux的flash文件系统存储策略

摘要:随着嵌入式系统的广泛应用,嵌入式系统中的数据存储和数据管理显得日益重要。本文主要介绍flash存储器的存储特点,Linux文件系统的两类存储策略:块式存储和线性存储,并在此基础上提出了一种改进的简单日志文件系统的存储策略。

关键词:Flash;Linux;文件系统存储策略

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)17-31448-02

A Method on Flash File Storage System Base on Linux

SUN Jing

(College of Computer Science, Jilin Normal University, Siping 136000, China)

Abstract:With extensive application of embedded system, data storage and data manage become very important on embedded system. This paper describes the characteristic of flash storage and two kinds of storage method on Linux file system: block storage and chain storage. And put forward a new storage method based on Linux file system, named simple log file system.

Key words:Flash; Linux; File system storage method

1 引言

在当前数字信息技术和网络技术高速发展的后PC(Post-PC)时代,嵌入式系统已经广泛地渗透到科学研究、工程设计、军事技术、各类产业和商业文件艺术、娱乐业以及人们的日常生活等方方面面中。随着嵌入式系统越来越广泛的应用,嵌入式系统中的数据存储和数据管理已经成为一个重要的课题摆在设计人员面前。

2 Flash的特点

Flash存储器作为一种安全、快速的存储体,具有体积小、容量大、成本低、掉电数据不丢失等一系列优点。目前已经逐步取代其它半导体存储元件,成为嵌入式系统中主要数据和程序载体,大部分的嵌入式系统都把文件系统建立在Flash存储器上。

Flash存储器在读取方面与普通的SRAM存储器类似,一般可以实现完全随机的读取。Flash存储器最大的不同在于写操作方面。Flash存储器的写操作需要经过“擦除―写入”两个操作过程。

3 Linux文件系统的存储策略

Linux文件系统的存储策略主要有两大类:块式存储和线性存储策略。

3.1 块式存储策略

该文件系统往往使用超级块来记录文件系统的结构和参数信息,该信息用于文件系统的管理和维护。当虚拟文件系统访问某一个具体的文件系统时,首先操作系统要获取该文件系统的超级块,解析出必要的文件系统信息。同时当文件系统写文件时,也经常要修改超级块,已确定指定的存储空间是否为空。因此,块式存储策略主要采用以块为单位进行存储。基本上采用改写方式对Flash存储器进行操作,即将文件所在的块的全部内容读出到RAM,在RAM中改写之后,将此信息顺序写入到Flash存储器中原先的块中。采用这种方式的文件系统主要是一些原先存储在磁盘上的文件系统,如ext2等。

3.2 线性存储策略

该存储策略中,数据不是以块为单位进行存储,而是按线性方式存储在Flash存储器上。即第一个文件创建之前,必须进行初使化,将所有分配给文件系统的Flash空间探险。当创建第一个文件时,起始位置从文件系统的起始地址开始,写入文件创建信息、文件数据,得到新的空闲地址空间的起始地址。然后,当写入其它文件时,从新的空闲地址空间的起始地址开始顺序写入到Flash存储器中,文件在整个Flash存储空间内的存储顺序是连续的,其情况如图1所示。

4 简单日志文件系统

综合上述两种存储策略的优点,提出了一种新的文件存储策略。此存储策略分为两层:下层为块存储层,上层为文件存储层。

图1 线性存储空间分布

4.1 块存储层

主要是对块进行管理,将分配给文件系统的Flash存储器空间看作一个循环队列,每一个存储块是队列中的一个节点。文件系统对队列编号,队列中第一块的块号是0,依次类推,物理地址空间最大的块号是系统中块的总数减一。最开始时,此队列中的每一个节点都是空闲节点。当文件存储层申请新的空闲块时,从Flash存储空间的开始处顺序的分配块。当Flash存储空间只剩下最后一个空闲块时,执行垃圾清理程序。假设共有n个脏块(即此块上不再有未删除的文件),将这n个脏块清空,使之成为空闲块。然后,将从最后一个空闲块开始的n个块上的数据移到这些空闲块上,并将这n个块清空,使之成为空闲空间。这样,循环往复地使用块。整个Flash存储器的可能出现的使用情况如图2所示。如果Flash存储器未进行过垃圾清理,则基本上是图2中(1)的状态。如果进行过垃圾清理,则由于最后一个空闲块出现的位置不同,以及删除的块数不同,垃圾清理后Flash的使用情况也会出现不同,但总体上来说只有图2中的四种情况。

图2 Flash存储器空间使用情况

图2中(1)(2)(3)中空闲块在物理上和逻辑上都是连续的,而在(4)中只是在逻辑上是连续的。正因为空闲块在逻辑上是连续的,而且每一次分配空闲块,都是从逻辑块首进行分配(在(1)(2)(3)中是物理上第一个空闲块,在(4)中物理上第二个连续空闲块中的物理上的第一个空闲块)。垃圾清理后,又会从最后一个空闲块的逻辑上的下一块开始按顺序进行清理,所以基本上可以保证每个被探险的次数基本相等。所以能够保证整个文件系统的负载平衡。

4.2 文件存储层

基本思想 在简单日志文件系统中,文件在Flash存储器上是以一个或多个节点的形式存在的。文件的建立、数据写入、数据修改、文件删除等都是以向Flash存储器上写入节点的方式完成的,通过写入节点完成日志功能。文件存储层中以节点的形式在Flash存储器上存储文件数据。

在Flash存储器存储一个文件时,可能有多个节点存储数据,每个节点的总长度最大为一个块(64K或32K)的大小。节点的结构如图3所示。

图3 节点结构

节点结构组成如下:

信息段:魔数,文件号,父节点号,建立时间,最后存取时间,最后修改时间,文件拥有者标识号,文件拥有者所在组的标识号,数据段大小,名字大小,校验和,替换数据大小,写入文件的逻辑位置,写入顺序等信息(其中魔数,父节点号,替换数据大小,写入文件的逻辑位置,版本号等作息是本文件系统特有的,其余信息是每个Linux操作系统下的文件系统所必须具有的)。

名字段:文件名,其大小可以为0。

数据段:此次写入的数据,大小可以为0。

节点分为四种类型:

(1)头节点:即建立文件时建立的节点,此节点无数据,ver字段为1。

(2)无数据节点:关节点、目录文件节点、设备文件节点、删除节点(删除一个文件时写入的节点)。

(3)普通文件节点L写入数据时建立的节点,此节点中有ver字段,标志数据写入的先后顺序。

(4)特殊文件节点:目录文件节点、设备文件节点等。

对于文件的存储,文件存储层采用日志存储策略。由于Flash存储器的读写特殊性,因此改写方式浪费时间,影响负载平衡,且极易出错。因此为了适应这种读写特殊性,所以文件存储层采用不同于磁盘的日志存储策略。即每次存储数据时,并不直接修改已写入的数据,而是写入新的节点。文件以节点为单位进行存储,节点不能越块存储。当一次写入数据较多,一个块的空间不够时,则将数据分配给多个节点存储。一个文件的数据尽可能写到同一个块内,节点中有ver字段,以表示存储的先后顺序,如果是修改文件,节点中有记录写入数据替换字节数的信息,和写入数据在文件中的逻辑位置的信息。删除文件时并不直接擦除文件所在的块,而是向Flash存储器中写入一个节点来表示此文件已被删除。

5 结束语

该文件系统存储策略在测试平台MCF5272上实现,测试较好。为进一步研究嵌入式系统的文件系统方面有一定的借鉴作用。

参考文献:

[1]陈峰, 尹寒. 嵌入式系统中的Flash存储管理[J]. 单片机与嵌入式系统应用,2003,(2).

[2]吴雨俊. 嵌入式系统中的线性Flash文件系统设计[J]. 单片机与嵌入式系统应用, 2003,(10).

[3]黄珊. 军用嵌入式系统中的Flash文件系统设计[J]. 现代电子技术, 2003,(16).

[4]张红兵, 魏波. 大容量内存文件系统设计及μC/OS下的实现[J]. 单片机与嵌入式系统应用, 2004,(3).

[5]金明亮, 游大海. 基于CC/CCS的Flash文件系统设计[J]. 单片机与嵌入式系统应用, 2005,(1).

[6]付助荣, 王建华. 基于虚拟扇区的Flash存储管理技术[J]. 单片机与嵌入式系统应用, 2004,(6).

[7]陈文华, 郭培源, 陈岩. S3C44B0X嵌入式系统中Flash文件系统的设计与实现[J]. 北京工商大学学报(自然科学版),2006,(3).

[8]吉峰, 白瑞林. 基于Flash存储器的嵌入式文件系统设计[J]. 江南大学学报(自然科学版),2006,(1).

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

上一篇:关于C语言中函数参数传递问题的探讨 下一篇:基于建构主义的VB基础教学研究