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 内核态通知用户态的机制, 可以参见
其准备好了之后, 调用queue_request, 然后呢 这个里面调用这个kill_fasync 来做到。
3. fuse的基本工作流程
1. 在用户态只用 fuse程序,执行之后,a. 该进程会打开 /dev/fuse文件,得到fdb. 会自动挂载一个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是一直存在的。