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其是EEPROM的一种,分为Nor Flash和NAND 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 |
Very Slow (5 s) |
Fast (3 ms) |
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设备的特性, 适合它的文件系统需要解决的问题有:
必需保证使用寿命
既然块的擦写会损耗该块,那么我们需要平均一块FLASH芯片上的块擦写次数,英文里叫”wear leveling”
必需保证可靠性
嵌入式系统的电源供应是个大问题,所以使用者常常会遇到电池耗尽的问题. 所以突然断电是可能出现的. 那么这个时候文件系统需要保证数据的稳定性.
能够对坏块进行处理
经过一段时间的使用FLASH中肯定会产生坏块,那么对坏块的处理也是必需的.
JFFS是由瑞典的Axis Communications Ab公司开发的(1999,以GNU发布),针对flash设备的特性为嵌入式设备开发的.(我边上的兄弟曾想去那里作毕业设计)
JFFS 1和JFFS2的设计中都考虑到了FLASH的特性特别是满足了上述3个条件,包括了垃圾回收,坏块管理等功能. 这两种文件系统属于LFS(Log-structured File System).这种文件系统的特点是一旦数据出错,容易恢复,但是系统运行是需要占用一定的内存空间,这些空间就是用来存储”log”的.
JFFS的缺点就是加载时间太长,因为每次加载都需要将FLASH上的所有节点(JFFS的存储单位)到内存,这样也占用了可观的内存空间.除此之外,”circle log”设计使得在对文件数据进行所有的数据都会被重写,这样造成不必要的时间,同时也会减少FLASH的寿命.
JFFS2对JFFS1作了些改进,比如所需的内存变少了,垃圾回收机制也优化了.
针对JFFS1,JFFS2的缺点,JFFS3出现了.
“Yet Another Flash File System”作者是新西兰的Charles Manning为一家名叫Alpha one 的公司(http://www.aleph1.co.uk/)设计的,是第一个为NAND Flash设计的文件系统.共两个版本YAFFS1 和YAFFS2.
YAFFS1支持512Bytes/Page的NAND Flash;后者YAFFS2支持2kBytes/Page的NAND Flash. YAFFS文件系统也属于LFS.
跟其他文件系统比较,它具有更好的可移植性,甚至可以使用在没有操作系统的设备上(called “YAFFS/Direct”). YAFFS采用模块化设计,虽然最初是用在linux系统上的,但是也已经移植到其他系统比如wince.
还有个突出的优点是它在mount的时候需要很少的内存.(如果是小页—512byte/page,每1MByte NAND大约需要4KBytes内存;大页需要大概1KBytes RAM/1MByte NAND)
JFFS与YAFFS比较,两者各有长处. 一般来说,对于小于64MBytes的NAND 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."