摘要: YAFFS2 介绍 YAFFS(Yet Another Flash File System) 是第一个专门为 NAND Flash 存储器设计的嵌入式文件系统, 适用于大容量的存储设备 YAFFS 是基于日志的文件系统, 提供磨损平衡和掉电恢复的健壮性
YAFFS2 介绍
YAFFS(Yet Another Flash File System) 是第一个专门为 NAND Flash 存储器设计的嵌入式文件系统, 适用于大容量的存储设备 YAFFS 是基于日志的文件系统, 提供磨损平衡和掉电恢复的健壮性它还为大容量的 Flash 芯片做了很好的调整, 针对启动时间和 RAM 的使用做了优化它适用于大容量的存储设备, Yaffs 代码已成功用于许多不同的 32 位和 64 位 CPU, 包括 MIPS,68000,ARM,ColdFire,PowerPC 和 x86, 甚至被用于各种 DSP 架构芯片
目前有 YAFFS 和 YAFFS2 两个版本, YAFFS1 和 YAFFS2 主要差异在于 PAGE 读写 size 的大小, YAFFS2 可支持到 2K Bytes page, 远高于 YAFFS 的 512 Bytes, 因此对大容量 NAND Flash 更具优势 YAFFS2 是目前 NAND Flash 的首选文件系统
YAFFS2 具有如下特点:
使用 C 代码编写, 支持大端和小端处理器, 易于移植
提供 nand flash 坏块处理机制和 ECC 校验算法, 可发现并纠正一定量的位翻转
采用日志式文件系统设计, 异常掉电不会造成文件系统破坏, 掉电后恢复速度快
拥有高度优化和可预测的垃圾收集策略, 具有优异的性能和高度的确定性
比大多数日志式文件系统具有更低的内存占用
支持 POSIX 接口, 易于使用
YAFFS2 移植
1. YAFFS2 源码获取
官方网站: https://yaffs.net/get-yaffs
代码分为如下几部分:
A 核心文件系统代码, 位于 yaffs2 目录下
B 直接接口文件, 位于 yaffs2/direct 目录下
Cflash 驱动程序示例, 以及用于测试的模拟器和配置, 位于 yaffs2/direct/ test-framework 目录下
D 相关测试用例, 位于其他目录下
详见官方文档: https://yaffs.net/documents/yaffs-direct-interface
2. 添加文件
将如下文件拷贝到 AliOS-Things/kernel/modules/fs/yaffs2 目录下, 并编写相应 makefile 或者添加到相应的工程
a) 这些文件在位于源码的 yaffs2 和 yaffs2/direct 目录下
b) yportenv.hyaffs_attribs.c 文件有多个, 前者使用 direct 目录下版本, 后者使用 yaffs2 目录下版本
c) yaffs_alios.cyaffs_install_drv.cyaffs_install_drv.h 这三个文件用于适配 AliOS-Things 和驱动, 见 kernel/modules/fs/yaffs2 目录
3. 代码适配
3.1 增加相应数据和函数定义
a) yportenv.h
增加如下代码:
- #define CONFIG_YAFFS_DIRECT
- #define CONFIG_YAFFS_PROVIDE_DEFS
- #define CONFIG_YAFFSFS_PROVIDE_VALUES
- #define CONFIG_YAFFS_DEFINES_TYPES
- #define inline RHINO_INLINE
- typedef long off_t;
- typedef unsigned long loff_t;
- typedef long dev_t;
- typedef int mode_t;
- b) yaffsfs.c
增加如下代码:
- unsigned int yaffs_trace_mask = 0;
- unsigned int strnlen(const char * s, unsigned int max) {
- register const char * p;
- for (p = s; * p && max--; ++p);
- return (p - s);
- }
- c) yaffs_list.h
增加如下代码:
#define inline RHINO_INLINE
3.2 对接操作系统
与 AliOS-Things 适配的操作系统接口已经实现好, 直接包含 yaffs_alios.c 即可
该文件中实现了 yaffsfs_Lockyaffsfs_Unlockyaffsfs_CurrentTimeyaffsfs_mallocyaffsfs_free 等函数的对接, 另外还创建了一个用于 yaffs 的后台任务
yaffsfs_CheckMemRegion 函数用于检查内存地址是否有效, 需用户自己根据具体硬件补充实现
操作系统接口函数列表如下:
- void yaffsfs_Lock(void);
- void yaffsfs_Unlock(void);
- u32 yaffsfs_CurrentTime(void);
- int yaffsfs_GetLastError(void);
- void yaffsfs_SetError(int err);
- void * yaffsfs_malloc(size_t size);
- void yaffsfs_free(void * ptr);
- void yaffsfs_OSInitialisation(void);
- void yaffs_bug_fn(const char * file_name, int line_no);
- int yaffsfs_CheckMemRegion(const void * addr, size_t size, int write_request);
3.3 对接 nand flash 驱动
yaffs_install_drv.c 用于 yaffs 对接 nand flash 驱动, 用户需根据硬件配置 param 中的参数, 并实现如下驱动函数:
- static int nand_WriteChunk(struct yaffs_dev *dev, int nand_chunk,
- const u8 *data, int data_len,
- const u8 *oob, int oob_len);
- static int nand_ReadChunk(struct yaffs_dev *dev, int nand_chunk,
- u8 *data, int data_len,
- u8 *oob, int oob_len,
- enum yaffs_ecc_result *ecc_result);
- static int nand_EraseBlock(struct yaffs_dev *dev, int block_no);
- static int nand_MarkBad(struct yaffs_dev *dev, int block_no);
- static int nand_CheckBad(struct yaffs_dev *dev, int block_no);
- static int nand_Initialise(struct yaffs_dev *dev);
完成以上步骤即完成 YAFFS2 的移植
来源: http://geek.csdn.net/news/detail/254117