0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

多种嵌入式文件系统介绍:基于FLASH的文件系统

Q4MP_gh_c472c21 来源:未知 作者:李倩 2018-04-18 14:54 次阅读

1.多种嵌入式文件系统介绍

Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(VirtualFileSystem),为各类文件系统提供一个统一的操作界面和应用编程接口

Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。

不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM(DRAM,SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:

jffs2,yaffs,cramfs,romfs,ramdisk,ramfs/tmpfs等。

1.1.基于FLASH的文件系统

Flash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block)为单位进行的。

闪存主要有NOR和NAND两种技术(简单比较见附录)。Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。因此,必须针对Flash的硬件特性设计符合应用要求的文件系统;传统的文件系统如ext2等,用作Flash的文件系统会有诸多弊端。

在嵌入式Linux下,MTD(MemoryTechnologyDevice,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统一的抽象接口,即Flash的文件系统都是基于MTD驱动层的(参见上面的Linux下的文件系统结构图)。使用MTD驱动程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash有更好的支持、管理和基于扇区的擦除、读/写操作接口。

顺便一提,一块Flash芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash芯片也可以合并为一个分区使用,采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。

1.1.1.jffs2

JFFS文件系统最早是由瑞典AxisCommunications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux,uCLinux中。

Jffs2:日志闪存文件系统版本2(JournallingFlashFileSystemv2)

主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。

目前jffs3正在开发中。关于jffs系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt。

jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另外,jffsx文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。

1.1.2.yaffs

yaffs/yaffs2(YetAnotherFlashFileSystem)是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE,pSOS和ThreadX等。

yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。

yaffs与yaffs2的主要区别在于,前者仅支持小页(512Bytes)NAND闪存,后者则可支持大页(2KB)NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。

1.1.3.ubifs

无排序区块图像文件系统(UnsortedBlockImageFileSystem,UBIFS)是用于固态硬盘存储设备上,并与LogFS相互竞争,作为JFFS2的后继文件系统之一。真正开始开发于2007年,并于2008年10月第一次加入稳定版本于Linux核心2.6.27版。

UBIFS最早在2006年由IBM与Nokia的工程师ThomasGleixner,ArtemBityutskiy所设计,专门为了解决MTD(MemoryTechnologyDevice)设备所遇到的瓶颈。由于NandFlash容量的暴涨,YAFFS等皆无法再去控制NandFlash的空间。UBIFS通过子系统UBI处理与MTDdevice之间的动作。与JFFS2一样,UBIFS建构于MTDdevice之上,因而与一般的blockdevice不兼容。

JFFS2运行在MTD设备之上,而UBIFS则只能工作于UBIvolume之上。也可以说,UBIFS涉及了三个子系统:

1.MTD子系统,提供对flash芯片的访问接口,MTD子系统提供了MTDdevice的概念,比如/dev/mtdx,MTD可以认为是rawflash

2.UBIsubsystem,为flashdevice提供了wear-leveling和volumemanagement功能;UBI工作在MTD设备之上,提供了UBIvolume;UBI是MTD设备的高层次表示,对上层屏蔽了一些MTD不得不处理的问题,比如wearing以及坏块管理

3.UBIFS文件系统,工作于UBI之上

以下是UBIFS的一些特点:

可扩展性:UBIFS对flash尺寸有着很好的扩展性;也就是说mount时间,内存消耗以及I/O速度都不依赖与flash尺寸(对于内存消耗并不是完全准确的,但是依赖性非常的低);UBIFS可以很好的适应GBflashes;当然UBI本身还有扩展性的问题,无论如何UBI/UBIFS都比JFFS2的可扩展性好,此外如果UBI成为瓶颈,还可以通过升级UBI而不需改变UBIFS

快速mount:不像JFFS2,UBIFS在mount阶段不需要扫描整个文件系统,UBIFSmount介质的时间只是毫秒级,时间不依赖与flash的尺寸;然而UBI的初始化时间是依赖flash的尺寸的,因此必须把这个时间考虑在内

write-back支持:回写或者叫延迟写更准确些吧,同JFFS2的write-through(立即写入内存)相比可以显著的提高文件系统的吞吐量。

异常unmount适应度:UBIFS是一个日志文件系统可以容忍突然掉电以及unclean重启;UBIFS通过replay日志来恢复uncleanunmount,在这种情况下replay会消耗一些时间,因此mount时间会稍微增加,但是replay过程并不会扫描整个flash介质,所以UBIFS的mount时间大概在几分之一秒。

快速I/O-即使我们disablewrite-back(可以在unmount时使用-osyncmount选项),UBIFS的性能仍然接近JFFS2;记住,JFFS2的同步I/O是非常惊人的,因为JFFS2不需要在flash上维护indexingdata结构,所以就没有因此而带来的负担;而UBIFS恰恰是有index数据的。UBIFS之所以够快是因为UBIFS提交日志的方式:不是把数据从一个地方移动到另外一个位置,而只是把数据的地址加到文件系统的index,然后选择不同的eraseblock作为新的日志块,此外还有multi-headed日志方式等技巧。

on-the_flightcompression-存储在flash介质上的数据是压缩的;同时也可以灵活的针对单个文件来打开关闭压缩;例如,可能需要针对某个特定的文件打开压缩,或者可能缺省方式下支持压缩,但是对多媒体文件则关闭压缩。

可恢复性-UBIFS可以从index破坏后恢复;UBIFS中的每一片信息都有一个header来描述,因此可以通过扫描这个flash介质来重构文件系统,这点和JFFS2非常类似;想像一下,如果你擦出了FAT文件系统的FAT表,那么对于FATFS是致命的错误,但是如果擦除UBIFS的index,你人然可以重构文件系统,当然这需要一个特定的用户空间程序来做这个恢复

完整性-UBIFS通过写checksum到flash介质上来保证数据的完整性,UBIFS不会无视损坏文件数据或meta-data;缺省的情况,UBIFS仅仅检查meta-data的CRC,但是你可以通过mount选项,强制进行dataCRC的检查

ubifs详细介绍

1.1.4.Cramfs

Cramfs(CompressedROMFileSystem)是Linux的创始人LinusTorvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。

在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。

Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比Ramfs需求的RAM空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs文件系统自动计算压缩后的资料所存的位置,再即时解压缩到RAM中。

另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。

由于以上特性,Cramfs在嵌入式系统中应用广泛。

但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。

Cramfs映像通常是放在Flash中,但是也能放在别的文件系统里,使用loopback设备可以把它安装别的文件系统里。

(5)Romfs

传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以XIP(eXecuteInPlace,片内运行)方式运行,在系统运行时,节省RAM空间。uClinux系统通常采用Romfs文件系统。

其他文件系统:fat/fat32也可用于实际嵌入式系统的扩展存储器(例如PDA,Smartphone,数码相机等的SD卡),这主要是为了更好的与最流行的Windows桌面操作系统相兼容。ext2也可以作为嵌入式Linux的文件系统,不过将它用于FLASH闪存会有诸多弊端。

1.2.基于RAM的文件系统

1.2.1.Ramdisk

Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。

在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。

1.2.2.ramfs/tmpfs

Ramfs是LinusTorvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。(实际上,VFS本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。)

Ramfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对Flash存储器的读写损耗,也提高了数据读写速度。

Ramfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:不能格式化,文件系统大小可随所含文件内容大小变化。

Tmpfs的一个缺点是当系统重新引导时会丢失所有数据。

1.2.3.NFS

NFS网络文件系统(NetworkFileSystem)是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。

以上讨论的都是基于存储设备的文件系统(memory-basedfilesystem),它们都可用作Linux的根文件系统。实际上,Linux还支持逻辑的或伪文件系统(logicalorpseudofilesystem),例如procfs(proc文件系统),用于获取系统信息,以及devfs(设备文件系统)和sysfs,用于维护设备文件。

²附录:NOR闪存与NAND闪存比较

NORFLASHNANDFLASH

接口时序同SRAM,易使用地址/数据线复用,数据位较窄

读取速度较快读取速度较慢

擦除速度慢,以64-128KB的块为单位擦除速度快,以8-32KB的块为单位

写入速度慢(因为一般要先擦除)写入速度快

随机存取速度较快,支持XIP(eXecuteInPlace,芯片内执行),适用于代码存储。在嵌入式系统中,常用于存放引导程序、根文件系统等。

顺序读取速度较快,随机存取速度慢,适用于数据存储(如大容量的多媒体应用)。在嵌入式系统中,常用于存放用户文件系统等。

单片容量较小,1-32MB单片容量较大,8-128MB,提高了单元密度

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4975

    文章

    18228

    浏览量

    287667
  • FlaSh
    +关注

    关注

    10

    文章

    1544

    浏览量

    146619
  • NAND闪存
    +关注

    关注

    2

    文章

    187

    浏览量

    22554

原文标题:一切皆文件,嵌入式领域中各种文件系统的介绍

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    详细讲解嵌入式Linux支持的多种文件系统

    Linux支持多种文件系统类型,在嵌入式开发中上常用有:ROMFS、JFFS2、NFS、CRAMFS、YAFFS、UBIFS等。 JFFS文件系统 JFFS
    的头像 发表于 12-19 07:24 4639次阅读

    嵌入式文件系统znFAT介绍

    今天给大家介绍一款适用于单片机的嵌入式文件系统——znFAT。 这款文件系统嵌入式大佬于振南开发,并在 gitee 开源共享的。
    发表于 09-13 09:22 723次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>文件系统</b>znFAT<b class='flag-5'>介绍</b>

    嵌入式文件系统构建

    Linux支持多种文件系统,同样,嵌入式Linux也支持多种文件系统。虽然在嵌入式
    发表于 09-02 14:25

    嵌入式文件系统概述

    的组织形式。·文件系统为操作系统提供了必要的用于创建文件、删除文件、读文件和写文件相应的
    发表于 11-05 06:29

    嵌入式系统中的Flash文件系统

    介绍嵌入式系统中的 Flash文件系统。对 FFS需求,Flash存储器特性,FFS要求和实现作
    发表于 04-07 09:40 15次下载

    车载MP3中Flash文件系统的设计与应用

    基于Flash 存储器的特点,详细介绍适合于车载MP3 的Flash 文件系统(包括Flash存储管理
    发表于 04-15 10:03 18次下载

    嵌入式系统中的线性Flash 文件系统设计

    设计一种能够在典型嵌入式环境下应用的线性文件系统, 为嵌入式系统Flash 空间的管理提供一种非常有效的手段。它包装和通用
    发表于 05-15 15:07 10次下载

    车载MP3中Flash文件系统的设计与应用

    基于Flash 存储器的特点,详细介绍适合于车载MP3 的Flash 文件系统(包括Flash存储管理
    发表于 05-16 13:54 11次下载

    嵌入式Linux上实现JFFS文件系统

    本文通过在嵌入式操作系统uClinux 上实现可读写JFFS 文件系统的实例,介绍了在嵌入式系统
    发表于 05-31 15:10 23次下载

    构造嵌入式Linux的文件系统

    文件系统是Linux 系统最基本的资源。本文介绍了一种嵌入式Linux 文件系统的构造过程,较为详细地讲解了如何选择和配置所需的
    发表于 08-07 09:11 10次下载

    基于嵌入式Linux的Flash文件系统的实时性能研究_孙晓荣

    基于嵌入式Linux的Flash文件系统的实时性能研究_孙晓荣
    发表于 03-16 10:09 0次下载

    Linux最新UBI文件系统介绍

    嵌入式linux中文站关注嵌入式linux文件系统的发展。在linux-2.6.27以前,谈到Flash文件系统,大家很多时候多会想到cra
    发表于 04-27 19:37 6215次阅读

    Linux嵌入式文件系统如何构建

    Linux支持多种文件系统,同样,嵌入式Linux也支持多种文件系统。虽然在嵌入式
    发表于 06-18 09:23 871次阅读

    嵌入式Linux系统移植-(Linux文件系统

    上的组织形式。·文件系统为操作系统提供了必要的用于创建文件、删除文件、读文件和写文件相应的
    发表于 11-02 12:51 16次下载
    <b class='flag-5'>嵌入式</b>Linux<b class='flag-5'>系统</b>移植-(Linux<b class='flag-5'>文件系统</b>)

    文件系统】FatFs文件系统嵌入式芯片LPC18XX上的移植

    文件系统】FatFs文件系统嵌入式芯片LPC18XX上的移植
    发表于 12-04 10:51 12次下载
    【<b class='flag-5'>文件系统</b>】FatFs<b class='flag-5'>文件系统</b>在<b class='flag-5'>嵌入式</b>芯片LPC18XX上的移植