当前位置: 首页 > 工具软件 > exFAT > 使用案例 >

exfat文件系统(二)

金赤岩
2023-12-01


获取到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时调用加载,后续详细介绍。


 类似资料: