没有合适的资源?快使用搜索试试~ 我知道了~
首页jffs2源代码情景分析
资源详情
资源评论
资源推荐
目录
声明
你可以自由地随意修改本文档的任何文字内容及图表,但是如果你在自己的文档中以任何形式直接引用
了本文档的任何原有文字或图表并希望发布你的文档,那么你也得保证让所有得到你的文档的人同时享
有你曾经享有过的权利。
JFFS2 源代码情景分析(Beta2)
作者在 www.linuxforum.net
上的 ID 为 shrek2
欢迎补充,欢迎批评指正!
前言(new)................................................................................................................................................................3
第 1 章 jffs2 的数据实体及其内核描述符(improved)........................................................................................5
数据实体的内核描述符 jffs2_raw_node_ref......................................................................................................6
文件的内核描述符 jffs2_inode_cache................................................................................................................6
jffs2_raw_dirent 数据实体及其上层数据结构...................................................................................................7
jffs2_raw_inode 数据实体及其上层数据结构.................................................................................................11
第 2 章 描述 jffs2 特性的数据结构(improved)..................................................................................................15
文件系统超级块的 u 域:jffs2_sb_info 数据结构..........................................................................................15
文件索引结点的 u 域:jffs2_inode_info 数据结构.........................................................................................19
打开正规文件后相关数据结构之间的引用关系............................................................................................20
第 3 章 注册文件系统................................................................................................................................................22
init_jffs2_fs 函数................................................................................................................................................22
register_filesystem 函数.....................................................................................................................................24
第 4 章 挂载文件系统(improved).......................................................................................................................26
jffs2_read_super 函数.........................................................................................................................................26
jffs2_do_fill_super 函数.....................................................................................................................................28
jffs2_do_mount_fs 函数.....................................................................................................................................31
jffs2_build_filesystem 函数................................................................................................................................33
jffs2_scan_medium 函数....................................................................................................................................35
jffs2_scan_eraseblock 函数................................................................................................................................41
jffs2_scan_inode_node 函数..............................................................................................................................53
jffs2_scan_make_ino_cache 函数......................................................................................................................56
jffs2_scan_dirent_node 函数..............................................................................................................................57
full_name_hash 函数..........................................................................................................................................61
1
目录
jffs2_add_fd_to_list 函数...................................................................................................................................62
jffs2_build_inode_pass1 函数............................................................................................................................63
第 5 章 打开文件时建立 inode 的方法....................................................................................................................66
iget 和 iget4 函数................................................................................................................................................66
get_new_inode 函数...........................................................................................................................................68
jffs2_read_inode 函数.........................................................................................................................................71
jffs2_do_read_inode 函数(improved)...........................................................................................................76
jffs2_get_inode_nodes 函数...............................................................................................................................81
第 6 章 jffs2 中写正规文件的方法...........................................................................................................................91
sys_write 函数....................................................................................................................................................92
generic_file_write 函数......................................................................................................................................93
jffs2_prepare_write 函数..................................................................................................................................101
jffs2_commit_write 函数..................................................................................................................................105
jffs2_write_inode_range 函数..........................................................................................................................107
jffs2_write_dnode 函数.....................................................................................................................................111
第 7 章 jffs2 中读正规文件的方法.........................................................................................................................115
jffs2_readpage 函数..........................................................................................................................................115
jffs2_do_readpage_nolock 函数.......................................................................................................................115
jffs2_read_inode_range 函数............................................................................................................................116
jffs2_read_dnode 函数......................................................................................................................................120
第 8 章 jffs2 中符号链接文件的方法表(new)..................................................................................................124
jffs2_follow_link 函数......................................................................................................................................124
jffs2_getlink 函数.............................................................................................................................................125
第 9 章 jffs2 中目录文件的方法表(new)..........................................................................................................127
jffs2_create 函数...............................................................................................................................................127
jffs2_new_inode 函数.......................................................................................................................................129
jffs2_do_create 函数.........................................................................................................................................131
jffs2_do_new_inode 函数.................................................................................................................................134
第 10 章 jffs2 的 Garbage Collection.....................................................................................................................137
jffs2_start_garbage_collect_thread 函数..........................................................................................................137
jffs2_garbage_collect_thread 函数...................................................................................................................138
jffs2_garbage_collect_pass 函数......................................................................................................................141
jffs2_erase_pending_trigger 函数....................................................................................................................147
第 11 章 讨论和体会................................................................................................................................................149
什么是日志文件系统,为什么要使用 jffs2..................................................................................................149
为什么需要红黑树..........................................................................................................................................150
何时、如何判断数据实体是过时的..............................................................................................................150
后记...........................................................................................................................................................................151
附录 用 jffs2map2 模块导出文件的数据实体(new).......................................................................................152
观察根目录文件的数据实体..........................................................................................................................152
观察符号链接的信息......................................................................................................................................154
观察正规文件创建后的数据实体..................................................................................................................154
观察 jffs2_raw_inode 数据实体的大小上限..................................................................................................156
2
前言
前言(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!
3
前言
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
{
5
剩余63页未读,继续阅读
shaohaigod1981
- 粉丝: 10
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 27页智慧街道信息化建设综合解决方案.pptx
- 计算机二级Ms-Office选择题汇总.doc
- 单链表的插入和删除实验报告 (2).docx
- 单链表的插入和删除实验报告.pdf
- 物联网智能终端项目设备管理方案.pdf
- 如何打造品牌的模式.doc
- 样式控制与页面布局.pdf
- 武汉理工Java实验报告(二).docx
- 2021线上新品消费趋势报告.pdf
- 第3章 Matlab中的矩阵及其运算.docx
- 基于Web的人力资源管理系统的必要性和可行性.doc
- 基于一阶倒立摆的matlab仿真实验.doc
- 速运公司物流管理模式研究教材
- 大数据与管理.pptx
- 单片机课程设计之步进电机.doc
- 大数据与数据挖掘.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0