读FUSE内核源代码
2015-12-12 14:05
337 查看
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文件系统向上层返回。
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文件系统向上层返回。
相关文章推荐
- Linux socket 初步
- 从源码安装Mysql/Percona 5.5
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝