linux VFS文件系统(二)

概述

本节将从VFS文件系统的挂载、打开并操作本地文件来详述其具体实现和机制

VFS作用

VFS只是一个基于软件的适配层,作用如下:

  • 提供文件系统的管理集,即文件系统注册管理列表缓存
  • 提供文件的管理策略,即inode、dentry管理列表缓存、对缓存的管理以便高效、实时定位文件
  • 提供文件系统的抽象管理集,用于重定向文件操作至具体文件系统下对应的操作

文件系统的挂载

操作分属具体文件系统下的文件前提是文件系统的挂载,下面将详细分析该过程

  • 根文件系统的挂载

系统启动时挂载ramfs,其mount时填充super block时创建根目录“/”,并将其挂载上

  1. VFS层:
    系统启动时函数start_kernel()中会去调用vfs_caches_init()来初始化VFS
    void __init vfs_caches_init(unsigned long mempages)
    {
    	unsigned long reserve;
    
    	reserve = min((mempages - nr_free_pages()) * 3/2, mempages - 1);
    	mempages -= reserve;
    
    	names_cachep = kmem_cache_create("names_cache", PATH_MAX, 0,
    			SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
    
    	dcache_init();                    //创建dentry object缓存列表
    	inode_init();                    // 创建inode object缓存列表
    	files_init(mempages);            // 创建file object缓存列表
    	mnt_init();
    	bdev_cache_init();                // 注册块设备文件系统
    	chrdev_init();                    // 建立字符设备管理缓存
    }
    // 展开
    void __init mnt_init(void)
    {
        // 建立文件系统挂载依赖的vfsmount结构体内存缓冲池
    	mnt_cache = kmem_cache_create("mnt_cache", sizeof(struct vfsmount),
    			0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL);
        // 建立文件系统管理列表
    	mount_hashtable = (struct list_head *)__get_free_page(GFP_ATOMIC);
        // 初始化sysfs文件系统
    	err = sysfs_init();
    	// 建立设备模型中fs的根对象
    	fs_kobj = kobject_create_and_add("fs", NULL);
    	// 初始化rootfs设备文件系统并切换当前进程所对应的文件系统及挂载目录
    	init_mount_tree();
    }
    // 路径
    init_mount_tree(void)
        do_kern_mount("rootfs", 0, "rootfs", NULL);
            get_fs_type(fstype);                                // 由name获取当前文件系统结构体
            vfs_kern_mount(type, flags, name, data);            // 挂载文件系统
                mnt = alloc_vfsmnt(name);    //初始化mnt        // 申请所需的mnt并初始化
                root = mount_fs(type, flags, name, data);
                    root = type->mount(type, flags, name, data);//进入具体文件系统的挂载接口
                        --------------具体文件系统挂载--------------
                // 填充mnt
                mnt->mnt_root = root;
                mnt->mnt_sb = root->d_sb;
    	        mnt->mnt_mountpoint = mnt->mnt_root;
    	        mnt->mnt_parent = mnt;    //依据当前挂载的文件系统设置mnt
    
                    
  2. rootfs层
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值