`
mmdev
  • 浏览: 12915816 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

嵌入式Linux的文件系统及其存储机制分析

 
阅读更多

//来源不详

嵌入式系统与通用PC机不同,一般没有硬盘这样的存储设备而是使用Flash闪存芯片、小型闪存卡等专为嵌入式系统设计的存储装置,本文分析了嵌入式系统中常用的存储设备及其管理机制,介绍了常用的基于FLASH的文件系统类型。
  1.嵌入式系统存储设备及其管理机制分析

  构建适用于嵌入式系统的Linux文件系统,必然会涉及到两个关键点,一是文件系统类型的选择,它关系到文件系统的读写性能、尺寸大小;另一个就是根文件系统内容的选择,它关系到根文件系统所能提供的功能及尺寸大小。

  嵌入式设备中使用的存储器是像Flash闪存芯片、小型闪存卡等专为嵌入式系统设计的存储装置。Flash是目前嵌入式系统中广泛采用的主流存储器,它的主要特点是按整体/扇区擦除和按字节编程,具有低功耗、高密度、小体积等优点。目前,Flash分为NOR, NAND两种类型。

  NOR型闪存可以直接读取芯片内储存的数据,因而速度比较快,但是价格较高。NOR型芯片,地址线与数据线分开,所以NOR型芯片可以像SRAM一样连在数据线上,对NOR芯片可以“字”为基本单位操作,因此传输效率很高,应用程序可以直接在Flash内运行,不必再把代码读到系统RAM中运行。它与SRAM的最大不同在于写操作需要经过擦除和写入两个过程。

  NAND型闪存芯片共用地址线与数据线,内部数据以块为单位进行存储,直接将NAND芯片做启动芯片比较难。NAND闪存是连续存储介质,适合放大文件。擦除NOR器件时是以64-128KB的块进行的,执行一个写入/擦除操作的时间为5s;擦除NAND器件是以8-32KB的块进行的,执行相同的操作最多只需要4ms。

  NAND Rash的单元尺寸几乎是NOR器件的一半,由于生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格。NOR flash占据了容量为1―16MB闪存市场的大部分,而NAND flash只是用在8―128MB的产品当中,这也说明NOR主要应用在代码存储介质中,NAND适合于数据存储。

  寿命(耐用性),在NAND闪存中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次。NAND存储器除了具有10比1的块擦除周期优势,典型的NAND块尺寸要比NOR器件小8倍,每个NAND存储器块在给定的时间内的删除次数要少一些。

  所有嵌入式系统的启动都至少需要使用某种形式的永久性存储设备,它们需要合适的驱动程序,当前在嵌入式Linux中有三种常用的块驱动程序可以选择。

  ● Blkmem驱动层

  Blkmem驱动是为uclinux专门设计的,也是最早的一种块驱动程序之一,现在仍然有很多嵌入式Linux操作系统选用它作为块驱动程,尤其是在uClinux中。它相对来说是最简单的,而且只支持建立在NOR型Flash和RAM中的根文件系统。使用Blkmem驱动,建立Flash分区配置比较困难,这种驱动程序为Flash提供了一些基本擦除/写操作。

  ● RAMdisk驱动层

  RAMdisk驱动层通常应用在标准Linux中无盘工作站的启动,对Flash存储器并不提供任何的直接支持, RAM disk就是在开机时,把一部分的内存虚拟成块设备,并且把之前所准备好的档案系统映像解压缩到该RAM disk环境中。当在Flash中放置一个压缩的文件系统,可以将文件系统解压到RAM,使用RAM disk驱动层支持一个保持在RAM中的文件系统。

  ● MTD驱动层

  为了尽可能避免针对不同的技术使用不同的工具,以及为不同的的技术提供共同的能力,Linux内核纳入了MTD子系统(memory Technology Device)。它提供了一致且统一的接口,让底层的MTD芯片驱动程序无缝地与较高层接口组合在一起。

  JFFS2, Cramfs, YAFFS等文件系统都可以被安装成MTD块设备。MTD驱动也可以为那些支持CFI接口的NOR型Flash提供支持。虽然MTD可以建立在RAM上,但它是专为基于Flash的设备而设计的。MTD包含特定Flash芯片的驱动程序,开发者要选择适合自己系统的Flash芯片驱动。Flash芯片驱动向上层提供读、写、擦除等基本的操作,MTD对这些操作进行封装后向用户层提供MTD char和MTD block类型的设备。

  MTD char类型的设备包括/dev/mtd0, /dev/mtdl等,它们提供对Flash原始字符的访问。MTD block类型的设备包括/dev/mtdblock0,/dev/mtdblock1等,MTD block设备是将Flash模拟成块设备,这样可以在这些模拟的块设备上创建像Cramfs, JFFS2等格式的文件系统。

  MTD驱动层也支持在一块Flash上建立多个Flash分区,每一个分区作为了一个MTD block设备,可以把系统软件和数据等分配到不同的分区上,同时可以在不同的分区采用不用的文件系统格式。这一点非常重要,正是由于这一点才为嵌入式系统多文件系统的建立提供了灵活性。


2. 基于Flash的文件系统

  鉴于Flash存储介质的读写特点,传统的Linux文件系统己经不适合应用在嵌入式系统中,像Ext2fs文件系统是为像IDE那样的块设备设计的,这些设备的逻辑块是512字节、1024字节等大小,没有提供很好的扇区
擦写支持,不支持损耗平衡,没有掉电保护,也没有特别完美的扇区管理,这不太适合于扇区大小因设备类型而划分的闪存设备。基于这样的原因,产生了很多专为Flash设备而设计的文件系统,常见的专用于闪存设备的文件系统如下:

  ● Romfs

  传统型的Romfs文件系统是最常使用的一种文件系统,它是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存;它按顺序存放所有的文件数据,所以这种文件系统格式支持应用程序以XIP方式运行,在系统运行时,可以获得可观的RAM节省空间。uClinux系统通常采用Romfs文件系统。

  ● Cramfs

  Cramfs是Linux的创始人Linus Torvalds开发的一种可压缩只读文件系统在Cramfs文件系统中,每一页被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间。Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比Ramfs需求的RAM 空间要大一点,因为Cramfs是采用分页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时, Cramfs文件系统自动计算压缩后的资料所存的位置,再即时解压缩到RAM中。

  另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性;但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。Cramfs映像通常是放在Flash中,但是也能放在别的文件系统里,使用loopback设备可以把它安装别的文件系统里。使用mkcramfs工具可以创建Cramfs映像。

  ● Ramfs/Tmpfs

  Ramfs也是Linus Torvalds开发的,Ramfs文件系统把所有的文件都放在RAM里运行,通常是Flash系统用来存储一些临时性或经常要修改的数据,相对于ramdisk来说,Ramfs的大小可以随着所含文件内容大小变化,不像ramdisk的大小是固定的。Tmpfs是基于内存的文件系统,因为tmpfs驻留在RAM 中,所以写/读操作发生在RAM 中。tmpfs文件系统大小可随所含文件内容大小变化,使得能够最理想地使用内存;tmpfs驻留在RAM,所以读和写几乎都是瞬时的。tmpfs的一个缺点是当系统重新引导时会丢失所有数据。

  ● JFFS2

  JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux,uCLinux中。JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是一个可读写的、压缩的、日志型文件系统,并提供了崩溃/掉电安全保护,克服了JFFS的一些缺点:使用了基于哈希表的日志节点结构,大大加快了对节点的操作速度;支持数据压缩;提供了“写平衡”支持;支持多种节点类型;提高了对闪存的利用率,降低了内存的消耗。这些特点使JFFS2文件系统成为目前Flash设备上最流行的文件系统格式,它的缺点就是当文件系统已满或接近满时,JFFS2运行会变慢,这主要是因为碎片收集的问题。

  ● YAFFS

  YAFFS/YAFFS2是一种和JFFSx类似的闪存文件系统,它是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。和JFFS2相比它减少了一些功能,所以速度更快,而且对内存的占用比较小。此外,YAFFS自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。YAFFS2支持大页面的NAND设备,并且对大页面的NAND设备做了优化。JFFS2在NAND闪存上表现并不稳定,更适合于NOR闪存,所以相对大容量的NAND闪存,YAFFS是更好的选择。

  在具体的嵌入式系统设计中可根据不同目录存放的内容不同以及存放的文件属性,确定使用何种文件系统
分享到:
评论

相关推荐

    嵌入式Linux文件系统及其存储机制分析

    构建适用于嵌入式系统的Linux文件系统,必然会涉及到两个关键点,一是文件系统类型的选择,它关系到文件系统的读写性能、尺寸大小;另一个就是根文件系统内容的选择,它关系到根文件系统所能提供的功能及尺寸大小。...

    嵌入式Linux文件系统及其存储机制分析 

    1.嵌入式系统存储设备及其管理机制分析 2. 基于Flash的文件系统 

    韦东山Linux视频第1期_裸板_UBoot_文件系统_驱动初步

    第11课第2节 构建根文件系统之init进程分析 第11课第3节 构建根文件系统之busybox 第11课第4节 构建根文件系统之构建根文件系统 第12课第1节 字符设备驱动程序之概念介绍 第12课第2.1节 字符设备驱动程序之LED...

    韦东山视频目录+链接整合-1 视频目录

    第11课第2节 构建根文件系统之init进程分析 第11课第3节 构建根文件系统之busybox 第11课第4节 构建根文件系统之构建根文件系统 第12课第1节 字符设备驱动程序之概念介绍 第12课第2.1节 字符设备驱动程序之LED...

    郭天祥ARM9视频教程(第13和20讲均可观看).docx

    第七部分 嵌入式系统移植之构建根文件系统 第十七讲 用busybox制作根文件系统 1. 嵌入式文件系统介绍 2. Linux目录结构详解 3. 配置,编译busybox 4. 完善根文件系统 5. 制作yaffs镜像 第十八讲 应用程序的移植 1. ...

    华南理工网络课程2021(嵌入式控制系统)平时作业.docx

    8、简述嵌入式控制系统的性能指标 答:嵌入式操作系统除具备了一般操作系统最基本的任务调度、同步机制、中断处理、文件处理等功能外,还具有如下特点 支持开放性和可伸缩性的体系结构,具有可裁减性; 提供统一的...

    宋劲彬的嵌入式C语言一站式编程

    2.4. 文件和目录操作的系统函数 3. VFS 3.1. 内核数据结构 3.2. dup和dup2函数 30. 进程 1. 引言 2. 环境变量 3. 进程控制 3.1. fork函数 3.2. exec函数 3.3. wait和waitpid函数 4. 进程间通信 4.1. 管道 4.2. 其它...

    操作系统重点

     操作系统的主要类型有:多道批处理系统、分时系统、实时系统、网络操作系统、个人机操作系统、分布式系统和嵌入式操作系统。  UNIX系统是著名的分时系统。  3.分时概念:主要是指若干并发程序对CPU时间的共享。 ...

    深入理解Android:卷I--详细书签版

    本章的拓展思考部分介绍了嵌入式系统中与存储有关的知识,还探讨了 Rild和Phone设计优化方面的问题。  第10章分析了多媒体系统中MediaScanner的工作原理。在本章的拓展思考部分,笔者提出了几个问题,旨在激发...

    基于go、gorm、gin、mysql及layui构建的人力资源管理系统.zip

    此外,MySQL支持多种操作系统,包括Windows、Linux、macOS、Solaris等,确保了其在不同环境下的兼容性和部署灵活性。 关系型模型与SQL支持 MySQL基于关系型数据库模型,数据以表格形式组织,并通过预定义的键(如...

    vc代码合集1448.rar

    2012-06-13 14:17 261,966 FAT32文件系统的存储机制及其在单片机上的实现.pdf 2012-06-13 14:22 287,547 VistaButton.rar 2012-06-13 14:17 309,272 C++经典数值算法源码.rar 2012-06-13 14:05 456,637 病毒扫描软件...

    本项目为SWPU数据库原理及应用大作业《西柚外卖订餐系统》,基于Python+Flask+MySQL开发,轻量简洁.zip

    此外,MySQL支持多种操作系统,包括Windows、Linux、macOS、Solaris等,确保了其在不同环境下的兼容性和部署灵活性。 关系型模型与SQL支持 MySQL基于关系型数据库模型,数据以表格形式组织,并通过预定义的键(如...

    精通Qt4编程(第二版)源代码

    \Qt还支持嵌入式系统,Qt的嵌入式版本称为Qtopia Core,可以在多种处理器上运行,目标操作系统通常是嵌入式Linux。Qtopia Core应用程序直接使用framebuffer,而不是笨重的X Window系统。Qt相关的另一个产品——Qt ...

    精通qt4编程(源代码)

    \Qt还支持嵌入式系统,Qt的嵌入式版本称为Qtopia Core,可以在多种处理器上运行,目标操作系统通常是嵌入式Linux。Qtopia Core应用程序直接使用framebuffer,而不是笨重的X Window系统。Qt相关的另一个产品——Qt ...

    LightGUI一个轻量级的GUI

    Light Gui 主要针对嵌入式操作系统,如嵌入式linux, uC/OS-II 等提供支持。在这些 OS 上,Light Gui 支持以多线程模式运行。其主要技术特性描述如下。 1) 硬件适配性: 可支持各种 32 位处理器架构,如 ARM、...

    一个简单的仿QQ在线聊天系统 .zip

    此外,MySQL支持多种操作系统,包括Windows、Linux、macOS、Solaris等,确保了其在不同环境下的兼容性和部署灵活性。 关系型模型与SQL支持 MySQL基于关系型数据库模型,数据以表格形式组织,并通过预定义的键(如...

    新版Android开发教程.rar

    � 计算技术、无线接入技术的发展,使嵌入式系统逐渐有能力对桌面系统常规业务进行支持。 � 谷歌长期以来奉行的移动发展战略:通过与全球各地的手机制造商和移动运营商结成合作伙伴,开发 既 有用又有吸引力的移动...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Android 一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导开发 IOS 由苹果公司开发的移动操作系统 Webkit 一个开源的浏览器引擎,在手机上的...

    Firebird数据库中文版

    Firebrid在常见的平台上都可运行,如Linux和Windows(包括Windows终端服务器)其它支持的平台包括(MAC OS(苹果机), Solaris及HP-UX) 把数据库从一个平台转到另一个平台,非常的容易,只要备份数据库,然后,再...

Global site tag (gtag.js) - Google Analytics