Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4065687
  • 博文数量: 251
  • 博客积分: 11197
  • 博客等级: 上将
  • 技术积分: 6862
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-05 14:41
个人简介

@HUST张友东 work@taobao zyd_com@126.com

文章分类

全部博文(251)

文章存档

2014年(10)

2013年(20)

2012年(22)

2011年(74)

2010年(98)

2009年(27)

分类: 服务器与存储

2010-10-22 21:36:05

经常有网友问到关于fuse内部实现原理方面的问题,下面的内容是给一个网友的回复,简单的讲述了fuse的原理,并分析了一个特定请求的处理过程。

 

fuse主要包含3个模块:

一个fuse文件系统模块(1),一个设备驱动模块(2),一个用户空间模块(3

 

fuse文件系统这一部分跟其它的文件系统实现差不多,实现了一个文件系统应该提供的借口(如readwriteopen等),这就是为什么你挂在了用fuse实现的文件系统后,能直接使用shell命令.(shell命令 --> vfs -> fuse文件系统)。

 

设备驱动模块主要是用来协调1,3两个模块,并用于1,3之间交换数据。 在内核态与用户态交换数据的方法有很多种,如通过系统调用,通过设备驱动程序,procfs netlink等,fuse选择的是通过设备驱动程序的方式。这里的设备驱动程序相当于一个中介。

 

用户模块一直轮询设备驱动,如果有请求(即能通过fuse_dev_read读取到数据),就分析请求的类型,并调用回调函数(也就是我们实现文件系统时的一组函数)。

 

整个工作过程大概是这样的。

 

1。 你编写了一个xx文件系统,实现了一组接口(回调函数),并注册这组接口,接下来fuse用户模块会调用fuse_dev_read从设备驱动读取数据(请求),这个读取请求会被加入到某个请求队列。

 

2。 你在挂载目录的命令行敲了一个mkdir的命令,它会调用系统调用mkdir,最终会调用fuse文件系统的mkdir接口,这个接口的实现实际上就是唤醒正在等待fuse_dev_read的队列,这是用户空间的fuse_dev_read可以读取数据了(请求),然后会把mkdir这个请求的信息(fuse有自己的请求包格式)读取到用户空间,并根据请求信息调用回调函数xx_mkdirxx文件系统实现的mkdir方法),并将数据(有可能只是一个错误码)通过fuse_dev_write返回给等待返回的mkdir调用。

 

3 fuse文件系统的mkdir收到返回码后就继续向上返回。

 

至此一个请求完成了。

 

阅读(6444) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~