现在的位置: 首页 > 综合 > 正文

FUSE的内部原理(给网友的回复)

2012年05月26日 ⁄ 综合 ⁄ 共 864字 ⁄ 字号 评论关闭

经常有网友问到关于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收到返回码后就继续向上返回。

 

至此一个请求完成了。

 

【上篇】
【下篇】

抱歉!评论已关闭.