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
工作原理
请参考这份文档:
- Understanding UFFS ( PDF format )
在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给我 :-)
- Bug reports please to: http://www.sourceforge.net/projects/uffs
- Talk to me directly on MSN: superzgz@hotmail.com
有问题?
- Google group: http://groups.google.com/group/uffs
下一个版本: 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 ...