没有合适的资源?快使用搜索试试~ 我知道了~
首页yaffs2文件系统实现原理分析-带书签
资源详情
资源评论
资源推荐
1 概述
YAFFS(Yet Another Flash File System)文件系统是专门针对 NAND flash 设计的嵌入式
文件系统,目前有 YAFFS 和 YAFFS2 两个版本,两个版本的主要区别之一在于 YAFFS2 能
够更好的支持大容量的 NAND flash 芯片。YAFFS 文件系统有些类似于 JFFS/JFFS2 文件系
统,与之不同的是 JFFS/JFFS2 文件系统最初是针对 NOR flash 的应用场合设计的,而 NOR
flash 和 NAND flash 本质上有较大的区别,尽管 JFFS/JFFS2 文件系统也能应用于 NAND
flash,但由于它在内存占用和启动时间方面针对 NOR 的特性做了一些取舍,所以 YAFFS2
对 NAND flash 来说通常才是最优的选择方案。
2 相关概念
分析 YAFFS2 之前,把 NAND flash 相关概念介绍下:NAND flash 由块(block)组成,块
又由页(page)构成,擦除时以块为单位,读写时以页为单位,页又包含数据区和空闲区(OOB,
Out-Of-Band),而 Page 在 YAFFS2 中被称为 Chunk,其中的数据区用来存放实际的数据,
OOB 用来存放附加信息实现 NAND flash 的管理。以 T8000 AXMPFUA 单板使用的 NAND
flash为例,每块 Block: 128 pages,每页 Page: (8K + 448) bytes,数据区为 8K,OOB为 448bytes,
如图 1 所示:
Plane :4096blocks
Block :128 pages
Page :(8K+448)bytes
图 1 NAND flash 物理结构
3 数据结构
struct yaffs_dev 是 YAFFS2 文件系统最核心的数据结构,表示 YAFFS2 文件系统的超级
块,它建立了整个文件系统的层次结构,并衔接 VFS 层和 MTD 层,与 struct super_block、
struct mtd_info 的关系如图 2 所示:
图2 yaffs_dev与super_block、mtd_info层次关系
下面围绕 struct yaffs_dev 这个最核心的数据结构开始,分段介绍它的含义,进而引出其
他重要的数据结构:
■param:存储文件系统重要的一些参数,以及与 MTD 层的接口函数
□inband_tags:标志位,默认为 0,即采用 OOB(out of band)方式存储 tags,
VFS 层
YAFFS2 层
MTD层
s_fs_info
……
struct
super_block
……
driver_context
struct
yaffs_dev
struct
mtd_info
……
…… ……
可以通过挂载时指定 inband-tags 选项改变默认值
□total_bytes_per_chunk:每个 chunk 总的字节数
□chunks_per_block:每个 block 总的 chunk 数
□spare_bytes_per_chunk:每个 chunk 包含 OOB 块的字节数
□start_block:第一个可以使用的 block
□end_block:最后一个可以使用的 block
□n_reserved_blocks:为 GC 保留的 block 阈值
□n_caches:缓冲区的个数,YAFFS2 为减少数据的碎片以及提高性能为每个文
件的写入提供了 cache
□no_tags_ecc:标志位,默认为 0,即 tags 中包括 ECC 纠错信息,可以通过
内核配置改变默认值,CONFIG_YAFFS_DISABLE_TAGS_ECC
□is_yaffs2:标志位,默认为 0,即 YAFFS,在挂载的过程中会根据识别的
mtd->writesize 自动转换成 YAFFS2
□ refresh_period : 刷 新 周 期 , 刷 新 目 的 主 要 找 出 最 旧 的 处 于
YAFFS_BLOCK_STATE_FULL 状态的 block,供 GC 作为 gc_block 使用
□skip_checkpt_rd:标志位,默认为 0,支持读取 checkpoint,提高挂载速度的一
个功能可以通过挂载时指定挂载选项 no-checkpoint-read、no-checkpoint 修改默认
值
□skip_checkpt_wr:标志位,默认为 0,支持写入 checkpoint,提高挂载速度的
一个功能可以通过挂载时指定挂载选项 no-checkpoint-write、no-checkpoint 修改
默认值
□write_chunk_tags_fn:函数指针,在挂载的文件系统的时候会被初始,NAND
flash 写入接口函数:
param->write_chunk_tags_fn = nandmtd2_write_chunk_tags;
□read_chunk_tags_fn:函数指针,在挂载的文件系统的时候会被初始,NAND
flash 读取接口函数:
param->write_chunk_tags_fn = nandmtd2_write_chunk_tags;
□erase_fn:函数指针,在挂载的文件系统的时候会被初始,NAND flash 擦除 block
接口函数:param->erase_fn = nandmtd_erase_block;
□wide_tnodes_disabled:标志位,默认值为 0,采用动态位宽,通过内核配置修
改可采用静态位宽 CONFIG_YAFFS_DISABLE_WIDE_TNODES
■os_context:指向yaffs_linux_context结构指针,该结构存储YAFFS2运行环境,如下:
□context_list:通过该字段加入到yaffs_context_list全局链表中
□dev:指向YAFFS2文件系统超级块的指针
□super:指向VFS层超级块的指针
□bg_thread:YAFFS2后台垃圾回收线程的指针
□bg_running:启动和停止垃圾回收线程的标志位,1:启动,0:停止
□gross_lock:互斥锁,保护整个超级块关键字段的互斥访问,粒度比较大
□spare_buffer:OOB块的缓冲区
□search_contexts:通过该字段把所有Directory Search Context组成链表
□yaffs_mtd_put_super:卸载文件系统时被调用来清理super_block
□readdir_process:解决使用NFS死锁问题加入的
□mount_id:每个NAND flash分区挂载YAFFS2都分配不同的ID号
■driver_context:指向mtd_info结构指针,mtd_info是MTD子系统核心的数据结构,主要是
对底层硬件驱动进行封装,这里不再介绍
■data_bytes_per_chunk:每个chunk总的字节数,和前面提到的total_bytes_per_chunk一样
■chunk_grp_bits :采用静态位宽时超过tnode_width宽度之后的位数,采用动态位宽值恒为
0
■chunk_grp_size:由chunk_grp_bits转化而来的大小
■tnode_width:采用静态位宽默认是16,采用动态位宽是由整个NAND flash中chunk数目计
算得到
■tnode_mask:位宽的mask,主要用于快速获取chunk id号
■tnode_size:YAFFS_NTNODES_LEVEL0节点所占用的内存大小,单位:byte
■chunk_shift:主要用来计算logical chunk index以及logical chunk offset
■chunk_div:作用同chunk_shift,主要用于chunk大小不是2次幂的情况
■chunk_mask:作用同chunk_shift,组合起来计算logical chunk offset
■is_mounted:标志位,文件系统挂载时被置位
剩余17页未读,继续阅读
yueming_
- 粉丝: 0
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- stc12c5a60s2 例程
- Android通过全局变量传递数据
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1