@HUST张友东 work@taobao zyd_com@126.com
分类: 服务器与存储
2010-10-22 21:36:05
经常有网友问到关于fuse内部实现原理方面的问题,下面的内容是给一个网友的回复,简单的讲述了fuse的原理,并分析了一个特定请求的处理过程。
fuse主要包含3个模块:
一个fuse文件系统模块(1),一个设备驱动模块(2),一个用户空间模块(3)
fuse文件系统这一部分跟其它的文件系统实现差不多,实现了一个文件系统应该提供的借口(如read,write,open等),这就是为什么你挂在了用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_mkdir(xx文件系统实现的mkdir方法),并将数据(有可能只是一个错误码)通过fuse_dev_write返回给等待返回的mkdir调用。
3。 fuse文件系统的mkdir收到返回码后就继续向上返回。
至此一个请求完成了。