JFFS2
来源:互联网 发布:js 唤醒支付宝app 编辑:程序博客网 时间:2024/06/05 21:07
(1)JFFS2
幻数屏蔽位:0x1985 用来标识 JFFS2 文件系统。
节点类型:JFFS2 自身定义了三种节点类型,但是考虑到文件系统可扩展性和兼容性,JFFS2从 ext2 借鉴了经验,节点类型的最高两位被用来定义节点的兼容属性,具体来说有下面几种兼容属性:
JFFS2_FEATURE_INCOMPAT:当 JFFS2 发现了一个不能识别的节点类型,并且它的兼容属性是 JFFS2_FEATURE_INCOMPAT,那么 JFFS2 必须拒绝挂载(mount)文件系统。
JFFS2_FEATURE_ROCOMPAT:当 JFFS2 发现了一个不能识别的节点类型,并且它的兼容属性是 JFFS2_FEATURE_ROCOMPAT,那么 JFFS2 必须以只读的方式挂载文件系统。
JFFS2_FEATURE_RWCOMPAT_DELETE:当 JFFS2 发现了一个不能识别的节点类型,并且它的兼容属性是 JFFS2_FEATURE_RWCOMPAT_DELETE,那么在垃圾回收的时候,这个节点可以被删除。
JFFS2_FEATURE_RWCOMPAT_COPY:当 JFFS2 发现了一个不能识别的节点类型,并且它的兼容属性是 JFFS2_FEATURE_RWCOMPAT_COPY,那么在垃圾回收的时候,这个节点要被拷贝到新的位置。
节点总长度:包括节点头和数据的长度。
节点头部 CRC 校验:包含节点头部的校验码,为文件系统的可靠性提供了支持。
(2)JFFS2节点,擦写块在内存中的标示和操作
JFFS2 维护了几个链表来管理擦写块,根据擦写块上的内容,一个擦写块会在不同的链表上。具体来说,当一个擦写块上都是合法(valid)的节点时,它会在 clean_list 上;当一个擦写块包含至少一个过时(obsolete)的节点时,它会在 dirty_list 上;当一个擦写块被擦写完毕,并被写入 CLEANMARKER 节点后,它会在 free_list 上。
通常情况下,JFFS2 顺序的在擦写块上写入不同的节点,直到一个擦写块被写满。此时 JFFS2 从 free_list 上取下一个擦写块,继续从擦写块的开头开始写入节点。当 free_list 上擦写块的数量逐渐减少到一个预先设定的阀值的时候,垃圾回收就被触发了,为文件系统清理出更多的可用擦写块。 为了减少对内存的占用,JFFS2 并没有把 i 节点所有的信息都保留在内存中,而只是把那些在请求到来时不能很快获得的信息保留在内存中。具体来说,对于在闪存上的每个 i 节点,在内存里都有一个 struct jffs2_inode_cache 与之对应,这个结构里保存了 i 节点号,指向 i 节点的连接数,以及一个指向属于这个 i 节点的物理节点链表的指针。所有的 struct jffs2_inode_cache 存储在一个哈希表中。闪存上的每个节点在内存中由一个 struct jffs2_raw_node_ref 表示,这个结构里保存了此节点的物理偏移,总长度,以及两个指向 struct jffs2_raw_node_ref 的指针。一个指针指向此节点在物理擦写块上的下一个节点,另一个指针指向属于同一个 i-节点的物理节点链表的下一个节点。
在闪存上的节点的起始偏移都是 4 字节对齐的,所以 struct jffs2_inode_cache 中flash_offset 的最低两位没有被用到。JFFS2 正好利用最低位作为此节点是否过时的标记。
下面举一例来说明 JFFS2 是如何使用这些数据结构的。VFS 调用 iget() 来得到一个 i 节点的信息,当这个 i 节点不在缓存中的时候,VFS 就会调用 JFFS2 的 read_inode() 回调函数来得到 i 节点信息。传给 read_inode() 的参数是 i 节点号,JFFS2 用这个 i 节点号从哈希表中查找相应的 struct jffs2_inode_cache,然后利用属于这个 i 节点的节点链表从闪存上读入节点信息,建立类似于表三的映射信息。,
(3)JFFS2 的挂载过程分为四个阶段:
JFFS2 的挂载过程需要对闪存从头到尾的扫描,这个过程是很慢的,在测试中发现,挂载一个 16M 的闪存有时需要半分钟以上的时间。
1) JFFS2 扫描闪存介质,检查每个节点 CRC 校验码的合法性,同时分配了 struct jffs2_inode_cache 和 struct jffs2_raw_node_ref
2) 扫描每个 i 节点的物理节点链表,标识出过时的物理节点;对每一个合法的 dentry 节点,将相应的 jffs2_inode_cache 中的 nlink 加一。
3 找出 nlink 为 0 的 jffs2_inode_cache,释放相应的节点。
4 释放在扫描过程中使用的临时信息
http://www.ibm.com/developerworks/cn/linux/l-jffs2/
- jffs2
- JFFS2
- jffs2
- mkfs.jffs2
- jffs2 文件系统
- JFFS2资料
- jffs2 cleanmarker
- JFFS2系统
- make jffs2
- jffs2常见问题
- jffs2 文件系统介绍
- 从jffs2读出文件系统
- JFFS2 & MTD mount Question?
- mkfs.jffs2使用方法
- Linux jffs2 使用总结
- mkfs.jffs2参数详解
- Jffs2根文件系统制作
- Jffs2文件系统制作记录!
- CmdletBindingAttribute之HelpURI的作用
- 不错的matlab网站(更新ing)
- 2012年软件开发者薪资调查报告
- 代码清单5-1使用raw_input()得到一个字符串
- MapReduce实现大矩阵乘法
- JFFS2
- 栈实现进制转换
- ActiveMQ - stomp 通过自定义转换器来支持 Map 消息传递
- Topological sorting
- 最全的CSS处理浏览器兼容问题
- 二叉树遍历(递归与迭代)
- oracle 中文乱码
- 无序整数数组中找第k大的数
- 链接ubuntu下的Mysql数据库时报10061错误