获取到exfat-nofuse代码后,先看看代码中自带的README.md文档,check发现该开源代码是在linux系统中以命令modprobe exfat方式load the driver manually,然后使用标准的mount加载exfat文件系统。
modprobe exfat的控制主要是运行代码exfat_super.c中module_init(init_exfat_fs)的函数。
init_exfat_fs函数主要功能:
1. FsInit------exfat文件系统全局变量初始化以及一些文件系统定义边界检查
2.exfat_init_inodecache------exfat文件系统创建专属的高速缓冲
3.register_filesystem(&exfat_fs_type)------注册exfat文件系统到linux的VFS系统体系中
相关code如下:
static int __init init_exfat_fs(void)
{
int err;
printk(KERN_INFO "exFAT: Core Version %s\n", EXFAT_VERSION);
err = FsInit();
if (err) {
if (err == FFS_MEMORYERR)
return -ENOMEM;
else
return -EIO;
}
err = exfat_init_inodecache();
if (err)
goto out;
err = register_filesystem(&exfat_fs_type);
if (err)
goto out;
return 0;
out:
FsShutdown();
return err;
}
这里需要注意的数据结构如下:
static struct file_system_type exfat_fs_type = {
.owner = THIS_MODULE,
.name = "exfat",
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)
.get_sb = exfat_get_sb,
#else
.mount = exfat_fs_mount,//根据目前的kernel版本,我们要使用这个函数probe文件系统(mount命令加载exfat时会使用调用到这个最终实际加载的文件系统函数)
#endif
#if EXFAT_CONFIG_KERNEL_DEBUG
.kill_sb = exfat_debug_kill_sb,
#else
.kill_sb = kill_block_super,
#endif
.fs_flags = FS_REQUIRES_DEV,
};
这个数据结构中
.name = "exfat",-------------标示新添加的文件系统名字,比如ext4,ext3......
.mount = exfat_fs_mount,------------这个函数会注册到文件系统中,在mount时调用加载,后续详细介绍。