linux内核源码研究--文件系统VFS层实现

文件系统的分类:

  • 磁盘文件系统
  • 内存虚拟文件系
  • 统网络文件系统

通用的模型VFS对上(用户)解决了各种不同文件系统的统计接口问题,同时对下(具体的文件系统)兼容各种新的文件系统,让linux变得更加强大灵活

                                                                                      VFS的架构图

实现思路:

  1. 定义一个最小的通用模型
  1. 定义一个强大的模型,实现都可以选择性的实现(ext2->VFS)

下面是通过inode查找一个文件的过程(实际的实现过程中会有缓存来加速文件查找)

 链接

  1. 软链接:有一个目录项,指向独立INODE,INODE不存文件数据,存指向真实文件的路径,可以在不同分区
  1. 硬链接:有一个目录项,没有独立INODE,指向原始INODE,并且原始INODE的引用计数加1 ,不能在不同分区

编程接口

  1. 文件描述符(系统提供)
  2. 流操作(C库)

万物皆文件

  1. 字符和块设备文件
  2. 管道文件
  3. 用于所有网络协议的套接字(网络设备例外)
  4. 终端

VFS的主要数据结构

 

INODE操作:用来操作文件元数据和文件管理,创建文件,删除文件,重命名文件,创建链接

文件操作:用来操作数据的,如读写文件,操作文件位置,创建内存映射

 

struct inode {
        umode_t                i_mode;                   //访问权限
        unsigned short                i_opflags;
        kuid_t                        i_uid;                      //文件的创建用户UID
        kgid_t                        i_gid;                      //文件的创建用户GID
        unsigned int                i_flags;

#ifdef CONFIG_FS_POSIX_ACL
        struct posix_acl        *i_acl;
        struct posix_acl        *i_default_acl;
#endif

const struct inode_operations        *i_op;                                    //指向文件内容相关操作集合(C++对象方法指针)
        struct super_block        *i_sb;                                                  //文件所在的分区的超级块
        struct address_space        *i_mapping;                          //文件内存映射

#ifdef CONFIG_SECURITY
        void                        *i_security;
#endif

/* Stat data, not accessed from path walking */
        unsigned long                i_ino;                                            //INDOD的编号
        /*
         * Filesystems may only read i_nlink directly.  They shall use the
         * following functions for modification:
         *
         *    (set|clear|inc|drop)_nlink
         *    inode_(inc|dec)_link_count
         */
        union {
                const unsigned int i_nlink;                            //文件的硬链接数

                unsigned int __i_nlink;
        };
        dev_t                        i_rdev;                                        //指向存储的真实设备(dev_t代表)
        loff_t                        i_size;                                        //文件大小(以字节为单位)
        struct timespec                i_atime;                        //访问时间
        struct timespec                i_mtime;                        //修改时间
        struct timespec                i_ctime;                        //创建时间
        spinlock_t                i_lock;        /* i_blocks, i_bytes, maybe i_size */
        unsigned short        i_bytes;

        unsigned int                i_blkbits;
        blkcnt_t                i_blocks;                                      //文件大小(以块为单位,块的对应的字节数由文件系统格式化时指定)

#ifdef __NEED_I_SIZE_ORDERED
        seqcount_t                i_size_seqcount;
#endif

/* Misc */
        unsigned long                i_state;
        struct mutex                i_mutex;

        unsigned long                dirtied_when;        /* jiffies of first dirtying */
        unsigned long                dirtied_time_when;

        struct hlist_node        i_hash;                                                  //全局inode_hashtable的链接元素
        struct list_head        i_wb_list;        /* backing dev IO list */
        struct list_head        i_lru;                /* inode LRU list */
        struct list_head        i_sb_list;
        union {
                struct hlist_head        i_dentry;                               //包含的目录项(如果这个inode代表的是一个目录)
                struct rcu_head                i_rcu;
        };
        u64                        i_version;
        atomic_t                i_count;                                                //同时引用的进程数

        atomic_t                i_dio_count;
        atomic_t                i_writecount;
#ifdef CONFIG_IMA
        atomic_t                i_readcount; /* struct files open RO */
#endif
        const struct file_operations        *i_fop;        /* former ->i_op->default_file_ops */  //指向文件管理相关操作集合(C++对象方法指针)
        struct file_lock_context        *i_flctx;
        struct address_space        i_data;
        struct list_head        i_devices;                                               //用于特定设备同时对应多个inode文件时(chroot时)
        union {
                struct pipe_inode_info        *i_pipe;                      //用于指向管道数据结构
                struct block_device        *i_bdev;                                     //用于指向块设备专用数据结构
                struct cdev                *i_cdev;                                     //用于指向字符设备专用数据结构
        };

__u32                        i_generation;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值