FAT文件系统的挂载过程

来源:互联网 发布:nginx 静态服务器缓存 编辑:程序博客网 时间:2024/05/16 18:52

有了上一篇vfs的笔记为基础,接着实际分析一个真实的文件系统挂载过程,所以选择了一个简单的fat文件系统。

fs/namespace.c中mount的系统调用为:

SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,        char __user *, type, unsigned long, flags, void __user *, data){    int ret;    char *kernel_type;    char *kernel_dir;    char *kernel_dev;    unsigned long data_page;    ret = copy_mount_string(type, &kernel_type);//挂载类型,这里为vfat    if (ret < 0)        goto out_type;    kernel_dir = getname(dir_name);//从userspace拷贝挂载目录,比如挂载到/mnt/sdcard    if (IS_ERR(kernel_dir)) {        ret = PTR_ERR(kernel_dir);        goto out_dir;    }    ret = copy_mount_string(dev_name, &kernel_dev);//挂载的设备节点,如/dev/sdb    if (ret < 0)                                                                                                                                                       goto out_dev;    ret = copy_mount_options(data, &data_page);//挂载选项,如wait noatime nodiratime  nosuid nodev uid=1000等    if (ret < 0)        goto out_data;    ret = do_mount(kernel_dev, kernel_dir, kernel_type, flags,        (void *) data_page);    ........................} 
经过层层调用,最终是调用文件系统自己的mount方法,type->mount(type, flags, name, data),进入到fat的file_system_type,这是在内核启动时候就注册了的,不过要注意的是所谓注册文件系统,只不过是简单的把它添加到内核的文件系统链表而已,要文件系统真正生效能使用,必须挂载才行:

static struct file_system_type vfat_fs_type = {    .owner      = THIS_MODULE,    .name       = "vfat",    .mount      = vfat_mount,    .kill_sb    = kill_block_super,    .fs_flags   = FS_REQUIRES_DEV,};
调用的是vfat_mount函数:

                                              未完...................最近没空.....................后续补上.


原创粉丝点击