UFFS 嵌入式Flash文件系统

专门为嵌入式系统设计的超低内存需求的Flash文件系统 

English Version

最新动态

* 2010-4-5:  UFFS v1.3.2 已经发布

* 2010-2-23: UFFS v1.3.0 已经发布

* 由于Googlepage服务将很快终止,有关UFFS的动态信息和更多介绍通过新建立的博客发布。博客地址为:http://all-about-uffs.blogspot.com

UFFS特性介绍

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

* 超低内存需求: (下表是一些典型配置情况下的内存需求)
  Size | Page Size | Pages per block | Total Blocks | Buffers/Caches | Total RAM
 512MB |    2048   |       32        |      8192    |       33/10    |     200K
 128MB |    512    |       32        |      8192    |       33/10    |     151K
  32MB |    512    |       32        |      2048    |       33/10    |      55K
  16MB |    512    |       32        |      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)

更新:新版本内存消耗有所减少,详细请参考包中的README文件。

由于所需内存很少,因此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的不足

最大文件限制:UFFS以最小擦除单元为文件存储单位,因此一个文件至少占用一个block。也就是说,UFFS文件系统可存储的文件数目受限于NAND flash的block数量。例如,在128MB的含有8192个块的NAND flash上,最多只可创建8192个文件。

为何发起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/uffs-1.2.0

工作原理

请参考这份文档:

在PC上尝试UFFS

Compile and run UFFS test shell:

  • Linux:
    1)首先请确保安装了cmake,在Ubuntu/Debian下可以用apt-get安装cmake:
    sudo apt-get install cmake
    2)解压UFFS源代码到uffs-source目录
    3)与uffs-source并行建立build目录
    4)cd到build目录,然后运行:
      cmake ../uffs-source
      make
      src/utils/mkuffs --help
  • Windows:
    1)确保你的机器上安装有Microsoft Visual Studio 和cmake。可以到这里下载合适的cmake安装包:http://www.cmake.org/cmake/resources/software.html
    2)解压UFFS源代码到uffs-source目录
    3)与uffs-source并行建立build目录
    4)cd到build目录,然后运行:
      cmake ../uffs-source
    5)用Visual Studio打开生成的uffs.dsp文件

    详细请参详:http://all-about-uffs.blogspot.com/2009/04/build-simulatormkuffs-on-windows-with.html

移植到嵌入式系统

  • 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)
    详细请参详:http://all-about-uffs.blogspot.com/2010/02/writing-nand-driver-for-uffs.html

如何支持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.
*Static wear-leveling
*Support NandOne and more NAND flash chips ...



Locations of visitors to this page