概述
本节将从VFS文件系统的挂载、打开并操作本地文件来详述其具体实现和机制
VFS作用
VFS只是一个基于软件的适配层,作用如下:
- 提供文件系统的管理集,即文件系统注册管理列表缓存
- 提供文件的管理策略,即inode、dentry管理列表缓存、对缓存的管理以便高效、实时定位文件
- 提供文件系统的抽象管理集,用于重定向文件操作至具体文件系统下对应的操作
文件系统的挂载
操作分属具体文件系统下的文件前提是文件系统的挂载,下面将详细分析该过程
- 根文件系统的挂载
系统启动时挂载ramfs,其mount时填充super block时创建根目录“/”,并将其挂载上
- 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
- rootfs层