没有合适的资源?快使用搜索试试~ 我知道了~
JFFS2源代码情景分析Beta2
5星 · 超过95%的资源 需积分: 9 53 下载量 144 浏览量
2008-09-13
09:43:15
上传
评论
收藏 1.17MB PDF 举报
温馨提示
试读
150页
linuxforum上ID是shrek2的朋友写的,关于JFFS2源代码的分析,算是这类资源中,解释的相对很详细的了。对这方面感兴趣的,这个资料,会对你有很大帮助,尤其是不是很熟悉但想了解的朋友。
资源推荐
资源详情
资源评论
目录
声明
你可以自由地随意修改本文档的任何文字内容及图表,但是如果你在自己的文档中以任何形式直接引用了
本文档的任何原有文字或图表并希望发布你的文档,那么你也得保证让所有得到你的文档的人同时享有你
曾经享有过的权利。
JFFS2 源代码情景分析(Beta2)
作者在
www.linuxforum.net上的ID为shrek2
欢迎补充,欢迎批评指正!
前言(new) ................................................................................................................................................ 4
第 1 章 jffs2 的数据实体及其内核描述符(improved) ................................ 5
数据实体的内核描述符jffs2_raw_node_ref.................................................................................................... 6
文件的内核描述符jffs2_inode_cache.............................................................................................................. 6
jffs2_raw_dirent数据实体及其上层数据结构................................................................................................. 7
jffs2_raw_inode数据实体及其上层数据结构 ............................................................................................... 10
第 2 章 描述jffs2 特性的数据结构(improved) ................................................ 14
文件系统超级块的u域:jffs2_sb_info数据结构 .......................................................................................... 14
文件索引结点的u域:jffs2_inode_info数据结构......................................................................................... 18
打开正规文件后相关数据结构之间的引用关系.......................................................................................... 19
第 3 章 注册文件系统..................................................................................................................... 21
init_jffs2_fs函数.............................................................................................................................................. 21
register_filesystem函数................................................................................................................................... 23
第 4 章 挂载文件系统(improved)................................................................................ 25
jffs2_read_super函数 ...................................................................................................................................... 25
jffs2_do_fill_super函数................................................................................................................................... 27
jffs2_do_mount_fs函数................................................................................................................................... 30
jffs2_build_filesystem函数 ............................................................................................................................. 31
jffs2_scan_medium函数.................................................................................................................................. 34
jffs2_scan_eraseblock函数.............................................................................................................................. 40
jffs2_scan_inode_node函数 ............................................................................................................................ 52
1
目录
jffs2_scan_make_ino_cache函数 .................................................................................................................... 55
jffs2_scan_dirent_node函数............................................................................................................................ 56
full_name_hash函数........................................................................................................................................ 59
jffs2_add_fd_to_list函数................................................................................................................................. 60
jffs2_build_inode_pass1 函数 ......................................................................................................................... 61
第 5 章 打开文件时建立inode的方法.............................................................................. 63
iget和iget4 函数 .............................................................................................................................................. 63
get_new_inode函数......................................................................................................................................... 65
jffs2_read_inode函数 ...................................................................................................................................... 68
jffs2_do_read_inode函数(improved) ......................................................................................................... 73
jffs2_get_inode_nodes函数............................................................................................................................. 78
第 6 章 jffs2 中写正规文件的方法 ..................................................................................... 88
sys_write函数.................................................................................................................................................. 89
generic_file_write函数.................................................................................................................................... 90
jffs2_prepare_write函数.................................................................................................................................. 98
jffs2_commit_write函数................................................................................................................................102
jffs2_write_inode_range函数 ........................................................................................................................ 104
jffs2_write_dnode函数.................................................................................................................................. 107
第 7 章 jffs2 中读正规文件的方法 ....................................................................................111
jffs2_readpage函数.........................................................................................................................................111
jffs2_do_readpage_nolock函数......................................................................................................................111
jffs2_read_inode_range函数 ......................................................................................................................... 112
jffs2_read_dnode函数 ................................................................................................................................... 115
第 8 章 jffs2 中符号链接文件的方法表(new)................................................. 120
jffs2_follow_link函数 ................................................................................................................................... 120
jffs2_getlink函数........................................................................................................................................... 121
第 9 章 jffs2 中目录文件的方法表(new)............................................................. 122
jffs2_create函数 ............................................................................................................................................ 122
jffs2_new_inode函数 .................................................................................................................................... 124
jffs2_do_create函数 ...................................................................................................................................... 126
jffs2_do_new_inode函数............................................................................................................................... 129
第 10 章 jffs2 的Garbage Collection................................................................................. 131
jffs2_start_garbage_collect_thread函数........................................................................................................ 131
jffs2_garbage_collect_thread函数................................................................................................................. 132
jffs2_garbage_collect_pass函数.................................................................................................................... 135
jffs2_erase_pending_trigger函数 .................................................................................................................. 141
第 11 章 讨论和体会......................................................................................................................... 142
2
目录
什么是日志文件系统,为什么要使用jffs2................................................................................................ 142
为什么需要红黑树 ....................................................................................................................................... 142
何时、如何判断数据实体是过时的 ........................................................................................................... 143
后记................................................................................................................................................................... 144
附录 用jffs2map2 模块导出文件的数据实体(new)..................................... 145
观察根目录文件的数据实体 ....................................................................................................................... 145
观察符号链接的信息 ................................................................................................................................... 147
观察正规文件创建后的数据实体 ............................................................................................................... 147
观察jffs2_raw_inode数据实体的大小上限 ................................................................................................. 148
3
前言
前言(new)
第 1 稿后拜读了情景分析中文件系统的相关章节,将 ext2 与 jffs2 相类比,显著地加深了对上层文件系统
相关概念的理解,尤其是 VFS 框架的数据结构的设计思想,比如为了实现良好的可移植性和重用性,上层
VFS 框架代码就必须与具体的应用(底层具体文件系统)无关,而这一点恰恰是通过设计中间层的函数指
针接口实现的。依靠接口实现的封装性是可移植性的基础。还有 VFS 各数据结构的设计目的和设计方法等
等,比如只有尽可能地概括各种不同文件系统的共性才能使 VFS 具有良好的通用性,同时通过各种数据结
构中的 union,让具体文件系统的实现来定义、解释、使用其特有数据结构、描述在具体设备上具体文件
系统的数据组织格式。“union 域反映了各种不同文件系统在上层数据结构上的差异”。
第 2 稿对第 1 稿的改进也主要集中在对 jffs2 相关数据结构的理解和 ext2 与 jffs2 的类比上,这样可以加深
对 jffs2 数据结构的理解。对于已经看过第 1 稿的朋友,再翻翻第 1、2 章就差不多了。另外有兴趣的话也
可以再看看其它新增的章节。
第 1 稿中只涉及了正规文件的访问方法,第 2 稿中补充了符号链接文件和目录文件的相关方法。这些补充
可以验证、加深对各种类型文件在 jffs2 中的实现方法的理解,比如可以通过目录文件的 create 方法看到在
创建正规文件时是如何设置 inode 的 u 域、向父目录文件增加 jffs2_raw_dirent 目录项的(具体操作不止这
些)。由于我目前的兴趣主要集中在内核中那些与具体应用无关的上层框架上面,而不是与具体应用相关
的最底层代码,所以第 1 稿中有关 jffs2 某些实现细节的遗留问题暂时还没有继续研究下去,请大家谅解。
感谢论坛上所有鼓励支持我、尤其是那些向我提出问题的朋友,你们的提问促使我研究得更深入一些。完
成第 1 稿后我就曾打算通过继续阅读 mkfs.jffs2 的源代码、或者编写一个能导出指定的 jffs2 文件系统上所
有数据结点的模块来加深对 jffs2 的理解。在和网友们讨论 jffs2 对 jffs2_raw_inode 数据结点的最大长度限
制时我完成了这个模块,目前它可以导出指定 jffs2 文件系统上指定文件的所有数据结点的信息,这样每次
从根目录开始就可以逐层得到文件系统目录树中任何一个文件的数据结点信息了。
人们对 Linux 的喜爱很大程度上源自于它的可实践性,从而极大地调动研究和使用的积极性。通过这个可
以导出一个文件在 flash 上的物理实体的模块,jffs2 的概念前所未有地清晰、真实,也进一步改正、完善
了对目录文件和 jffs2_raw_dirent 的理解,有兴趣的朋友可以参见附录及附件源代码,或者进一步改进这个
模块。(在第 1 稿中曾错误地认为目录文件是没有 jffs2_raw_inode 数据实体的,很抱歉,而实际情况是除
了根目录外所有目录都由惟一的、用于描述其类型和其它管理信息的 jffs2_raw_inode,与此相关的
jffs2_full_dnode 则由 jffs2_inode_info 的 metadata 域直接指向。)
Let’s DIY Linux!
2006 年 1 月 18 日星期三
4
第 1 章 jffs2的数据实体及其内核描述符
第 1 章 jffs2 的数据实体及其内核描述符(improved)
存储于辅存的任何文件都至少包含三种类型的信息:文件的数据本身、描述文件属性的管理信息、以及描
述文件在文件系统内部的位置信息。文件的位置信息用于实现“从路径名找到文件”的机制。jffs2 在 flash
上只有两种类型的数据实体:jffs2_raw_inode 和 jffs2_raw_dirent,前者包含文件的管理信息,类似于 ext2
中的磁盘索引结点 ext2_inode,后者用于描述文件在文件系统中的位置,类似于 ext2 中的 ext2_dir_entry_2
目录项实体。
与 ext2_inode 可以定位磁盘文件的磁盘块相比,jffs2_raw_inode 没有这种“索引”功能,flash 上文件的数
据是由若干离散的 jffs2_raw_inode 数据结点进行描述的。与 ext2_dir_entry_2 类似,jffs2_raw_dirent 也描述
了文件名及其索引结点编号之间的映射关系,是文件硬链接的物理实体。
在 ext2 中目录文件所占的磁盘块由其 ext2_inode 进行索引,在一个磁盘块内部为描述其下子目录、子文件
的 ext2_dir_entry_2 实体。由于 ext2_dir_entry_2 可指明自身的长度,而且它们在磁盘块内部是连续存放的,
所以并不需要描述其所在目录文件的索引结点号。而 jffs2 中目录文件由一个 jffs2_raw_inode 数据实体和若
干 jffs2_raw_dirent 数据实体组成,由于目录文件的数据实体之间都是离散存放的,所以每个 jffs2_raw_dirent
中还得描述其所属目录文件的索引结点号,参见下文。
正规文件、符号链接文件、SOCKET/FIFO 文件、设备文件都由一个或多个 jffs2_raw_inode 来表示,而紧
随 jffs2_raw_inode 数据结构后的为相关数据块,不同文件所需要的 jffs2_raw_inode 个数及其后数据的内容
如下表所示:
文件类型 所需 jffs2_raw_inode
结点的个数
后继数据的内容
目录文件 1(根目录除外) 无
正规文件 >= 1 文件的数据
符号链接文件 1 被链接的文件名
SOCKET/FIFO 文件 1 无
设备文件 1 设备号
另外,所有文件都至少存在一个 jffs2_raw_dirent 数据实体(具体个数由其硬链接个数决定),它们组成其
父目录文件的内容。区分 jffs2_raw_dirent 和 jffs2_raw_inode 是为了实现硬链接:在 jffs 版本 1 中就只有类
似 jffs2_raw_inode 的一种数据实体,只能实现符号链接。(注:根目录没有父目录了,自然不需要
jffs2_raw_dirent。另外它也没有那个惟一的 jffs2_raw_inode。)
jffs2_raw_dirent 和 jffs2_raw_inode 数据实体都以相同的“头”开始:
struct jffs2_unknown_node
{
/* All start like this */
jint16_t magic;
jint16_t nodetype;
5
剩余149页未读,继续阅读
资源评论
- gz_jason2011-09-23作者是LinuxForum.net的shrek2,非常不错的资料
- dragonsec2014-10-17想熟悉jffs2结构的同学可以关注下,这个很详细,尤其适合新手看,会有很多细节。熟悉后可以自己看代码
crifan
- 粉丝: 141
- 资源: 68
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功