linux内核VFS虚拟文件系统总结

  最近手里有一个项目需要写一个简单的文件系统,利用周末时间把深入理解linux内核书第十二章虚拟文件系统学习了一下,加深了对vfs的理解,这里也做一下总结,以备后查。

  linux成功的关键因素之一就是它与其他操作系统和谐共存的能力,在linux下可以安装挂载很多格式的文件系统,之所以能实现就是通过虚拟文件系统这一中间系统层,虚拟文件系统的主要思想是引入了一个通用文件模型,它能够表示所有的文件系统,这也要求,具体文件系统的实现中需要给VFS提供相应的物理组织结构。

  通用文件模型有4大对象模型:超级块对象 索引节点对象 目录项对象 文件对象

  要注意的是,在VFS看来,超级块以及索引节点是存在于实际物理磁盘的,而目录项和文件对象是VFS在内存中创建的结构,这里也预示着超级块对象和索引节点对象存在这个内存和物理磁盘的同步问题。

  这里也说明在VFS看来,实际的物理磁盘除了实际数据外,应该还有超级块和索引节点表,当然这个我们可以在具体文件系统的实现来实现,因为不是所有的文件系统在物理磁盘上有超级块和索引节点表的。

  我们首先从空间上来一一介绍VFS这4大对象模型:

1.superblock

1)superblock简介

超级块用来描述特定文件系统的信息。物理的超级块存放在磁盘特定的扇区中 ,分区被mount时将会读取磁盘superblock信息存在于内存中,也就是VFS的超级块对象。VFS超级块是各种具体文件系统在安装时建立的,并在这些文件系统卸载时被自动删除 。超级块对象由结构体 super_block来体现。

VFS中超级块对象的数据结构如下:

1318struct super_block {
1319        struct list_head        s_list;                                      // 超级快链表指针
1320        dev_t                   s_dev;                                          // 设备表示符
1321        unsigned char           s_dirt;                                   //脏标志
1322        unsigned char           s_blocksize_bits;              //以位为单位的块的大小
1323        unsigned long           s_blocksize;                     //以字节为单位的块大小
1324        loff_t                  s_maxbytes;                              //文件大小上限
1325        struct file_system_type *s_type;                       //指向文件系统的file_system_type 数据结构的指针
1326        const struct super_operations   *s_op;                         //超级块方法
1327        const struct dquot_operations   *dq_op;                      //磁盘限额方法
1328        const struct quotactl_ops       *s_qcop;                       //限额控制方法
1329        const struct export_operations *s_export_op;           //导出方法
1330        unsigned long           s_flags;                                       //登录标志
1331        unsigned long           s_magic;                                    //文件系统的魔数
1332        struct dentry           *s_root;                                          //目录登录点
1333        struct rw_semaphore     s_umount;                           //卸载信号量
1334        struct mutex            s_lock;                                         //超级块信号量
1335        int                     s_count;                                              //超级块引用计数
1336        atomic_t                s_active;                                       //活动引用记数
1337#ifdef CONFIG_SECURITY                             
1338        void                    *s_security;                                      //安全模块
1339#endif
1340        const struct xattr_handler **s_xattr;      
1341
1342        struct list_head        s_inodes;                               //把所有索引对象链接在一起,存放的是头结点
1343        struct hlist_head       s_anon;                                 //匿名目录项
1344#ifdef CONFIG_SMP
1345        struct list_head __percpu *s_files;      
1346#else
1347        struct list_head        s_files;                                    //链接所有打开的文件。
1348#endif
1349        /* s_dentry_lru and s_nr_dentry_unused are protected by dcache_lock */
1350        struct list_head        s_dentry_lru;   /* unused dentry lru */
1351        int                     s_nr_dentry_unused;     /* # of dentry on lru */
1352
1353        struct block_device     *s_bdev;                             //相关的块设备
1354        struct backing_dev_info *s_bdi;          
1355        struct mtd_info         *s_mtd;          
1356        struct list_head        s_instances;                         //该类型文件系统
1357        struct quota_info       s_dquot;                              //限额相关选项
1358
1359        int                     s_frozen;        
1360        wait_queue_head_t       s_wait_unfrozen;
1361
1362        char s_id[32];                                                          //文本名字
1363
1364        void                    *s_fs_info;                                    //文件系统特设信息
1365        fmode_t                 s_mode;        
1366
1367        /* Granularity of c/m/atime in ns.
1368           Cannot be worse than a second */
1369        u32                s_time_gran;
1370
1371        /*
1372         * The next field is for VFS *only*. No filesystems have any business
1373         * even looking at it. You had been warned.
1374         */
1375        struct mutex s_vfs_rename_mutex;        /* Kludge */
1376
1377        /*
1378         * Filesystem subtype.  If non-empty the filesystem type field
1379         * in /proc/mounts will be "type.subtype"
1380         */
1381        char *s_subtype;
1382
1383        /*
1384         * Saved mount options for lazy filesystems using
1385         * generic_show_options()
1386         */
1387        char *s_options;
1388};

我们先看一下内核中superblock的关系图:

1.s_list :所有的超级块形成一个双联表,s_list.prev和s_list.next分别指向与当前超级块相邻的前一个元素和后一个元素。通常我们通过list_entry宏来获取s_list所在超级块结构体的地址(超级块对像是以双向链表的形式链接在一起的)。

2. s_lock :保护链表免受多处理器系统上的同时访问。

3.s_fs_info: 字段指向具体文件系统的超级块。

例如:超级块对象指的是Ext2文件系统,该字段就指向ext2_sb_

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值