首页 JFFS2文件系统分析报告

JFFS2文件系统分析报告

举报
开通vip

JFFS2文件系统分析报告JFFS2文件系统分析报告 本文在深入研究jffs2源代码基础上,对JFFS2文件系统的实现机制进行了分析,包括关键的数据结构及其之间的联系,文件系统的注册和挂载,以及其他主要的操作流程。 1 JFFS2层次结构 在Linux系统中,JFFS2文件系统处于虚拟文件系统层VFS与存储技术设备层MTD之间,如图1所示。VFS为内核中的各种文件系统提供一个统一的抽象层,并为上层用户提供具有统一格式的接口函数;MTD子系统整合底层芯片驱动,为上层文件系统提供了统一访问MTD设备(主要是NOR闪存和NAND闪存等设备)的接...

JFFS2文件系统分析报告
JFFS2文件系统分析报告 本文在深入研究jffs2源代码基础上,对JFFS2文件系统的实现机制进行了分析,包括关键的数据结构及其之间的联系,文件系统的注册和挂载,以及其他主要的操作 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 。 1 JFFS2层次结构 在Linux系统中,JFFS2文件系统处于虚拟文件系统层VFS与存储技术设备层MTD之间,如图1所示。VFS为内核中的各种文件系统提供一个统一的抽象层,并为上层用户提供具有统一格式的接口函数;MTD子系统整合底层芯片驱动,为上层文件系统提供了统一访问MTD设备(主要是NOR闪存和NAND闪存等设备)的接口。JFFS2在内存中建立超级块信息jffs2_sb_info管理文件系统操作,建立索引节点信息jffs2_inode_info管理打开的文件。VFS层的超级块super_block和索引节点inode分别包含JFFS2文件系统的超级块信息jffs2_sb_info和索引节点信息jffs2_inode_info,它们是JFFS2和VFS间通信的主要接口。JFFS2文件系统的超级块信息jffs2_sb_info包含底层MTD设备信息mtd_info指针,文件系统通过该指针访问MTD设备,实现JFFS2和底层MTD设备驱动之间的通信。 图1 JFFS2文件系统层次 2 JFFS2数据实体 JFFS2在Flash上只存储两种类型的数据实体,分别为jffs2_raw_inode和jffs2_raw_ dirent。 l jffs2_raw_dirent:包括文件名、ino号、父节点ino号、版本号、校验码等信息,它用来形成整个文件系统的层次目录结构。 l jffs2_raw_inode:包括文件ino号、版本号、访问权限、修改时间、本节点所包含的数据文件中的起始位置及本节点所包含的数据大小等信息,它用来管理文件的所有数据。 一个目录文件由多个jffs2_raw_dirent组成。而普通文件,符号链接文件,设备文件,FIFO文件等都由一个或多个jffs2_raw_inode数据实体组成。图2 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示了一个Flash中数据实体的逻辑分布,物理上所有的数据实体是离散分布的,其位置由写入时Flash空闲空间位置决定的。 图2 Flash空间上的数据实体 JFFS2文件系统在挂载时扫描整个Flash,每个jffs2_raw_inode数据实体都会记录其所属的文件的inode号及其他元数据,以及数据实体中存储的数据的长度及在文件内部的偏移。而jffs2_raw_dirent数据实体中存有目录项对应的文件的inode号及目录项所在的目录的inode号等信息。JFFS2在扫描时根据jffs2_raw_dirent数据实体中的信息在内存中建立文件系统的目录树信息,类似的,根据jffs2_raw_inode数据实体中的信息建立起文件数据的寻址信息。为了提高文件数据的寻址效率,JFFS2将属于同一个文件的jffs2_raw_inode数据实体组织为一颗红黑树,在挂载扫描过程中检测到的每一个有效的jffs2_raw_inode都会被添加到所属文件的红黑树。在文件数据被更新的情况下,被更新的旧数据所在的jffs2_raw_inode数据实体会被标记为无效,同时从文件的红黑树中删除。然后将新的数据组织为jffs2_raw_inode数据实体写入Flash并将新的数据实体加入红黑树。 3 JFFS2逻辑结构 与磁盘文件系统不同,JFFS2文件系统不在Flash设备上存储文件系统结构信息,所有的信息都分散在各个数据实体节点之中,在系统初始化的时候,扫描整个Flash设备,从中建立起文件系统在内存中的映像,系统在运行期间,就利用这些内存中的信息进行各种文件操作。JFFS2为每一个Flash设备维护一个超级块结构jffs2_sb_info,这个结构含有整个Flash设备的信息。通过这个数据结构,系统维护了几个重要的链表,这几个链表构成了整个文件系统的骨架。 3.1 擦除块信息链表 在jffs2_sb_info中维护着多个擦除块链表,如表1所示,链表中每一个节点包含一个擦除块。 表1 擦除块信息链表 链表 链表中擦除块的性质 clean_list 只包含有效数据结点 very_dirty_list 所含数据结点大部分都已过时 dirty_list 至少含有一个过时数据结点 erasable_list 所有的数据结点都过时需要擦除。但尚未“调度”到erase_pending_list erasable_pending_wbuf_list 同erase_pending_list,但擦除必须等待wbuf冲刷后 erasing_list 当前正在擦除 erase_pending_list 当前正等待擦除 erase_complete_list 擦除已完成,但尚未写入CLEANMARKER free_list 擦除完成,且已经写入CLEANMARKER bad_list 含有损坏单元 bad_used_list 含有损坏单元,但含有数据     擦除块由jffs2_eraseblock数据结构表示,该结构包含该擦除块在Flash设备的偏移位置、该块的空间使用情况,以及所有存在于该擦除块的数据实体的链表等信息。通过这些擦除块链表,我们可以找到存在于Flash设备上的任何一个擦除块,及其上面的数据实体,如图3所示。 图3 擦除链表的示意图 3.2 incache_list链表 在jffs2_sb_info中,系统维护着一个inocache_list链表,链表中每个元素jffs2_inode_cache代表一个文件,包括普通文件和目录文件,由唯一的ino号所标识。所有属于同一个文件的节点信息jffs2_raw_node_ref由指针形成链表,由jffs2_inode_cache的notes域指向,这样对文件任何一个节点操作都可以通过这个链表定位,如图4所示。 图4 inocache_list链表 3.3 jffs2_inode_info链表 jffs2_inode_info是在打开文件时创建的,jffs2中通过jffs2_inode_info的fragtree、 metedata或者dents来组织打开文件的所有数据实体的内核描述符。普通文件包含若干jffs2_raw_inode数据实体,它们的内核描述符jffs2_raw_node_ref组成的链表由jffs2_inode_cache的nodes指向(前面我们已经叙述)。如果是目录文件,则在打开文件时为数据实体的内核描述符jffs2_raw_node_ref创建相应的jffs2_full_dirent,并组织为链表由dents指向。 图5 目录文件打开时的jffs2_inode_info链表 如果是普通文件,在打开文件时创建相应的jffs2_full_dnode和jffs2_node_frag数据结构,并由后者组织在由fragtree指向的红黑树中。对于目录文件、符号链接和设备文件只有一个jffs2_raw_inode数据实体所以没有必要使用红黑树则由metadata直接指向它们的jffs2_full_dnode。图6展示了一个普通文件打开时的jffs2_inode_info链表。 图6 普通文件打开时的jffs2_inode_info链表 4 JFFS2文件系统注册 在配置内核时选择对jffs2的支持,那么jffs2的源代码编译后被静态链接入内核映象,在初始化期间init内核线程执行init_jffs2_fs函数完成jffs2的注册,init_jffs2_fs函数主要完成以下工作: 1 检测基本数据结构jffs2_unknown_node、jffs2_raw_dirent、jffs2_raw_inode等的大小的合法性; 2 调用jffs2_compressors_init()函数分配解压缩所需空间deflate_workspace和inflate_workspace; 3 调用jffs2_create_slab_caches()为数据实体jffs2_raw_dirent和jffs2_raw_inode、数据实体内核描述符jffs2_raw_node_ref、文件的内核描述符jffs2_inode_cache、jffs2_full_dnode和jffs2_node_frag等数据结构通过kmem_cache_create函数创建相应的内存高速缓存 4 调用register_filesystem函数向系统注册JFFS2文件系统,所有已注册文件系统的file_system_type组成一个链表,由内核全局变量file_systems指向。 其中在jffs2源代码文件中定义了file_system_type类型的变量jffs2_fs_type,其名字为“jffs2”,而“get_sb”方法为“jffs2_get_sb”,它是具体文件系统所提供的各种方法的总入口。 static struct file_system_type jffs2_fs_type = { .owner =    THIS_MODULE, .name =        "jffs2", .get_sb =    jffs2_get_sb, .kill_sb =    jffs2_kill_sb, }; 5 JFFS2文件系统挂载 在挂载文件系统时内核为之创建VFS的super_block数据结构,以及根目录的inode、dentry等数据结构。挂载根文件系统时函数调用链如下: mount_root -->mount_block_root -->do_mount_root -->sys_mount -->do_mount -->do_new_mount -->do_kern_mount -->vfs_kern_mount -->type->get_sb= jffs2_get_sb jffs2_get_sb在初始化VFS超级块对象时为flash上所有的数据实体和文件建立内核描述符。内核描述符是数据实体和文件的“地图”,由于在flash中缺少对文件数据的索引机制,所以早在挂载文件系统时就必须建立文件及其数据实体的映射关系。 jffs2_get_sb主要工作: 1 设置文件系统方法表的指针jffs2_sb_info->s_op = &jffs2_super_operations;,它提供了访问整个文件系统的基本方法。 2 设置jffs2_sb_info->mtd指向在初始化Flash设备驱动程序时创建的mtd_info数据结构,它物理上描述了整个Flash板块并提供了访问Flash的底层驱动程序。从后文可见,jffs2方法最终通过调用flash驱动程序中将数据实体jffs2_raw_dirent或jffs2_raw_inode及后继数据块写入flash(或从中读出)。 3 真正初始化VFS超级块super_block数据结构、为flash上所有数据实体建立内核描述符jffs2_raw_node_ref、为所有文件创建内核描述符jffs2_inode_cache的任务交给jffs2_do_fill_super函数完成。 jffs2_do_fill_super函数主要工作: 1 根据mtd_info数据结构的相应域来设置jffs2_sb_info中与flash参数有关的域:擦除块大小和分区大小。jffs2驱动在成功擦除了一个擦除块后,要写入类型为CLEANMARKER的数据实体来标记擦除成功完成。 2 分配c->wbuf,c->inocache_list缓冲区,调用jffs2_do_mount_fs()函数完成挂载jffs2文件系统的绝大部分工作。
本文档为【JFFS2文件系统分析报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_682974
暂无简介~
格式:doc
大小:39KB
软件:Word
页数:0
分类:互联网
上传时间:2018-11-20
浏览量:48