Mic 的技术点滴:关于linux, wince 6.0...还有其他牢骚 mic's another world http://www.ootroo.com/zblog

嵌入式Linux下的Nand文件系统

上一篇 / 下一篇  2007-10-11 04:37:55 / 个人分类:linux

Linux下的FLASH文件系统

Mic (mic.lupaworld.com)

z P _.Tj4Q0


+ZL4lbj'F]0
4[9grzVzsO7V0

*j'B&sQ(Wa0

内容目录LUPA开源社区)S1g3Aq4K2Tqy4Q

Linux下的FLASH文件系统 1LUPA开源社区 yp N"`8Np K3N9V1\


Z"V2U6}TqY-_+bz0FLASH 2
LUPA开源社区'k.?pC b`@7y

JFFS & JFFS2 3

L!Vs+japc0

YAFFS1 & YAFFS2 4LUPA开源社区s{ A8_7`rP(Z

LUPA开源社区5f1NEL"O/?
LUPA开源社区V,Fs8? \c
LUPA开源社区LKKCk8y

@5cmd va0前言LUPA开源社区.|C6JG)yO @${Z
    Nand
存储设备在嵌入式设备中使用比较普遍.通常我们使用的手机,PDA,GPS,忧盘等等设备中都用到了.随着技术的发展,Nand存储芯片的容量也在越来越大,其功耗,寿命等性能参数也在提升.
1Vu S7~dG0X[8i:G;m m0   
熟悉linux嵌入式开发的人肯定很熟悉这几个名词: JFFS,JFFS2,YAFFS,YAFFS2,CRAMFS. 这些都是专门为NAND设计的文件系统--除了CRAMFS. CRAMFS其实只是一种文件的打包方式. 我们常常把rootfs打包成cramfs的格式(mkcramfs),然后将这个打包好的image文件烧写在nand.LUPA开源社区 COB,Du3`Noj
   
本文将介绍下各个文件系统的优缺点,最后将介绍UBI-Unsorted BLOCK Images,一个新的文件系统,专门为NAND设计.
9s C9bsN Ta0
LUPA开源社区9t3Zj&@1ec
LUPA开源社区}.O(wK{L2B"lQ

7J4s8N/{8o B&JX#v0

LUPA开源社区jv3Zii0dU%S%~
FLASH

LUPA开源社区^*Xe{&?}#PN_
    Flash
存储设备有高稳定性,可靠性,以及高存储密度,低成本的优点,所以被广泛得应用在嵌入式设备中.Flash其是EEPROM的一种,分为Nor FlashNAND flash. Nor Flash先出现,它可以直接访问(传统的接口方式,有地址和数据总线分开),主要用在存储少量的程序代码;Nand后出现,其接口方式和Nor不同,它是通过一种命令接口访问的,主要用在存储大量的数据,而且价格更便宜,所以很多系统把代码也存储在Nand,系统起来之后把这些代码数据拷贝到内存中运行.举例samsung s3c24xx系列应用处理器都具备上电之后自动从NAND中将NAND中的程序数据拷贝到RAM中的功能.

m%vH%`qt3{9p6x0

FLASH中数据成块存储.这些块中的数据都不能单独修改,也就是说写操作是成块进行的. 比如,我们想修改某一个字节,必需先读取该字节所在块的内容,然后修改该字节,再擦除改块,然后写入修改过的块内容. 有一个问题值得注意,块的会随着擦写损耗,最终沦为坏块.LUPA开源社区 p8S2\:m'Ml
NOR FLASH
的存储容量一般从64KBytes 16MBytes(参考了网络上的数据);NAND 更大,而且技术不断提升,已经出现了G级的NANDFLASH,似乎有代替硬盘的趋势.

xTZZ-acP`0

M#C qQiF|L0LUPA开源社区:Z9K6E%u7O*Wk+_
下表仅供参考LUPA开源社区l$uGU.i!Uj|6O

v%L$KxzJ0NOR-NAND comparison LUPA开源社区 H!R)s-F&_8k

参数

IA3Y[C{0

NORLUPA开源社区E$ni6r3t2ko

NAND

v+Rfy8F0
LUPA开源社区lu~+jg~[Pt~

容量LUPA开源社区 T so,E|0qdBT;s

LUPA开源社区(\)z)H5lh/t

1 to 16 Mbytes

0sY(h ai0
LUPA开源社区|9f6u6j|8oO

8 to 128 MbytesLUPA开源社区$W hbSs kAJ

P~J7K*sz?xT6l3F0XIP (code execution)LUPA开源社区!SAe INi

suI c+r5\0YesLUPA开源社区n0B ?GWs

LUPA开源社区[g;FE!T^7d%GX{Bn

NoLUPA开源社区6B;N/B!X@j#R

LUPA开源社区f;iam3]

性能 Erase
7k6T6aZc3UHE@0                       Write
}K F1dF*o)zlq0                       Read

%dwiKn@\Yy0

t4q&kd&xA7` Wk0Very Slow (5 s)
DJ'W(`9H0SlowLUPA开源社区'g.V.V ^!Sno
Fast

0? c6W7DxP0
LUPA开源社区n0J y`1f#P\4y

Fast (3 ms)
;T`#vd\k.d:U"q&M0Fast
([l ~Jx N$D0Fast

:e_q @g9]q!O5D!@0s0

)V|H F]3kft"t0StrengthsLUPA开源社区7^pxL;_&Fe6Q"C

6`J:~"kvX]/b0Addressable to every byte

G)L4Y(r9pp0

\p w3k,x cGL5M0More than 10% higher life expectancy

5U)J/XX7\0
LUPA开源社区a,]&Y\ ?i+D

可擦写次数

4[y#{Fc:k0
LUPA开源社区+YkZ9dcG

10,000 to 100,000

:R$BU$mQ ~0

x#K)E#eH6A%O][n/M0100,000 to1,000,000LUPA开源社区3Ep T%K1M;\*ZP

E2aN&y|s!HpZ0接口LUPA开源社区%o3]3r$y6wLh

8?6by8|Z^(o'_Vy0SRAM-like, memory mappedLUPA开源社区I|0a A q7}

:g m_-Zf8L;c6g0Accessed in bursts of 512 bytes; I/O mappedLUPA开源社区)l8v;F \ kc

^ T[]3R4@mA mo0访问方式

}$h| suZ0

w PA;_)kP]O}&I0Random

].Af;@0VghjlN0

q7O;?] D5P`m/mC0SequentialLUPA开源社区7d2n)?p#Y#w Bd

9t9h:brm0价格LUPA开源社区@ e D?X}-^2_JuH

\$Td#F/Lxo?3G0HighLUPA开源社区/h G0s-`2|GK,Z

C(ma/D%BGY.^0Very lowLUPA开源社区n(H2D4n2O,fE&q(d

LUPA开源社区*Z} kHq%q T

7Tqm8l?w0

0` `)V4WZ v2@Oo3V0

那么针对FLASH设备的特性, 适合它的文件系统需要解决的问题有:LUPA开源社区!pj'}4xE ? d9fM

  1. 必需保证使用寿命LUPA开源社区8cm{5lM ^

既然块的擦写会损耗该块,那么我们需要平均一块FLASH芯片上的块擦写次数,英文里叫”wear leveling”LUPA开源社区2k$j7u/N't_GX

  1. 必需保证可靠性

    a2B(]"k9Wa h0

嵌入式系统的电源供应是个大问题,所以使用者常常会遇到电池耗尽的问题. 所以突然断电是可能出现的. 那么这个时候文件系统需要保证数据的稳定性.LUPA开源社区+^0z(A+Yxyt,R

  1. 能够对坏块进行处理LUPA开源社区#V:\M6].Y"znNw

经过一段时间的使用FLASH中肯定会产生坏块,那么对坏块的处理也是必需的.

-]o$z+}h*Gn'`0

JFFS & JFFS2 &JFFS3

|)Smfh7gw/wT1IC0
)]N}!jQ0    JFFS
是由瑞典的Axis Communications Ab公司开发的(1999,GNU发布),针对flash设备的特性为嵌入式设备开发的.(我边上的兄弟曾想去那里作毕业设计)

@zue Az)X U;J0

JFFS 1JFFS2的设计中都考虑到了FLASH的特性特别是满足了上述3个条件,包括了垃圾回收,坏块管理等功能. 这两种文件系统属于LFS(Log-structured File System).这种文件系统的特点是一旦数据出错,容易恢复,但是系统运行是需要占用一定的内存空间,这些空间就是用来存储”log”.LUPA开源社区DV m7TFOj

JFFS的缺点就是加载时间太长,因为每次加载都需要将FLASH上的所有节点(JFFS的存储单位)到内存,这样也占用了可观的内存空间.除此之外,”circle log”设计使得在对文件数据进行所有的数据都会被重写,这样造成不必要的时间,同时也会减少FLASH的寿命.

:]\3H2Xzl7TO(]]S0

JFFS2JFFS1作了些改进,比如所需的内存变少了,垃圾回收机制也优化了.LUPA开源社区6?}js3E \8z`(_ c

针对JFFS1,JFFS2的缺点,JFFS3出现了. LUPA开源社区w9R:gs3@C\

YAFFS1 & YAFFS2

Yet Another Flash File System”作者是新西兰的Charles Manning为一家名叫Alpha one 的公司(http://www.aleph1.co.uk/)设计的,是第一个为NAND Flash设计的文件系统.共两个版本YAFFS1 YAFFS2.LUPA开源社区'_&b-E6^#Eyg7V

YAFFS1支持512Bytes/PageNAND Flash;后者YAFFS2支持2kBytes/PageNAND Flash. YAFFS文件系统也属于LFS.

SWXIa.a iv0

跟其他文件系统比较,它具有更好的可移植性,甚至可以使用在没有操作系统的设备上(called “YAFFS/Direct”). YAFFS采用模块化设计,虽然最初是用在linux系统上的,但是也已经移植到其他系统比如wince.

%T?ix2C0

还有个突出的优点是它在mount的时候需要很少的内存.(如果是小页—512byte/page,1MByte NAND大约需要4KBytes内存;大页需要大概1KBytes RAM/1MByte NAND)LUPA开源社区 e0A1}B P"W

JFFSYAFFS比较,两者各有长处. 一般来说,对于小于64MBytesNAND Flash,可以选用JFFS;如果超过64MBytes,YAFFS比较合适.

8`&[+F-K/I \0

http://www.yaffs.net/yaffs-internalsLUPA开源社区 z1OH9wmt]TZ ^wn&_
http://www.yaffs.net/yaffs-direct-user-guide
(`*sZ#o,{"r-j2l0   

&c a1N3L{(j-a ~0

UBI & UBIFSAndrew Morton acknowledged, "this is precisely the problem which needs to be solved for delayed allocation on ext2/3/4. This is because it is infeasible to work out how much disk space an ext2 pagecache page will take to write out (it will require zero to three indirect blocks as well)." He added, "I expect that a similar thing was done in the ext4 delayed allocation patches - you should take a look at that and see what can be shared/generalised/etc." Digging into the ext4 code deeper, Andrew added, "common ideas need to be found and implemented in the VFS. The ext4 patches do it all in the fs which is just wrong. The tracking of reservations (or worst-case utilisation) is surely common across these two implementations? Quite possibly the ENOSPC-time forced writeback is too."LUPA开源社区i V.]1\2E0M


|9_4I9u&D#^N6k:A5Y0LUPA开源社区C{j"~(]~0`(m

"j{TX H k0

LUPA开源社区,n!x*T)Q^]&e-]
LUPA开源社区6f"G Z N/`7[

LFS(Log-structured File System)LUPA开源社区%|&uV` a)ivUL [

详见htLUPA开源社区1l \,_3A#y#\ h9AaT

LUPA开源社区 F-zD ]a7d.d:d
LUPA开源社区 r"\[#~cI

I3fSp&J l;C0


v#p5h9[ T A.h'r@0LUPA开源社区$DB"\A$O+|
LUPA开源社区pCZ!n$iRK6V


TAG: Linux linux

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar