zoukankan      html  css  js  c++  java
  • FUSE工作流程官方文档

                               How Fuse-1.3 Works

    [这篇文档已经有点老了, 不过对于了解FUSE工作原理的朋友来讲已经够了.]
    [Written by Terje Oseberg]
    1. The fuse library.

    When your user mode program calls fuse_main() (lib/helper.c), fuse_main() parses the arguments passed to your user mode program, then calls fuse_mount() (lib/mount.c).

    fuse_mount() creates a UNIX domain socket pair, then forks and execs fusermount (util/fusermount.c) passing it one end of the socket in the FUSE_COMMFD_ENV environment variable.

    实际上, 在新版的fuse library中不是所有的fuse_mount会调用socketpair()来创建socket. 在新版的fuse library中, 如果挂载点是用户可以访问的, 则用于和kernel的fuse通信用的fd实际上为open("/dev/fuse",...)返回的描述符. 如果用户不可以访问, 譬如挂载点位于/opt/fuse的话, 会调用socketpair来创建UNIX域的socket.

    fusermount (util/fusermount.c) makes sure that the fuse module is loaded. fusermount then open /dev/fuse and send the file handle over a UNIX domain socket back to fuse_mount().

    fuse_mount() returns the filehandle for /dev/fuse to fuse_main().fuse_main() calls fuse_new() (lib/fuse.c) which allocates the struct fuse datastructure that stores and maintains a cached image of the filesystem data.

    Lastly, fuse_main() calls either fuse_loop() (lib/fuse.c) or fuse_loop_mt() (lib/fuse_mt.c) which both start to read the filesystem system calls from the /dev/fuse, call the usermode functions stored in struct fuse_operations datastructure before calling fuse_main(). The results of those calls are then written back to the /dev/fuse file where they can be forwarded back to the system calls.

    2. The kernel module.

    The kernel module consists of two parts. First the proc filesystem component in kernel/dev.c -and second the filesystem system calls kernel/file.c, kernel/inode.c, and kernel/dir.c All the system calls in kernel/file.c, kernel/inode.c, and kernel/dir.c make calls to either request_send(), request_send_noreply(), or request_send_nonblock(). Most of the calls (all but 2) are to request_send(). request_send() adds the request to, "list of requests" structure (fc->pending), then waits for a response. request_send_noreply() and request_send_nonblock() are both similar in function to request_send() except that one is non-blocking, and the other does not respond with a reply.
    The proc filesystem component in kernel/dev.c responds to file io requests to the file /dev/fuse. fuse_dev_read() handles the file reads and returns commands from the "list of requests" structure to the calling program. fuse_dev_write() handles file writes and takes the data written and places them into the req->out datastructure where they can be returned to the system call through the "list of requests" structure and request_send().

  • 相关阅读:
    windows编程:第一个windows程序
    百度地图API多个点聚合时,标注添加的标签label地图刷新就丢失的问题解决
    在WPF的WebBrowser控件中屏蔽脚本错误的提示
    使用SQL语句逐条更新每条记录
    通过 HDU 2048 来初步理解动态规划
    一个乱码问题
    2、设置配置文件
    1、搭建 maven 环境
    MyBatis 缓存机制
    关于 Mybatis 设置懒加载无效的问题
  • 原文地址:https://www.cnblogs.com/codestub/p/2144333.html
Copyright © 2011-2022 走看看