已满,则顺序寻找下一个空闲块。
YAFFS垃圾收集机制 YAFFS使用一种多策略混合的算法来进行垃圾回收,将贪心策略和随机选择策略按一定比例混合使用:当满足特定的小概率条件时,垃圾回收器会试图随机选择一个可回收的页面;而在其他情况下,则使用贪心策略回收最“脏”的块。通过使用多策略混合的方法,YAFFS能够有效地改善贪心策略造成的不平均;通过不同的混合比例,则可以控制损耗平均和系统开销之间的平衡。考虑到NAND的擦除很快(和NOR相比可忽略不计),YAFFS将垃圾收集的检查放在写入新页面时进行,而不是采用JFFS那样的后台线程方式,从而简化了设计。
YAFFS的实现开发环境简介
本文采用的是宿主机+目标板的开发模式。宿主机为PC+REDHAT9.0,目标板为三星公司的S3C2410+嵌入式Linux,版本为2.6.11.12。NAND闪存是三星公司64MB的K9F5608U0C。YAFFS的源码可以从网站下载。
&n
bsp; YAFFS移植
1)在内核中建立YAFFS目录fs/yaffs,并把下载的YAFFS代码复制到该目录下面。
2)修改fs/Kconfig,使得可以配置YAFFS。
3)修改fs/makefile,添加如下内容:
obj-$(CONFIG_YAFFS_FS) += yaffs/
4)在生成的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文件中主要是配置一些宏,在MTD上面挂接YAFFS,以及一些辅助配置。配置如下:
config YAFFS_FS,N
config YAFFS_MTD_ ENABLED,Y
config YAFFS_RAM_ ENABLED,N
config YAFFS_USE_OLD_ MTD,N
config YAFFS_USE_ NANDECC,Y
config YAFFS_ECC_WRONG_ ORDER,N
config YAFFS_USE_ GENERIC_RW,Y
config YAFFS_USE_HEADER_ FILE_SIZE,N
config YAFFS_DISABLE_ CHUNK_ERASED_CHECK, Y
config YAFFS_DISABLE_ WRITE_VERIFY, N
config YAFFS_SHORT_ NAMES_IN_RAM, Y
5)修改NAND分区。此分区要结合vivi里的分区进行设置,如下:
struct mtd_partition smdk_default_nand_part[] = {
[0] = {.name = "vivi",.size = 0x00020000.offset = 0x00000000,},
[1] = {.name = "param",.size = 0x00010000,.offset = 0x00020000,},
[2] = {.name = "kernel",.size = 0x00100000,.offset = 0x00030000,},
[3] = {.name = "root",.size = 0x01900000,.offset = 0x00130000,},
[4] = {.name = "user",.size = 0x025d0000,.offset = 0x01a30000,}
};
6)配置内核时选中MTD支持和YAFFS支持。
7)编译内核并将内核下载到开发板的Flash中。
YAFFS文件系统测试1)内核启动之后,启动信息中应该含有如下内容:
NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3.3V 8-bit)
Scanning device for bad blocks
Creating 5 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x00000000-0x000