一、YAFFS文件系统简介
YAFFS,Yet Another Flash File System,是一种类似于JFFS/JFFS2的专门为Flash设计的嵌入式文件系统。与JFFS相比,它减少了一些功能,因此速度更快、占用内存更少。
YAFFS和JFFS都提供了写均衡,垃圾收集等底层操作。它们的不同之处在于:
(1)、JFFS是一种日志文件系统,通过日志机制保证文件系统的稳定性。YAFFS仅仅借鉴了日志系统的思想,不提供日志机能,所以稳定性不如JAFFS,但是资源占用少。
(2)、JFFS中使用多级链表管理需要回收的脏块,并且使用系统生成伪随机变量决定要回收的块,通过这种方法能提供较好的写均衡,在YAFFS中是从头到尾对块搜索,所以在垃圾收集上JFFS的速度慢,但是能延长NAND的寿命。
(3)、JFFS支持文件压缩,适合存储容量较小的系统;YAFFS不支持压缩,更适合存储容量大的系统。
YAFFS还带有NAND芯片驱动,并为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD和VFS,直接对文件进行操作。NAND Flash大多采用MTD+YAFFS的模式。MTD( Memory Technology Devices,内存技术设备)是对Flash操作的接口,提供了一系列的标准函数,将硬件驱动设计和系统程序设计分开。
二、YAFFS文件系统的移植
yaffs代码可以从下载(yaffs代码包括yaffs_ecc
.c,yaffs_fileem.c,yaffs_fs.c,yaffs_guts.c,yaffs_mtdif.c,yaffs_ramem.c。)
表一 Yaffs文件系统源代码相关文件及功能描述
文件名 功 能
yaffs_ecc.c ECC校验算法
yaffs_fileem.c 测试flash
yaffs_fs.c 文件系统接口函数
yaffs_guts.c Yaffs文件系统算法
yaffs_mtdif.c NAND函数
yaffs_ramem.c Ramdisk实现
1.内核中没有YAFFS,所以需要自己建立YAFFS目录,并把下载的YAFFS代码复制到该目录下面。
#mkdir fs/yaffs
#cp *.c(yaffs source code) fs/yaffs
2.修改fs/Kconfig,使得可以配置yaffs :
source "fs/yaffs/Kconfig"
3.修改fs/makefile,添加如下内容:
obj-$(CONFIG_YAFFS_FS) += yaffs/
4.在fs目录下生成yaffs目录,并在里面生成一个makefile 和Kconfig
Makefile 内容为:
yaffs-objs := yaffs_fs.o yaffs_guts.o yaffs_mtdif.o yaffs_ecc.o
EXTRA_CFLAGS += $(YAFFS_CONFIGS) -DCONFIG_KERNEL_2_6
Kconfig内容为:
#
# YAFFS file system configurations
#
config YAFFS_FS
tristate "Yet Another Flash Filing System(YAFFS) file system support"
help
YAFFS, for Yet Another Flash Filing System, is a filing system
optimised for NAND Flash chips.
To compile the YAFFS file system support as a module, choose M here:
the module will be called yaffs.
If unsure, say N.
Further information on YAFFS is available at
<>.
config YAFFS_MTD_ENABLED
bool "NAND mtd support"
depends on YAFFS_FS
help
This adds the yaffs file system support for working with a NAND mtd.
If unsure, say Y.
config YAFFS_RAM_ENABLED
bool "yaffsram file system support"
depends on YAFFS_FS
help
This adds the yaffsram file system support. Nice for testing on x86,
but uses 2MB of RAM. Don't enable for NAND-based targets.
If unsure, say N.
comment "WARNING: mtd and/or yaffsram support should be selected"
depends on YAFFS_FS && !YAFFS_MTD_ENABLED && !YAFFS_RAM_ENABLED
config YAFFS_USE_OLD_MTD
bool "Old mtd support"
depends on YAFFS_FS && 0
help
Enable this to use the old MTD stuff that did not have yaffs support.
You can use this to get around compilation problems, but the best
thing to do is to upgrade your MTD support. You will get better speed.
If unsure, say N.
config YAFFS_USE_NANDECC
bool "Use ECC functions of the generic MTD-NAND driver"
depends on YAFFS_FS
default y
help
This enables the ECC functions of the generic MTD-NAND driver.
This will not work if you are using the old mtd.
NB Use NAND ECC does not work at present with yaffsram.
If unsure, say Y.
config YAFFS_ECC_WRONG_ORDER
bool "Use the same ecc byte order as Steven Hill's nand_ecc.c"
depends on YAFFS_FS
help
This makes yaffs_ecc.c use the same ecc byte order as
Steven Hill's nand_ecc.c. If not set, then you get the
same ecc byte order as SmartMedia.
If unsure, say N.
config YAFFS_USE_GENERIC_RW
bool "Use Linux file caching layer"
default y
depends on YAFFS_FS
help
Use generic_read/generic_write for reading/writing files. This
enables the use of the Linux file caching layer.
If you disable this, then caching is disabled and file read/write
is direct.
If unsure, say Y.
config YAFFS_USE_HEADER_FILE_SIZE
bool "Use object header size"
depends on YAFFS_FS
help
When the flash is scanned, two file sizes are constructed:
* The size taken from the object header for the file.
* The size figured out by scanning the data chunks.
If this option is enabled, then the object header size is used,
otherwise the scanned size is used.
If unsure, say N.
config YAFFS_DISABLE_CHUNK_ERASED_CHECK
bool "Turn off debug chunk erase check"
depends on YAFFS_FS
default y
help
Enabling this turns off the test that chunks are erased in flash
before writing to them. This is safe, since the write verification
will fail. Suggest enabling the test (ie. say N)
during development to help debug things.
If unsure, say Y.
#config YAFFS_DISABLE_WRITE_VERIFY
# bool "Disable write verify (DANGEROUS)"
# depends on YAFFS_FS && EXPERIMENTAL
# help
# I am severely reluctant to provide this config. Disabling the
# verification is not a good thing to do since NAND writes can
# fail silently. Disabling the write verification will cause your
# teeth to rot, rats to eat your corn and give you split ends.
# You have been warned. ie. Don't uncomment the following line.
#
# If unsure, say N.
#
config YAFFS_SHORT_NAMES_IN_RAM
bool "Cache short names in RAM"
depends on YAFFS_FS
default y
help
If this config is set, then short names are stored with the
yaffs_Object. This costs an extra 16 bytes of RAM per object,
but makes look-ups faster.
If unsure, say Y.