您的位置:首页 > 其它

嵌入式设备FLASH及常见文件系统介绍

2011-07-30 12:58 423 查看
Flash memory vs Block device

Flash常用的有NOR Flash和NAND Flash 两种,三星推出的ONE NAND 更先进一些,不过没有机会用到。
1、块设备有两总操作,read和write;而FLASH则有三种操作read、write和erase(擦写)。
2、当Flash处于干净的状态的时候,每一位均为逻辑1。写操作是将指定位设置为0,但是不能将指定位设置为1。将FLASH状态位为0设置为1即擦写。擦写不能以Byte为单位,而是以擦写块(erase block)为单位,常见的如64K Bytes等。
3、块设备的读写均以块(eg:512Byte)为单位,FLASH则有所不同。由于FLASH寻址能够具体到字节,因此读操作可以精确到字节。NOR的写操作可以以Byte为单位,NAND Flash则以页(page)为最小写单位。
4、Flash的寿命由擦写块的最大擦写次数决定。一般NOR Flash的最大擦写次数在10万次左右,NANDFlash的擦写次数在百万次左右。
5、NAND Flash的坏块是一种常态的存在。

FlashTranslation Layer

有一种简洁的方法将块设备的文件系统(ext3,FAT)直接用到Flash memory上。即采用一个FTL(FlashTranslation Layer)将Flash模拟成512K Bytes扇区大小的块设备。将块操作一对一映射到闪存上。
这种方式的缺点是:在进行写操作的时候,需要先将整个擦写块数据读取到内存中,然后在内存中修改部分数据,擦写整个block,回写到FLASH上。因此,操作效率低,没有考虑到磨损平衡,掉电不安全。
FTL的实现有两种方式,一种软件一种硬件。软件即在设备驱动层中实现FTL功能。MTD子系统中的mtdblock设备驱动就是这种实现。因此在嵌入式编程中应尽量避免直接操作/dev/mtdblockX设备文件。如需对flash进行烧写升级可以操作/dev/mtdX设备文件,因为它是FLASH的一种字符设备模拟。当然,如果操作对象是NAND Flash则不能直接操作这两个设备文件,需要使用MTD子系统提供的工具程序来避免坏块的影响。硬件实现的FTL日常生活中非常常见,如常用的U盘,SD卡等设备均是在RAW
Flash之外增加了一个专门做FTL的接口芯片。U盘等设备是一个真正的块设备,这也是可以直接在上面格式化FAT,ext3等文件系统的原因。
避免FTL的缺点的最根本的方法就是实现FLASH专用的文件系统。由于嵌入式设备中FLASH资源有限,这几种文件系统均包含数据压缩功能(话说zImage也是压缩的呢)。根据笔者的工作经验,主要谈一下squash,jffs2并扩展说一下UBIFS。

常见flash专用文件系统
Squash是一种只读的文件系统,也因为只读,其压缩率达到了惊人的60%,同时其读速度也是非常高的。因此,在嵌入式设备中采用squash 作为rootfs是非常合适的,将文件系统中稳定的,不涉及到升级操作的部分做到squash中一方面能为应用程序、配置文件和log等提供更大的可用空间,另一方面由于其只读特性可以保证系统能够正确的启动。
Jffs2号称是FLASH上最适合的文件系统,也是NORFlash使用最多的文件系统。它通过outof place的方法来达到flash的平均磨损。不过有三个缺点:
1、挂载时间过长。因为mount时需要扫描整个FLASH。来自IBM开发网站的一份资料显示挂载一个16M的flash需要半分钟的时间。我用的2.6.28的kernel提供的MTD子系统的挂载时间约在5s以内,应该是已经将erase block summary patch加入。
2、磨损平衡的随意性。这个没有研究过。
3、很差的扩展性。JFFS2 中有两个地方的处理是O(N) 的,这使得它的扩展性很差。它的文件系统索引是在内存中生成的,因此随着文件的增多,flash的增大会增大内存占用。
UBIFS是一种新型的文件系统,可以在MTD官网上查看它的详细资料。它在FLASH上建立索引,因此扩展性更高,支持大到几个G Bytes的FLASH,同时它的速度也更快,尤其在数据完整性、数据恢复能力上都从建立索引的思想中受益。
不过,在笔者看来,UBIFS的用武之地不在嵌入式领域,而是类似于固态硬盘等需要大容量(128M+)的FLASH的领域。在当前看来,嵌入式设备的FLASH 文件系统以squash+jffs2/yaffs2最为合适,也是当下最流行的使用组合。

2011-07-30 徐敏行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: