一、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代碼可以從http://www.aleph1.co.uk/armlinux/projects/下載(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.
5.在/arch/arm/mach-s3c2410/mach-smdk2410.c找到smdk_default_nand_part結構,修改nand分區,如下:
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,
??????? }
};
注:此分區要結合vivi里面的分區來進行設置。
6.配置內核時選中MTD支持:
Memory Technology Devices (MTD)? --->
?<*> Memory Technology Device (MTD) support
??[*]?? MTD partitioning support
???……
??--- User Modules And Translation Layers
??<*> Direct char device access to MTD devices
??<*> Caching block device access to MTD devices
??……
NAND Flash Device Drivers? --->
?<*> NAND Device Support
?<*> NAND Flash support for S3C2410 SoC
?[*]?? S3C2410 NAND driver debug?
7.配置內核時選中YAFFS支持:
File systems? --->
?Miscellaneous filesystems? --->
??<*> Yet Another Flash Filing System(YAFFS) file system support
??[*]?? NAND mtd support
??[*]?? Use ECC functions of the generic MTD-NAND driver
??[*]?? Use Linux file caching layer
??[*]?? Turn off debug chunk erase check
??[*]?? Cache short names in RAM
8.編譯內核并將內核下載到開發板的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-0x00020000 : "vivi"
0x00020000-0x00030000 : "param"
0x00030000-0x00130000 : "kernel"
0x00130000-0x01a30000 : "root"
0x01a30000-0x04100000 : "user"
2.如果在內核里面添加了proc文件系統的支持那么你在proc里面可以看到有關yaffs的信息
~ # cat proc/filesystems
nodev?? sysfs
nodev?? rootfs
nodev?? bdev
nodev?? proc
nodev?? sockfs
nodev?? pipefs
nodev?? futexfs
nodev?? tmpfs
nodev?? eventpollfs
nodev?? devpts
nodev?? ramfs
??????? vfat
nodev?? devfs
nodev?? nfs
??????? yaffs
nodev?? rpc_pipefs
3.查看dev目錄下相關目錄可以看到:
~ # ls dev/mtd -al
drwxr-xr-x??? 1 root???? root??????????? 0 Jan? 1 00:00 .
drwxr-xr-x??? 1 root???? root??????????? 0 Jan? 1 00:00 ..
crw-rw-rw-??? 1 root???? root????? 90,?? 0 Jan? 1 00:00 0
cr--r--r--??? 1 root???? root????? 90,?? 1 Jan? 1 00:00 0ro
crw-rw-rw-??? 1 root???? root????? 90,?? 2 Jan? 1 00:00 1
cr--r--r--??? 1 root???? root????? 90,?? 3 Jan? 1 00:00 1ro
crw-rw-rw-??? 1 root???? root????? 90,?? 4 Jan? 1 00:00 2
cr--r--r--??? 1 root???? root????? 90,?? 5 Jan? 1 00:00 2ro
crw-rw-rw-??? 1 root???? root????? 90,?? 6 Jan? 1 00:00 3
cr--r--r--??? 1 root???? root????? 90,?? 7 Jan? 1 00:00 3ro
crw-rw-rw-??? 1 root???? root????? 90,?? 8 Jan? 1 00:00 4
cr--r--r--??? 1 root???? root????? 90,?? 9 Jan? 1 00:00 4ro
~ # ls dev/mtdblock/ -al
drwxr-xr-x??? 1 root???? root??????????? 0 Jan? 1 00:00 .
drwxr-xr-x??? 1 root???? root??????????? 0 Jan? 1 00:00 ..
brw-------??? 1 root???? root????? 31,?? 0 Jan? 1 00:00 0
brw-------??? 1 root???? root????? 31,?? 1 Jan? 1 00:00 1
brw-------??? 1 root???? root????? 31,?? 2 Jan? 1 00:00 2
brw-------??? 1 root???? root????? 31,?? 3 Jan? 1 00:00 3
brw-------??? 1 root???? root????? 31,?? 4 Jan? 1 00:00 4
4.mount、umount
建立mount目錄
~ #mkdir /mnt/flash0
~ #mkdir /mnt/flash1
Mountblockdevice設備
~ #mount –t yaffs /dev/mtdblock/3 /mnt/flash0
~ #mount –t yaffs /dev/mtdblock/4 /mnt/flash1
~ #cp 1.txt /mnt/flash0
~ #cp 2.txt /mnt/flash1
查看mount上的目錄,可以看到該目錄下有剛才拷貝的文件,將其umount后,再次mount上來可以發現拷貝的文件仍然存在,這時刪除該文件然后umount,再次mount后,可以發現拷貝的文件已經被刪除,由此可以該分區可以正常讀寫。
5.在flash上建立根文件系統
~ # mount –t yaffs /dev/mtdblock/3 /mnt/flash0
~ #cp (your rootfs) /mnt/flash0
~ #umount /mnt/flash0
重新啟動,改變啟動參數:
param set linux_cmd_line "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0"
重新啟動,開發板就可以從flash啟動根文件系統了。
注:這里你得在內核中添加devfs文件系統的支持,否則內核無法找到/dev/mtdblock/3目錄
?
評論
查看更多