关闭

fuse内核源代码

582人阅读 评论(2) 收藏 举报

fuse内核模块被加载时,以下初始化例程会被调用,见fuse_init函数。

1.  fuse_fs_init();  注册fuse文件系统,创建fuse_inode高速缓存。

2.  fuse_dev_init(); 创建fuse_req高速缓存,加载fuse设备驱动,用于用户空间与内核空间交换信息。

3.  fuse_sysfs_init(); 在/sys/fs目录下增加fuse节点,在fuse节点下增加connections节点。

4.  fuse_ctl_init(); 注册fuse控制文件系统

 

fuse内核模块被卸载时,执行对应的清理工作,见fuse_exit函数

1.  fuse_ctl_cleanup();   注销fuse控制文件系统

2.  fuse_sysfs_cleanup(); 移除fuse、connections节点。

3.  fuse_fs_cleanup();   注销fuse文件系统,释放fuse_inode高速缓存。

4.  fuse_dev_cleanup();  注销fuse设备驱动程序,释放fuse_req高速缓存。

 

fuse_conn代表一个fuse连接,当用户文件系统被挂载时生成该结构,当文件系统被卸载时释放该结构,其主要用于管理各个请求队列,内核会为所有挂载的文件系统维护一个fuse_conn的链表(fuse文件系统可能会被挂载多次)。

 

fuse_conn的connected字段用于表示连接的状态,成功挂载后为1,当文件系统被卸载,连接被中断或是设备驱动被释放后,该字段为0,此时这个connection(挂载的文件系统)不能提供正常服务。在fuse_request_send中会检查该字段,只有连接正常fuse文件系统才会发送请求。

 

fuse中每个请求用一个fuse_req的结构表示,该结构中包含fuse请求的输入输出参数,请求对象的inode、file等。

 

每个fuse的输入、输出参数都支持三个参数,见fuse_in、fuse_out结构的定义,参数以<*value, size>的形式传递,当填充fuse_req结构时,根据请求类型,以及请求参数,设置fuse_in的参数个数(numargs),并将参数填充到args数组中,同时设置fuse_out输出参数的个数,并将存放输出结果的地址(局部变量outarg)填充到args数组中。

 

当fuse文件系统设置好请求输入输出参数之后,所有接口最后都会调用fuse_request_send将代表本次请求的fuse_req结构的状态标志设置为FUSE_REQ_PENDING,将请求加到fuse_conn的pending链表中,并调用request_wait_answer等待请求完成(等待队列被唤醒后,需要检查请求状态是否为FUSE_REQ_FINISHED)。当本次请求被响应后,结果已经被存放在局部变量outarg中,fuse进行相应的处理即可向上层返回结果。

 

每个请求fuse_req结构中包含一个wait_queue_head_t的waitq字段,每个请求在被发出之后,它首先会唤醒fuse_conn的waitq等待队列,告诉用户态守护进程有请求达到;然后其会调用wait_event_interruptible在req的waitq上睡眠等待FUSE_REQ_FINISHED条件变为真。

 

fuse设备驱动是一个简单块设备驱动程序,用于fuse在用户态和内核态之间交换数据,fuse包含一个用户空间的守护程序,其一直循环运行,主要任务是调用read从fuse设备上读取请求,当没有请求时,它会在fuse_conn的waitq上睡眠等待(对应上一段中请求发出后唤醒fuse_conn的waitq等待队列),当有请求是其从fuse_conn的pengding队列中取出最前的一个请求(对应上一段中请求发出后加到fuse_conn的pending链表),并将该请求移动到processing队列中,守护进程将fuse_req的相关信息读到用户态后,根据请求表示调用用户态实现的回调函数,并将结果通过fuse_dev_write写到fuse设备驱动,用户态请求完成后,从processing队列中找到对应的fuse_req,将结果拷贝到fuse_req的out参数中,并将fuse_req的state设置为FUSE_REQ_FINISHED,然后唤醒fuse_req的waitq。此时,fuse_req被处理完毕,fuse文件系统向上层返回。

0
0
查看评论

fuse用户空间文件系统

用户空间的文件系统(FUSE),无需理解文件系统的内幕,也不用学习内核模块编程的知识,就可以开发用户空间的文件系统框架。在用户空间的文件系统出现之前,文件系统的开发曾是内核开发人员的工作。创建文件系统需要了解内核编程和内核技术(例如 vfs)方面的知识。调试则需要 C 和 C++ 方面的专业技能。使...
  • S1234567_89
  • S1234567_89
  • 2016-02-25 16:02
  • 1318

用户态文件系统fuse学习

FUSE(用户态文件系统)是一个实现在用户空间的文件系统框架,通过FUSE内核模块的支持,使用者只需要根据fuse提供的接口实现具体的文件操作就可以实现一个文件系统。
  • ty_laurel
  • ty_laurel
  • 2016-06-15 20:50
  • 4806

FUSE源码剖析

本文转载至:http://tech.uc.cn/?p=1597  1. 前言        本文是对FUSE-2.9.2源码的学习总结。FUSE代码在用户空间和内核空间都有运行,为了突出重点,先简要描述了在基于FUSE的用户...
  • robertsong2004
  • robertsong2004
  • 2016-05-05 17:45
  • 1343

Linux FUSE源代码分析

Linux FUSE源代码分析 一、Fuse简要介绍 FUSE(用户空间文件系统)是这样一个框架,它使得FUSE用户在用户态下编写文件系统成为可能,而不必和内核打交道。FUSE由三个部分组成,linux内核模块、FUSE库以及mount工具。用户关心的只是FUSE库和mount工具,内核模块仅仅提供...
  • Fybon
  • Fybon
  • 2014-03-10 14:46
  • 2938

FUSE使用及介绍

refer: http://blog.sina.com.cn/s/blog_832beddb0100skrm.html 1. FUSE(Filesystem in Userspace)简介 1.1. 概述 FUSE(用户空间文件系统)作为类UNIX系统平台上可加载的内核...
  • sourthstar
  • sourthstar
  • 2013-01-29 12:02
  • 3883

fuse文件系统源码

  • 2013-04-08 15:09
  • 50KB
  • 下载

fuse用户态、内核态通信机制分析

关于fuse用户态文件系统的文章有很多,比如http://my.debugman.net/program/fuse-180.html,就写得很全面。但关于fuse用户态、内核态通信的文章还比较少,我现在发现的一篇是http://blog.chinaunix.net/uid-20687780-id-3...
  • vah101
  • vah101
  • 2012-08-06 22:38
  • 4602

fuse内核源代码

fuse内核模块被加载时,以下初始化例程会被调用,见fuse_init函数。 1.  fuse_fs_init();  注册fuse文件系统,创建fuse_inode高速缓存。 2.  fuse_dev_init(); 创建f...
  • qq_14821541
  • qq_14821541
  • 2016-06-01 13:35
  • 582

Fuse_Drivers_x64.

  • 2011-08-18 16:18
  • 2.22MB
  • 下载

读FUSE内核源代码

fuse内核模块被加载时,以下初始化例程会被调用,见fuse_init函数。 1.  fuse_fs_init();  注册fuse文件系统,创建fuse_inode高速缓存。 2.  fuse_dev_init(); 创建fuse_req高速缓存,加载fuse设备...
  • csdn482
  • csdn482
  • 2015-12-12 14:05
  • 325
    个人资料
    • 访问:68628次
    • 积分:909
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:83篇
    • 译文:0篇
    • 评论:4条
    最新评论