上图是一个总的结构体之间关系依赖图,里面内容繁多,这也只是关键的一些结构拿出来说明。本文打算基于核心结构体进行讲解,然后针对每个核心结构体单独分解其诞生和消失的过程。
这是最核心的一个结构体,他的创建是从用户层传入的,并且是一开始系统初始化阶段就传入,基于我们的configfs文件系统完成。
mount functionfs bulk /dev/usb-ffs/bulk xxxxx以上代码是安卓做的,第二个参数bulk,讲道理应该是某个具体的设备名称,比如/dev/bulk这种。但是mount其实不是我们常规的mount命令,这个是init自己定义的操作命令,详细就不细说。经过这个步骤,最终会调用到下面ffs_fs_mount函数
static struct file_system_type ffs_fs_type = { .owner = THIS_MODULE, .name = "functionfs", .mount = ffs_fs_mount, .kill_sb = ffs_fs_kill_sb, };每执行一次mount操作我们就会创建一个ffs_data,并且绑定一个ffs_dev跟其进行对应。上面的例子中,对应的dev就是bulk。
struct ffs_dev { struct ffs_data *ffs_data; struct f_fs_opts *opts; struct list_head entry; char name[41]; bool mounted; bool desc_ready; bool single; int (*ffs_ready_callback)(struct ffs_data *ffs); void (*ffs_closed_callback)(struct ffs_data *ffs); void *(*ffs_acquire_dev_callback)(struct ffs_dev *dev); void (*ffs_release_dev_callback)(struct ffs_dev *dev); };顺道说一下,mount完成后,会自动创建一个ep0文件节点。这是因为所有的设备至少都有一个ep0,既然都有那就没必要让用户后期去创建了,所以框架帮忙做了这个工作。