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

上传人:b****1 文档编号:2877569 上传时间:2023-05-04 格式:DOCX 页数:15 大小:23.70KB
下载 相关 举报
嵌入式linux下常见的文件系统.docx_第1页
第1页 / 共15页
嵌入式linux下常见的文件系统.docx_第2页
第2页 / 共15页
嵌入式linux下常见的文件系统.docx_第3页
第3页 / 共15页
嵌入式linux下常见的文件系统.docx_第4页
第4页 / 共15页
嵌入式linux下常见的文件系统.docx_第5页
第5页 / 共15页
嵌入式linux下常见的文件系统.docx_第6页
第6页 / 共15页
嵌入式linux下常见的文件系统.docx_第7页
第7页 / 共15页
嵌入式linux下常见的文件系统.docx_第8页
第8页 / 共15页
嵌入式linux下常见的文件系统.docx_第9页
第9页 / 共15页
嵌入式linux下常见的文件系统.docx_第10页
第10页 / 共15页
嵌入式linux下常见的文件系统.docx_第11页
第11页 / 共15页
嵌入式linux下常见的文件系统.docx_第12页
第12页 / 共15页
嵌入式linux下常见的文件系统.docx_第13页
第13页 / 共15页
嵌入式linux下常见的文件系统.docx_第14页
第14页 / 共15页
嵌入式linux下常见的文件系统.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

《嵌入式linux下常见的文件系统.docx》由会员分享,可在线阅读,更多相关《嵌入式linux下常见的文件系统.docx(15页珍藏版)》请在冰点文库上搜索。

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

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

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

RomFS:

只读文件系统,可以放在ROM空间,也可以在系统的RAM中,嵌入式linux中常用来作根文件系统RamFS:

利用VFS自身结构而形成的内存文件系统,使用系统的RAM空间JFFS/JFFS2:

为Flash设

  •RomFS:

只读文件系统,可以放在ROM空间,也

可以在系统的RAM中,嵌入式linux中常用来作

根文件系统

•RamFS:

利用VFS自身结构而形成的内存文件系

统,使用系统的RAM空间

•JFFS/JFFS2:

为Flash设计的日志文件系统

•Yaffs:

专门为NandFlash设计

•proc:

为内核和内核模块将信息发送给进程提

供一种机制,可以查看系统模块装载的信息

•devFS:

设备文件系统

Linux上的Ext2fs

•支持4TB存储、文件名称最长1012字符

•可选择逻辑块

•快速符号链接

•Ext2不适合flash设备

•是为象IDE设备那样的块设备设计的,逻辑块大小必

须是512byte、1KB、2KB等

•没有提供对基于扇区的擦除/写操作的良好管理

•如果在一个扇区中擦除单个字节,必须将整个扇区复制到

RAM,然后擦除,再重写入

•在出现电源故障时,Ext2fs是不能防止崩溃的

•文件系统不支持损耗平衡,缩短了flash的寿命

jffs/jffs2文件系统的优缺点

•日志文件系统

•提供了更好的崩溃、掉电安全保护

•jffs2支持对flash的均匀磨损

•在扇区级别上执行闪存擦除/写/读操作要

比Ext2文件系统好

•文件系统接近满时,JFFS2会大大放慢运行

速度——垃圾收集

Nand上yaffs文件系统的优势

•专门为Nandflash设计的日志文件系统

•jffs/jffs2不适合大容量的Nandflash

•jffs的日志通过jffs_node建立在RAM中,占用

RAM空间:

对于128MB的Nand大概需要4MB的空间

来维护节点

•启动的时候需要扫描日志节点,不适合大容量

的Nandflash

•FAT系统没有日志

编译yaffs文件系统

•mtd的最新补丁升级?

•接口更新,适合与yaffs

•与原有的mtd驱动程序不兼容,需要重写

•如果使用旧mtd驱动需要定义Makefile中

MTD_OLD=-DCONFIG_YAFFS_USE_OLD_MTD

•参考文档:

yaffs-rootfs-howto

•最新版的yaffs网站:

http:

//www.aleph1.co.uk/armlinux/projects/yaffs

使用yaffs文件系统

•通过cat/proc/yaffs命令可以看到yaffs系

统的相关信息

•mount-tyaffs/dev/mtdblock/0/mnt/ya

ffs

关于Linux文件系统

JFFS全称为:

TheJournallingFlashFileSystem(日志闪存文件系统)最初由瑞典的AxisCommunications开发,RedHat的DavidWoodhouse对它进行了改进。

作为用于微型嵌入式设备的原始闪存芯片的实际文件系统而出现。

JFFS文件系统是日志结构化的,这意味着它基本上是一长列节点。

每个节点包含有关文件的部分信息—可能是文件的名称、也许是一些数据。

相对于Ext2fs,JFFS因为有以下这些优点而在无盘嵌入式设备中越来越受欢迎:

  

  1JFFS在扇区级别上执行闪存擦除/写/读操作要比Ext2文件系统好。

  2JFFS提供了比Ext2更好的崩溃/掉电安全保护。

当需要更改少量数据时,Ext2文件系统将整个扇区复制到内存(DRAM)中,在内存中合并新数据,并写回整个扇区。

这意味着为了更改单个字,必须对整个扇区(64KB)执行读/擦除/写例程—这样做的效率非常低。

要是运气差,当正在DRAM中合并数据时,发生了电源故障或其它事故,那么将丢失整个数据集合,因为在将数据读入DRAM后就擦除了闪存扇区。

JFFS附加文件而不是重写整个扇区,并且具有崩溃/掉电安全保护这一功能。

  3这可能是最重要的一点:

JFFS是专门为象闪存芯片那样的嵌入式设备创建的,所以它的整个设计提供了更好的闪存管理。

  要构建JFFS文件系统,首先要有硬件设备FLASH及支持JFFS文件系统的操作系统。

摘要:

本文主要分析了uclinux2.4内核的jffs文件系统机制。

希望能对基于uclinux开发产品的广大工程师有所帮助。

关键词:

uclinuxvfsjffs

申明:

这份文档是按照自由软件开放源代码的精神发布的,任何人可以免费获得、使用和重新发布,但是你没有限制别人重新发布你发布内容的权利。

发布本文的目的是希望它能对读者有用,但没有任何担保,甚至没有适合特定目的的隐含的担保。

更详细的情况请参阅GNU通用公共许可证(GPL),以及GNU自由文档协议(GFDL)。

你应该已经和文档一起收到一份GNU通用公共许可证(GPL)的副本。

如果还没有,写信给:

TheFreeSoftwareFoundation,Inc.,675MassAve,Cambridge,MA02139,USA

欢迎各位指出文档中的错误与疑问

一、flash读写的特殊性

对于嵌入式系统,flash是很常见的一种设备,而大部分的嵌入式系统都是把文件系统建立在flash之上,由于对flash操作的特殊性,使得在flash上的文件系统和普通磁盘上的文件系统有很大的差别,对flash操作的特殊性包括:

(1)不能对单个字节进行擦除,最小的擦写单位是一个block,有时候也称为一个扇区。

典型的一个block的大小是64k。

不同的flash会有不同,具体参考flash芯片的规范。

(2)写操作只能对一个原来是空(也就是该地址的内容是全f)的位置操作,如果该位置非空,写操作不起作用,也就是说如果要改写一个原来已经有内容的空间,只能是读出该sector到ram,在ram中改写,然后写整个sector。

由于这些特殊写,所以在flash这样的设备上建立文件也有自己独特的特点,下面我们就以jffs为例进行分析。

二、jffs体系结构介绍

1、存储结构

在jffs中,所有的文件和目录是一样对待的,都是用一个jffs_raw_inode来表示

整个flash上就是由一个一个的rawinode排列组成,一个目录只有一个rawinode,对于文件则是由一个或多个rawinode组成。

2、文件组成

在文件系统mount到flash设备上的时候,会扫描flash,从而根据flash上的所有属于一个文件的rawinode建立一个jffs_file结构以及nodelist。

下面的图显示了一个文件的组成

一个文件是由若干个jffs_node组成,每一个jffs_node是根据flash上得jffs_raw_inode而建立的,jffs_file主要维护两个链表

版本链表:

主要是描述该node创建的早晚,就是说version_head指向的是一个最老的node,也就意味着垃圾回收的时候最该回收的就是这个最老的node。

区域链表:

这个链表主要是为读写文件创建的,version_head指向的node代表的文件数据区域是0~~~n-1之后依次的节点分别是n~~~m-1m~~~~o-1…….其中n

3、操作

对文件的读操作应该是比较简单,但是写操作,包括更改文件名等操作都是引起一个新的jffs_node的诞生,同时要写一个相映的rawinode到flash上,这样的操作有可能导致前面的某个jffs_node上面的数据完全失效,从而导致对应flash上的rawinode的空间成为dirty。

下面举一个例子可能会更清楚一些。

一个文件的rangelist是由上面的三个jffs_node组成,当我们做如下写操作的时候

lseek(fd,10,SEEK_SET);

write(fd,buf,40);

第一个和最后一个node被截短了,第二个node完全被新数据替换,该node会从链表上摘下来,flash上空间变成dirty。

如果做如下写操作的时候

lseek(fd,23,SEEK_SET);

write(fd,buf,5);

此时,第二个node被分裂成两个node,同时产生一个新的node,range链表的元素变成五个。

基于Linux2.6的YAFFS文件系统移植

v1.0,2005-6-6

一、YAFFS文件系统简介

YAFFS,YetAnotherFlashFileSystem,是一种类似于JFFS/JFFS2的专门为Flash设计的嵌入式文件系统。

与JFFS相比,它减少了一些功能,因此速度更快、占用内存更少。

YAFFS和JFFS都提供了写均衡,垃圾收集等底层操作。

它们的不同之处在于:

(1)、JFFS是一种日志文件系统,通过日志机制保证文件系统的稳定性。

YAFFS仅仅借鉴了日志系统的思想,不提供日志机能,所以稳定性不如JAFFS,但是资源占用少。

(2)、JFFS中使用多级链表管理需要回收的脏块,并且使用系统生成伪随机变量决定要回收的块,通过这种方法能提供较好的写均衡,在YAFFS中是从头到尾对块搜索,所以在垃圾收集上JFFS的速度慢,但是能延长NAND的寿命。

(3)、JFFS支持文件压缩,适合存储容量较小的系统;YAFFS不支持压缩,更适合存储容量大的系统。

YAFFS还带有NAND芯片驱动,并为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD和VFS,直接对文件进行操作。

NANDFlash大多采用MTD+YAFFS的模式。

MTD(MemoryTechnologyDevices,内存技术设备)是对Flash操作的接口,提供了一系列的标准函数,将硬件驱动设计和系统程序设计分开。

二、YAFFS文件系统的移植

yaffs代码可以从http:

//www.aleph1.co.uk/armlinux/projects/下载(yaffs代码包括yaffs_ecc

.c,yaffs_fileem.c,yaffs_fs.c,yaffs_guts.c,yaffs_mtdif.c,yaffs_ramem.c。

表一Yaffs文件系统源代码相关文件及功能描述

文件名功 能

yaffs_ecc.cECC校验算法

yaffs_fileem.c测试flash

yaffs_fs.c文件系统接口函数

yaffs_guts.cYaffs文件系统算法

yaffs_mtdif.cNAND函数

yaffs_ramem.cRamdisk实现

1.内核中没有YAFFS,所以需要自己建立YAFFS目录,并把下载的YAFFS代码复制到该目录下面。

#mkdirfs/yaffs

#cp*.c(yaffssourcecode)fs/yaffs

2.修改fs/Kconfig,使得可以配置yaffs:

source"fs/yaffs/Kconfig"

3.修改fs/makefile,添加如下内容:

obj-$(CONFIG_YAFFS_FS)   +=yaffs/

4.在fs目录下生成yaffs目录,并在里面生成一个makefile和Kconfig

Makefile内容为:

yaffs-objs:

=yaffs_fs.oyaffs_guts.oyaffs_mtdif.oyaffs_ecc.o

EXTRA_CFLAGS+=$(YAFFS_CONFIGS)-DCONFIG_KERNEL_2_6

Kconfig内容为:

#

#YAFFSfilesystemconfigurations

#

configYAFFS_FS

tristate"YetAnotherFlashFilingSystem(YAFFS)filesystemsupport"

help

 YAFFS,forYetAnotherFlashFilingSystem,isafilingsystem

 optimisedforNANDFlashchips.

 TocompiletheYAFFSfilesystemsupportasamodule,chooseMhere:

 themodulewillbecalledyaffs.

 Ifunsure,sayN.

 FurtherinformationonYAFFSisavailableat

 

//www.aleph1.co.uk/yaffs/>.

configYAFFS_MTD_ENABLED

bool"NANDmtdsupport"

dependsonYAFFS_FS

help

 ThisaddstheyaffsfilesystemsupportforworkingwithaNANDmtd.

 Ifunsure,sayY.

configYAFFS_RAM_ENABLED

bool"yaffsramfilesystemsupport"

dependsonYAFFS_FS

help

 Thisaddstheyaffsramfilesystemsupport.Nicefortestingonx86,

 butuses2MBofRAM.Don'tenableforNAND-basedtargets.

 Ifunsure,sayN.

comment"WARNING:

mtdand/oryaffsramsupportshouldbeselected"

dependsonYAFFS_FS&&!

YAFFS_MTD_ENABLED&&!

YAFFS_RAM_ENABLED

configYAFFS_USE_OLD_MTD

bool"Oldmtdsupport"

dependsonYAFFS_FS&&0

help

 EnablethistousetheoldMTDstuffthatdidnothaveyaffssupport.

 Youcanusethistogetaroundcompilationproblems,butthebest

 thingtodoistoupgradeyourMTDsupport.Youwillgetbetterspeed.

 Ifunsure,sayN.

configYAFFS_USE_NANDECC

bool"UseECCfunctionsofthegenericMTD-NANDdriver"

dependsonYAFFS_FS

defaulty

help

 ThisenablestheECCfunctionsofthegenericMTD-NANDdriver.

 Thiswillnotworkifyouareusingtheoldmtd.

 NBUseNANDECCdoesnotworkatpresentwithyaffsram.

 Ifunsure,sayY.

configYAFFS_ECC_WRONG_ORDER

bool"UsethesameeccbyteorderasStevenHill'snand_ecc.c"

dependsonYAFFS_FS

help

 Thismakesyaffs_ecc.cusethesameeccbyteorderas

 StevenHill'snand_ecc.c.Ifnotset,thenyougetthe

 sameeccbyteorderasSmartMedia.

 Ifunsure,sayN.

configYAFFS_USE_GENERIC_RW

bool"UseLinuxfilecachinglayer"

defaulty

dependsonYAFFS_FS

help

 Usegeneric_read/generic_writeforreading/writingfiles.This

 enablestheuseoftheLinuxfilecachinglayer.

 Ifyoudisablethis,thencachingisdisabledandfileread/write

 isdirect.

 Ifunsure,sayY.

configYAFFS_USE_HEADER_FILE_SIZE

bool"Useobjectheadersize"

dependsonYAFFS_FS

help

 Whentheflashisscanned,twofilesizesareconstructed:

 *Thesizetakenfromtheobjectheaderforthefile.

 *Thesizefiguredoutbyscanningthedatachunks.

 Ifthisoptionisenabled,thentheobjectheadersizeisused,

 otherwisethescannedsizeisused.

 Ifunsure,sayN.

configYAFFS_DISABLE_CHUNK_ERASED_CHECK

bool"Turnoffdebugchunkerasecheck"

dependsonYAFFS_FS

defaulty

help

 Enablingthisturnsoffthetestthatchunksareerasedinflash

 beforewritingtothem.Thisissafe,sincethewriteverification

 willfail.Suggestenablingthetest(ie.sayN)

 duringdevelopmenttohelpdebugthings.

 Ifunsure,sayY.

#configYAFFS_DISABLE_WRITE_VERIFY

#bool"Disablewriteverify(DANGEROUS)"

#dependsonYAFFS_FS&&EXPERIMENTAL

#help

# Iamseverelyreluctanttoprovidethisconfig.Disablingthe

# verificationisnotagoodthingtodosinceNANDwritescan

# failsilently.Disablingthewriteverificationwillcauseyour

# teethtorot,ratstoeatyourcornandgiveyousplitends.

# Youhavebeenwarned.ie.Don'tuncommentthefollowingline.

#

# Ifunsure,sayN.

#

configYAFFS_SHORT_NAMES_IN_RAM

bool"CacheshortnamesinRAM"

dependsonYAFFS_FS

defaulty

help

 Ifthisconfigisset,thenshortnamesarestoredwiththe

 yaffs_Object.Thiscostsanextra16bytesofRAMperobject,

 butmakeslook-upsfaster.

 Ifunsure,sayY.

5.在/arch/arm/mach-s3c2410/mach-smdk2410.c找到smdk_default_nand_part结构,修改nand分区,如下:

structmtd_partitionsmdk_default_nand_part[]={

  [0]={

     .name ="vivi",

     .size =0x00020000,

     .offset=0x00000000,

  },

  [1]={

     .name ="param",

     .size =0x00010000,

     .offset=0x00020000,

  },

  [2]={

     .name ="kernel",

     .size =0x00100000,

     .offset=0x00030000,

  },

  [3]={

     .name ="root",

     .size =0x01900000,

     .offset=0x00130000,

  },

  [4]={

     .name ="user",

     .size =0x025d0000,

     .offset=0x01a30000,

  }

};

注:

此分区要结合vivi里面的分区来进行设置。

6.配置内核时选中MTD支持:

MemoryTechnologyDevices(MTD)--->

<*>MemoryTechnologyDevice(MTD)support

 MTDpartitioningsupport

 ……

---UserModulesAndTranslationLayers

<*>DirectchardeviceaccesstoMTDdevices

<*>CachingblockdeviceaccesstoMTDdevi

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2