`
cjc
  • 浏览: 680989 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

作者: 华清远见

嵌入式系统与通用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文件系统及其存储机制分析 #### 一、嵌入式系统存储设备及其管理机制 嵌入式系统与通用个人计算机(PC)有着显著的区别,特别是存储设备方面。通常情况下,嵌入式系统不会使用硬盘作为主要的存储...

    嵌入式Linux文件系统剪裁方法研究

    文件系统作为操作系统的核心组件之一,承担着管理存储设备上的文件及其提供给操作系统和用户的文件存取、共享和保护功能。其设计的质量直接影响到整个系统的安全性与性能表现。随着Linux操作系统的发展,其在嵌入式...

    嵌入式linux下常见的文件系统

    ### 嵌入式Linux下的常见文件系统 在嵌入式Linux系统中,根据不同的应用场景与硬件特性,选择合适的文件系统对于确保系统稳定运行、提高性能具有重要意义。本文将详细介绍几种常用的文件系统类型及其特点。 #### 1...

    如何制作嵌入式Linux文件系统

    下面将详细介绍嵌入式Linux文件系统的制作过程及其常见类型。 一、文件系统定义 文件系统(Filesystem)是操作系统用于管理磁盘或其他存储设备上的数据的一种机制。它负责组织文件和目录,控制访问权限,并管理文件...

    基于NandFlash的嵌入式Linux文件系统设计.pdf

    1. 嵌入式Linux文件系统设计:文章介绍了基于NAND Flash的嵌入式Linux文件系统设计,讨论了文件系统架构和功能特点,提供了一个可靠、健壮、实用的文件系统设计方案。 2. NAND Flash存储器:文章详细介绍了NAND ...

    嵌入式Linux的存储技术

    总的来说,嵌入式Linux的存储技术是一个综合了硬件选型、软件配置、数据管理等多个方面的系统工程,开发者需要深入理解各种存储设备的特性和Linux内核的相关机制,才能设计出满足应用需求的高效、可靠的存储解决方案...

    嵌入式Linux文件系统的研究与应用.pdf

    嵌入式Linux文件系统在现代电子设备和物联网设备中扮演着至关重要的角色,尤其是在基于ARM架构的嵌入式系统中。ARM技术因其低功耗、高性能的特点被广泛应用于各种嵌入式领域,如智能家居、工业控制、移动通信等。...

    嵌入式LINUX 系统开发概述

    ### 嵌入式Linux系统开发概述 #### 一、嵌入式系统基本概念与特点 **1.1 嵌入式系统定义** 嵌入式系统是指将计算机硬件和软件集成在一个或多个处理器上,形成一个专用的计算机系统,用于实现特定功能的产品或设备...

    嵌入式linux文件系统jffs2制作工具

    嵌入式Linux文件系统在开发过程中扮演着至关重要的角色,其中JFFS2(Journaling Flash File System 2)是一种广泛应用于嵌入式设备的闪存文件系统。它设计的目标是充分利用并优化闪存设备的特性,同时提供数据的可靠...

    嵌入式Linux 中多文件系统的构建

    #### 嵌入式Linux文件系统分析与方案选择 ##### 1.1 嵌入式设备中的存储器 在嵌入式设备中,常用的存储介质通常是Flash存储器,而非PC机上的硬盘。Flash存储器具有低功耗、高密度和小体积的优点,非常适合嵌入式...

    嵌入式Linux文件IO及目录编程

    这些实训有助于加深对Linux文件系统和文件操作机制的理解,并能在嵌入式系统中有效地应用文件IO接口进行数据的存储和管理。实训项目可能还会涵盖错误处理和异常情况的处理,确保文件操作的稳定性和可靠性。此外,...

    嵌入式linux知识要点

    3. **文件系统**:介绍嵌入式Linux中常见的文件系统类型及其实现机制。 - 如ext2/ext3/ext4等文件系统在Linux中的实现原理与使用场景。 #### 二、嵌入式硬件接口与驱动开发 1. **I2C总线**:阐述I2C通信协议的...

    第20章Linux内核移植ARM嵌入式Linux系统开发详解.pdf

    Linux内核移植ARM嵌入式Linux系统开发详解 本章节主要讲解了Linux内核移植到ARM嵌入式Linux系统的开发详解,涵盖了Linux内核移植的要点、内核体系结构框架、从现有代码移植内核等方面的知识。 Linux内核移植要点:...

    嵌入式linux驱动开发实例分析

    3. **查看系统崩溃信息**:通过分析系统崩溃时产生的core dump文件,可以定位问题所在。 4. **使用硬件调试器**:对于某些特定硬件故障,可能需要借助专门的硬件调试工具进行深入分析。 5. **使用 proc 或 sysfs ...

    Linux 文件系统介绍

    在嵌入式 Linux 应用中,由于存储设备通常是 RAM 或 ROM(如 FLASH 存储器),因此常用的文件系统类型包括 jffs2、yaffs、cramfs、romfs、ramdisk、ramfs/tmpfs 等。 - **NOR 和 NAND 闪存的区别**:NOR 闪存支持...

    嵌入式Linux系统开发课程大纲

    ### 嵌入式Linux系统开发课程大纲解析 #### 一、Linux基础(4小时) - **Linux简介**:介绍Linux操作系统的历史和发展现状。 - **Linux目录结构**:讲解Linux系统的目录组织方式及其意义。 - **Linux命令行操作**:...

    嵌入式linux系统中常用的文件系统PPT学习教案.pptx

    以下是一些常见的嵌入式Linux文件系统及其特点: 1. **Ext2/Ext3**: - Ext2是Linux早期的标准文件系统,支持2GB的最大文件大小和255个字符的文件名。其优点在于简洁,适用于小到中型的系统,但不支持日志功能。 ...

    嵌入式Linux系统开发技术详解-基于ARM]

    Linux文件系统是操作系统的核心组成部分,它不仅提供了文件存储与访问的接口,还承载了系统运行所需的各种服务和应用程序。了解并构建一个适合嵌入式应用的根文件系统是系统集成的关键步骤。 #### 六、开源资源与...

Global site tag (gtag.js) - Google Analytics