 鲜花( 0)  鸡蛋( 0)
|
从事嵌入式开发的人都知道不同的嵌入式系统文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为 RAM(DRAM, SDRAM)
. e+ {( I; O& o$ o, S" ^7 B5 w
q6 s5 I; Y: U3 M1 o- O6 r和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。2 T5 c4 ]3 R2 t2 B7 [
# G" _. p6 [; {2 x6 W6 L+ e+ q1. 基于FLASH的Linux嵌入式文件系统" V6 }3 d3 }, ?
" C' }/ D) Y yFlash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向
* v% M+ p) G! }& N# y
! G6 y9 T; E$ y) W' y* iFlash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block)为单位进行的。
2 G3 \ o' ]2 \: r/ _5 Y. }
?1 m9 ]- h; Z9 B闪存主要有NOR和NAND两种技术(简单比较见附录)。Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。因此,必须针对Flash的硬件特性设计符合应用要求的文件系统;传统的1 w9 |8 x1 _2 a% k2 i1 e
' ~8 Y9 Q, {5 G
嵌入式系统文件系统如ext2等,用作Flash的文件系统会有诸多弊端。9 S& I6 M# d: M/ d8 D
* b2 e( o3 I& X! I6 Y
在嵌入式Linux 下,MTD(Memory Technology Device,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统一的抽象接口,即Flash的文件系统都是基于MTD驱动层的(参见上面的Linux下的
# i# w6 n; w! R$ u' E( N- a; g! C5 W7 y* \8 k P
文件系统结构图)。使用MTD驱动程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash有更好的支持、管理和基于扇区的擦除、读/写操作接口。顺便一提,一
7 x9 T- @5 w/ o6 h) J& s: o) F I' k/ x' r$ A
块Flash芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash芯片也可以合并为一个分区使用,采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。1 c+ s% H& G) r3 J3 c* g* m
1 X) [1 i2 d5 k. l(1) jffs2" q0 x" ` }0 D7 |
4 D G8 k: ?, N# iJFFS嵌入式系统文件系统最早是由瑞典 Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式
2 t% {! a3 E+ w2 A& W' Z8 W% d4 H- {2 X4 W/ B& n. {$ ?
产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux, uCLinux中。
$ ~' f" l3 a* |0 e- ~9 J( R
( M5 W5 ?+ K7 V. k+ R2 qJffs2: 日志闪存嵌入式系统文件系统版本2 (Journalling Flash FileSystem v2)
! P! s( I1 D3 I
, s$ c: k( W- s, \主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满, y6 i# t" c/ q9 y- i
5 O7 Q, q' C0 M7 Y; D3 Z时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。目前jffs3正在开发中。关于jffs系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt。3 h# I! F4 u0 [3 K9 I
. O$ I: ^$ t1 K% g0 O8 Q3 K
jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另外,jffsx文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志
/ ], {( V5 P3 `/ g' U. \' `
2 _: e% Y; V% f A: N7 P e( Z节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。
7 t8 P$ |3 u" x6 K1 ?& X
! H0 x" p! d; U$ C(2) yaffs:Yet Another Flash File System4 G9 C( A) [$ r k6 ?0 X' \3 e
' g6 k1 P. i8 ryaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还5 T3 ~; |5 G7 }' S
5 i5 h+ E6 I/ Z* l5 M1 v是跨平台的文件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等。
7 y7 |3 L- G, ~5 f. Y
- Y% V! S$ g1 _: z5 C9 l0 x, qyaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。0 S9 j' U. [, w' J2 G
: Q$ U% I& |9 ?6 H( S g( u
yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。
|' r' u j2 O
4 u! @6 n7 v0 `(3) Cramfs:Compressed ROM File System
$ ~+ V7 p7 X3 S8 X' t+ h+ W
7 s2 l; l& A( t- k Q& ^Cramfs是Linux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系
- [% N- N, s3 c; B( }: Q" w6 Z7 X3 |0 q* a ~
统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。
/ v3 m6 [, e: j" R. j" G! M7 D" j. r9 S, v; o: v5 D8 H3 S% F9 U
Cramfs文件系统以压缩方式存储,在运行时解压缩,所以不支持应用程序以XIP方式运行,所有的应用程序要求被拷到RAM里去运行,但这并不代表比Ramfs需求的RAM空间要大一点,因为Cramfs是采用分
, o) `! \$ L0 Z* s8 |/ ?1 C9 w- F( ^: }% A: L$ h8 G% s
页压缩的方式存放档案,在读取档案时,不会一下子就耗用过多的内存空间,只针对目前实际读取的部分分配内存,尚没有读取的部分不分配内存空间,当我们读取的档案不在内存时,Cramfs文件系统& k: d; g- q' L8 E
7 p! x& W+ Z- |4 C3 L' U$ Q
自动计算压缩后的资料所存的位置,再即时解压缩到RAM中。另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。由于以上特性,Cramfs在嵌入式系统中应用% b2 o7 Y1 y2 K) v$ E9 a" d
/ ^+ t5 e/ E& N( H7 u
广泛。但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。Cramfs映像通常是放在Flash中,但是也能放在别的文件系统里,使用loopback 设备可以把它安装别的文件系统里。0 F( k! a% o* D4 ^& {, B
: p9 h: _3 d8 p6 E" {
(4) Romfs- r) f! U; S: l N& L1 a
. q' s8 r' M5 N
传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统,不支持动态擦写保存,按顺序存放数据,因而支持应用程序以 XIP(eXecute In Place,片内运行)方式运行,在系统运行时,节省RAM' J. O# D5 o' r! A6 r3 I" Q2 d0 R
/ ]# I* S5 a/ T) W空间。uClinux系统通常采用Romfs文件系统。其他嵌入式系统文件:fat/fat32也可用于实际嵌入式系统的扩展存储器(例如PDA, Smartphone, 数码相机等的SD卡),这主要是为了更好的与最流行的
' P3 _* \' g0 o/ [) f3 [/ j3 J" ?9 n7 o, D: i- {* u# a; o
Windows桌面操作系统相兼容。ext2也可以作为嵌入式Linux的文件系统,不过将它用于 FLASH闪存会有诸多弊端。6 J% ~1 k# D4 S6 L% b- ]
7 H' m9 w; Q9 P/ G4 Q, @" y
2. 基于RAM的Linux嵌入式文件系统
, z8 T- ~! L( a# ?, X
& \, y/ K+ ]( Q; i(1) Ramdisk9 N5 [4 |+ ]$ G: [& K0 @7 g% t
3 c9 c0 r0 t0 N7 z7 T
Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的嵌入式系统文件,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件
3 c: ?8 N( c: z; i2 r; _0 V
" b% V u& l# N. Z" T6 M* o(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。, {1 ]9 @: v! {9 S* D% F% \
& Z3 r$ Y" e! g' M(2)ramfs/tmpfs( J$ S! N: A7 I7 X$ c' G
4 E3 ]0 u5 k5 z) H& T
Ramfs是Linus Torvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。(实际上,VFS本质上可看成一种内存
$ [7 t _& y6 j @9 i: @! p' F2 _0 D- G
' n. d" A' D# ]& S6 B7 f% N; V文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。)
: A7 H: v3 f1 Y
8 n' B) ~2 {" ~Ramfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对Flash存储器的读写损
. {- l# ?" b* k& Y6 c1 W. b" \& f8 B% r# |' e/ }# g: J
耗,也提高了数据读写速度。Ramfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:不能格式化,嵌入式系统文件大小可随所含文件内容大小变化。Tmpfs的一个缺点是当系统重新引导时会丢失所有数据。
" H! F. l0 r a) D8 j" _3 w& u% }# @
说实在的,嵌入式这块水深的很,我当年从北京达内c++培训出来阴差阳错的进入了嵌入式这个行业,至今为止在这条路上一路坎坷走过。今年达内的老师跟我打电话说让我回去为达内嵌入式学院做讲座
8 n0 \, h/ ?$ z. O1 U,讲完后学员提问了很多问题,这是一个刚刚入门的师弟问我的这个问题,当时回答的不是很详细,回来后整理成此文,希望对学弟学妹们有所帮助。5 b( A/ l' ]5 l3 f
转自:http://www.3gtarena.com/ |
|