Fuse 学习

来源:互联网 发布:人工智能 电子书 编辑:程序博客网 时间:2024/05/16 05:41
1. enable debug
    a. 修改 lib/Makefile, 添加 -O0, -g2 在 CC后面
    b. root@ub1:/home/shawn/src/fuse-2.9.0/example# gcc -g2 -O0 -Wall -c hello.c -o hello.o -D_FILE_OFFSET_BITS=64
    c. root@ub1:/home/shawn/src/fuse-2.9.0/example# gcc -g2 -O0 -o hello hello.o ../lib/.libs/*.o -lpthread -ldl -lrt
    d. gdb hello
2. fuse 内核态通知用户态的机制, 可以参见
http://www.cnblogs.com/hanyan225/archive/2010/10/20/1857040.html
  其准备好了之后, 调用queue_request, 然后呢 这个里面调用这个kill_fasync 来做到。

3. fuse的基本工作流程
1. 在用户态只用 fuse程序,执行之后,
     a. 该进程会打开 /dev/fuse文件,得到fd
     b. 会自动挂载一个fuse类型的问题系统。并将fd作为mount option,传递给内核文件系统。
     c. 然后,程序会变成一个用户态的daemon进程,不停的读取(read)fd里面的内容。
     d. fd里面的内容呢, 当然就封装了要操作的方法,以及内容,参数等信息。
     e. 得到上述的信息之后呢,就可以进行操作了, 相当于rpc调用一样哦。
2. 内核模块
     上面提到了 fuse文件系统,以及字符设备 /dev/fuse, 这两个东西,是需要内核来支持的。
     a. 这两个东西,都是在内核模块fuse里面来实现的。
     b. 模块启动的时候,注册了fuse类型的文件系统,并且初始化了/dev/fuse设备。
3. 对文件系统的操作。
     例如,对mkdir操作。
     a. 对文件系统进行mkdir操作的话,会调用fuse的mkdir操作。
     b. fuse文件系统里面,会将该操作的op, arg等封装好了,然后发给 fuse_session, 并唤醒wait_queue,
     c. 而用户态进程呢,即刚刚那个fuse程序,不停的read,其实最后会调用内核态的fuse_dev_read函数。
     d. 而此函数呢,通过file结构,得到fuse session结构,然后就在该结构上面等带咯。
        直到c步骤中写入数据,并唤醒。
4. 重要:
     1. 这个里面,fuse程序是一直在run的,一旦不run了,文件系统就不能访问了。
     2. 这里除了fuse程序作为rpc server外,还有个很重要的。
     3. 在fuse程序里面,打开了/dev/fuse文件,
     4. 然后呢,在调用mount函数来mount fuse文件系统, 在fuse文件系统的fillsuper里面呢,
        得到上面的/dev/fuse文件结构struct file,并将fuse文件系统的session存储到struct file中。
     5. 而fuse_dev_read中,就是根据struct file来得到fuse session的,并进行wait的。
     6. 从上面可以看到,fuse文件系统和fuse_dev_read里面必须使用同一个struct file结构,
     7. 而struct file是属于进程的,即这两个东西,都是属于fuse程序的,因为他们都是被fuse程序调用而创造出来的,
          当然最后,fuse进行被daemon化了,所以strut file是一直存在的。
原创粉丝点击