Linux下的FLASH文件系统

From: Mic (mic.lupaworld.com)

内容目录

Linux下的FLASH文件系统 1


FLASH 2

JFFS & JFFS2 3

YAFFS1 & YAFFS2 4



前言
    Nand
存储设备在嵌入式设备中使用比较普遍.通常我们使用的手机,PDA,GPS,忧盘等等设备中都用到了.随着技术的发展,Nand存储芯片的容量也在越来越大,其功耗,寿命等性能参数也在提升.
    
熟悉linux嵌入式开发的人肯定很熟悉这几个名词: JFFS,JFFS2,YAFFS,YAFFS2,CRAMFS. 这些都是专门为NAND设计的文件系统--除了CRAMFS. CRAMFS其实只是一种文件的打包方式我们常常把rootfs打包成cramfs的格式(mkcramfs),然后将这个打包好的image文件烧写在nand.
    
本文将介绍下各个文件系统的优缺点,最后将介绍UBI-Unsorted BLOCK Images,一个新的文件系统,专门为NAND设计.



FLASH


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

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


下表仅供参考

NOR-NAND comparison

参数

NOR

NAND

容量

1 to 16 Mbytes

8 to 128 Mbytes

XIP (code execution)

Yes

No

性能 Erase
                       Write
                       Read

Very Slow (5 s)
Slow
Fast

Fast (3 ms)
Fast
Fast

Strengths

Addressable to every byte

More than 10% higher life expectancy

可擦写次数

10,000 to 100,000

100,000 to1,000,000

接口

SRAM-like, memory mapped

Accessed in bursts of 512 bytes; I/O mapped

访问方式

Random

Sequential

价格

High

Very low



那么针对FLASH设备的特性适合它的文件系统需要解决的问题有:

  1. 必需保证使用寿命

既然块的擦写会损耗该块,那么我们需要平均一块FLASH芯片上的块擦写次数,英文里叫”wear leveling”

  1. 必需保证可靠性

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

  1. 能够对坏块进行处理

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

JFFS & JFFS2 &JFFS3


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

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

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

JFFS2JFFS1作了些改进,比如所需的内存变少了,垃圾回收机制也优化了.

针对JFFS1,JFFS2的缺点,JFFS3出现了.

YAFFS1 & YAFFS2

Yet Another Flash File System”作者是新西兰的Charles Manning为一家名叫Alpha one 的公司(http://www.aleph1.co.uk/)设计的,是第一个为NAND Flash设计的文件系统.共两个版本YAFFS1 YAFFS2.

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

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

还有个突出的优点是它在mount的时候需要很少的内存.(如果是小页—512byte/page,1MByte NAND大约需要4KBytes内存;大页需要大概1KBytes RAM/1MByte NAND)

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

http://www.yaffs.net/yaffs-internals
http://www.yaffs.net/yaffs-direct-user-guide
   

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."

你可能感兴趣的:(Linux下的FLASH文件系统)