嵌入式Flash文件系统——UFFS

UFFS是一个专门为NAND Flash设计的嵌入式文件系统,她具有一些非常诱人的特性以适合嵌入式应用:

* 超低内存需求: (下表是一些典型配置情况下的内存需求)

NAND flash | Total Blocks | Buffers/Caches | Total RAM cost

    128M   |      8192    |       40/30    |     164K

     32M   |      2048    |       40/30    |      68K

     16M   |      1024    |       10/10    |      26K

关系树结点: 16 * toatl_blocks

页缓存: page_size(512) * buffers (10 ~ pages_per_block)

块信息缓存: (14 * pages_per_block) * block_info_caches ( 5 ~ 20)

总内存需求 = 关系树结点 + 页缓存 + 块信息缓存 + 其它(1~2K)

由于所需内存很少,因此UFFS可以应用在一些对内存使用比较苛刻的场合,例如有些MCU仅有数十KB至一百多KB的内置SRAM, 无需外扩内存即可使用UFFS管理大容量NAND Flash。UFFS内部使用更高效的方法管理树结点和缓冲区内存,在启动时就一次性分配好要使用的内存。一旦分配内存此后便不再改变(上表所列内存即为最大使用内存),这些内存直至卸载UFFS时才全部释放,因此UFFS可以采用静态内存分配,以适应无法提供动态内存分配器的系统(例如有些高可靠系统上禁止使用动态内存分配)。

* 快速启动

不象YAFFS在启动时需要读取所有Spare区,UFFS在启动时每个块仅需读取一至两个Spare即可,因此可以实现快速启动。典型情况下,装载(mount) 128M字节满负荷的UFFS分区仅需要不到1秒。

* 高鲁棒性

UFFS采用日志式更新算法,任意时刻意外断电,UFFS文件系统可保持完整性。意外断电时,仅处于缓冲区内的部分数据丢失,在下次启动时,UFFS会自动回滚到最后一次成功写入的状态。

* 坏块管理,ECC校验和纠错,负载均衡

这些特性对于Flash文件系统来说不算什么新鲜,但是UFFS以一种简单却非常有效的方式实现了他们。

* 无需额外的垃圾回收

因NAND Flash的擦除速度极快,UFFS采用边写入边动态回收“脏”的块的方法,因而无须额外的垃圾回收机制。

* 可支持直接“裸”Flash接口,无须操作系统支持

UFFS支持通过I/O口线连入系统的“裸”Flash接口,只需实现简单的"读/写/擦除"等操作即可,适合在小型RTOS甚至无OS的情况下使用。 

* 支持多分区,多种NAND Flash

UFFS支持多个分区,每个分区以一个虚拟目录的形式mount到根目录下。UFFS支持多种NAND Flash芯片,允许不同的分区使用不同类型的FLASH芯片。 目前UFFS内置支持多数Samsung NAND Flash,包括small page(512)和large page(2048).

* 测试完备

UFFS可以在附带的PC模拟器(用PC上的一个文件模拟Flash芯片)上方便测试。目前已经有超过万台的嵌入式设备使用UFFS作为大容量NAND Flash文件系统。

为何发起UFFS项目?

* 一些嵌入式系统RAM资源有限,但希望在NAND Flash上建立高度可靠的文件系统。

JFFS/JFFS2 消耗太多内存,而且不容易移植到不具备OS的嵌入式系统上。

YAFFS/YAFFS2 是一个非常优秀的可适合NAND Flash的文件系统,但是 依然需要消耗不少内存

* 其他?擅未发现有类似的开源项目....

何处可以获得UFFS ?

目前你可以从 sourceforge.net (http://www.sourceforge.net/projects/uffs)上下载UFFS的所有资源.

一些bug总是在最新的SVN库里面得到最先修正。目前最新的SVN库地址:https://uffs.svn.sourceforge.net/svnroot/uffs/branch/dev-uffs-1.1.1

工作原理

请参考这份文档:

在PC上尝试UFFS

Compile and run UFFS test shell:

  • Linux:

    cd path_to_uffs/

    . ./prepare.sh

    ./configure && make

    ./src/emu/uffs

  • Windows:

    Open the Visual Studio C++ 6.0 project file: path_to_uffs/vcprj/uffs/uffs.dsp

移植到嵌入式系统

  • Modify uffs_os.c for your embedded software environment.
  • Create the flash interface file in which implement all member of "struct uffs_DeviceOpsSt" and create your partition/mount point configuration. (see: src/example/flash-interface-example.c)

新加入一种NAND Flash类型

  • Create Flash class file: uffs_nand_xxxx.c (see: uffs_nand_samsung.c)
  • Add the new flash class to "flash_class_tab" in uffs_class.c
  • Create the low level flash operation interface. (see: src/example/flash-interface-example.c)

如何支持UFFS?

使用UFFS,或者发现并报告bug给我 :-)

有问题?

下一个版本: UFFS2

The main improvement on UFFS2 will be:

*The smaller memory footprint: reduce 25% memory usage as a result.

*One or more files/directories reside on one block, will significantly improve space efficiency for small files.

*Symbol link or other special files.

*ECC data on page area or on spare (page area only for UFFS1)

*Support NandOne and more NAND flash chips ...

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值