Linux文件编程之虚拟文件系统(VFS)(5)

2>具体文件系统的索引节点是存放在磁盘上的,是一种静态结构,要使用它,必须将其调入内存,填写 VFS的索引节点。VFS索引节点也称为动态节点。(即索引节点仅当文件被方位时才在内存中创建)

3>我们来深入下来看一下它的内核

它的定义在 /include/linux/fs.h中有这个结构体的定义

725struct inode {
 726        struct hlist_node      i_hash;                       //散列表
 727        struct list_head        i_list;                           //索引节点链表
 728        struct list_head        i_sb_list;                    //链接一个文件系统中所有inode的链表

729        struct list_head        i_dentry;                   //目录项链表
 730        unsigned long         i_ino;                          //索引节点号
 731        atomic_t                   i_count;                      //引用计数
 732        unsigned int            i_nlink;                        //硬连接数
 733        uid_t                         i_uid;                          //使用者的id
 734        gid_t                         i_gid;                          //使用组id
 735        dev_t                       i_rdev;                            //实际设备标识符号
 736        unsigned int            i_blkbits;                  
 737        u64                           i_version;                        //版本号
 738        loff_t                         i_size;                               //以字节为单位
 739#ifdef __NEED_I_SIZE_ORDERED
 740        seqcount_t                  i_size_seqcount;    
 741#endif
 742        struct timespec         i_atime;                   //最后访问时间
 743        struct timespec         i_mtime;                  //最后修改时间
 744        struct timespec         i_ctime;                   //最后改变时间
 745        blkcnt_t                     i_blocks;                 //文件的块数
 746        unsigned short         i_bytes;                  //使用的字节数
 747        umode_t                    i_mode;                 //访问权限控制
 748        spinlock_t                 i_lock;                    //自旋锁
 749        struct mutex              i_mutex;               
 750        struct rw_semaphore     i_alloc_sem;               
 751        const struct inode_operations   *i_op;               //索引节点操作表
 752        const struct file_operations    *i_fop;                 //默认的索引节点链表
 753        struct super_block      *i_sb;                              //相关的超级块
 754        struct file_lock        *i_flock;                               //文件锁链表
 755        struct address_space    *i_mapping;               //相关的地址映射
 756        struct address_space    i_data;                        //设备地址映射
 757#ifdef CONFIG_QUOTA
 758        struct dquot            *i_dquot[MAXQUOTAS];  //节点的磁盘限额
 759#endif
 760        struct list_head        i_devices;                  //块设备链表
 761        union {
 762                struct pipe_inode_info  *i_pipe;        //管道信息
 763                struct block_device     *i_bdev;         //块设备驱动
 764                struct cdev             *i_cdev;              
 765        };
 766
 767        __u32                   i_generation;               //索引节点版本号
 768
 769#ifdef CONFIG_FSNOTIFY
 770        __u32                   i_fsnotify_mask; /* all events this inode cares about */
 771        struct hlist_head       i_fsnotify_marks;  
 772#endif
 773
 774        unsigned long           i_state;                  //状态标志
 775        unsigned long           dirtied_when;      //首次修改时间
 776
 777        unsigned int            i_flags;                    //文件系统标志
 778
 779        atomic_t                i_writecount;             //写者计数
 780#ifdef CONFIG_SECURITY
 781        void                    *i_security;                   //安全模块
 782#endif
 783#ifdef CONFIG_FS_POSIX_ACL
 784        struct posix_acl        *i_acl;
 785        struct posix_acl        *i_default_acl;
 786#endif
 787        void                    *i_private; /* fs or device private pointer */
 788};
在我们看完这段代码后,是不是发现在上面被紫色标记的一些信息我们都很熟悉,还记的我们在终端下输入命令:ls 命令后可以看到文件的信息,这些信息就是记录在这里的。

这是为什么呢?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwszjs.html