linux_kernel_fuse_源码剖析.docx

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux_kernel_fuse_源码剖析

FUSE源码剖析?1.?前言?本文是对FUSE-2.9.2源码的学习总结。FUSE代码在用户空间和内核空间都有运行,为了突出重点,先简要描述了在基于FUSE的用户空间文件系统中执行write操作的一般流程,接下来介绍了 重要的数据结 构,最后以FUSE的运行过程为线索,剖析FUSE程序运行过程的3个关键步骤:?1.FUSE模块加载??2.mount和open过程??3.对文件write。?对于虚拟文件系统和设备驱动的相关概念本文仅作简要说明。需要说明的是,由于内核的复杂性及个人能力的有限,本文省略了包括内核同步,异常检查在内的诸多内容,希望可以突出重点。?2.?FUSE下write的一般流程??图1?在基于FUSE的用户空间文件系统中执行write操作的流程如图1所示(由于版面关系,图中部分函数是缩写,请参考源码):?1.客户端在mount目录下面,对一个regular?file调用write,?这一步是在用户空间执行?2.write内部会调用虚拟文件系统提供的一致性接口vfs_write?3.根据FUSE模块注册的file_operations信息,vfs_write会调用fuse_file_aio_write,将写请求放入fuse?connection的request?pending?queue,?随后进入睡眠等待应用程序reply?4.用户空间的libfuse有一个守护进程通过函数fuse_session_loop轮询杂项设备/dev/fuse,?一旦request?queue有请求即通过fuse_kern_chan_receive接收?5.fuse_kern_chan_receive通过read读取request?queue中的内容,read系统调用实际上是调用的设备驱动接口fuse_dev_read?6.在用户空间读取并分析数据,执行用户定义的write操作,将状态通过fuse_reply_write返回给kernel?7.fuse_reply_write调用VFS提供的一致性接口vfs_write?8.vfs_write最终调用fuse_dev_write将执行结果返回给第3步中等待在waitq的进程,此进程得到reply?后,write返回?3.?数据结构?本节主要介绍了FUSE中比较重要的数据结构,需要说明的是图示中只列出了与叙述相关的数据成员,完整的数据结构细节请参考源码。3.1.?内核部分?图2?struct?fuse_conn:每一次mount会实例化一个struct?fuse_conn即fuse?connection,?它代表了用户空间和内核的通信连接。fuse?connection维护了包括pending?list,?processing?list和io?list在内的request?queue,fuse?connection通过这些队列管理用户空间和内核空间通信过程。?struct?fuse_req:每次执行系统调用时会生成一个struct?fuse_req,?这些fuse_req依据state被组织在不同的队列中,struct?fuse_conn维护了这些队列.?struct?file:?存放打开文件与进程之间进行交互的有关信息,描述了进程怎样与一个打开的文件进行交互,这类信息仅当进程访问文件期间存在于内核内存中。?struct?inode:文件系统处理文件所需要得所有信息都放在一个名为inode(索引节点)的数据结构中。文件名可以随时更改,但是索引节点对文件是唯一的,并且随着文件的存在而存在。?struct?file_operation:定义了可以对文件执行的操作。?3.2.?用户空间部分 图3?struct?fuse_req:这个结构和上文中内核的fuse_req同名,有着类似的作用,但是数据成员不同。?struct?fuse_session:定义了客户端管理会话的结构体,包含了一组对session可以执行的操作。?struct?fuse_chan:定义了客户端与FUSE内核连接通道的结构体,包含了一组对channel可以执行的操作。?struct?fuse_ll_ops:结构的成员为一个函数指针func和命令名字符串name,内核中发过来的每一个request最后都映射到以此结构为元素的数组中。?4.?FUSE模块加载?FUSE内核模块需要在用户空间使用insmod或者modprobe加载。它们通过系统调用init_module启动加载过程,注册过程比较简单,包括如下步骤:?1.创建高速缓存结构fuse_inode_cachep?2.遍历file_systems链表,如果未注册,则将fuseblk_fs_type链到file_systems链表尾部?3.遍历file_systems链表,如果

文档评论(0)

70后老哥 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档