JavaEE鸿蒙应用开发HTML&JS+前端Python+大数据开发人工智能开发AI+设计软件测试新媒体+短视频直播运营产品经理集成电路应用开发(含嵌入式)Linux云计算+运维开发C/C++拍摄剪辑+短视频制作PMP项目管理认证电商运营Go语言与区块链大数据PHP工程师Android+物联网iOS.NET

【Go语言与区块链】Linux file 结构体和 inode 结构体

来源:黑马程序员

浏览47697人

2019.05.20

在设备驱动程序中,一般需要关心两个结构体:file 和 inode。

1. file 结构体

file 结构体代表一个打开的文件,系统中每个打开的文件在内核空间都有一个关联的 struct file。

它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。

注:在内核和驱动源代码中,struct file 的指针通常被命名为 file 或 filp(即 file pointer)。

struct file {
        union {
           struct llist_node         fu_llist;
           struct rcu_head          fu_rcuhead;
        } 
        f_u;
        struct path               f_path;
        struct inode              *f_inode;/* cached value */
        const struct file_operations      *f_op;/* 和文件关联的操作 */
        /*
         * Protects f_ep_links, f_flags.
         * Must not be taken from IRQ context.
         */
        spinlock_t                f_lock;
        enum rw_hint              f_write_hint;
        atomic_long_t              f_count;
        unsigned int              f_flags;/* 文件标志,如O_RDONLY、O_NONBLOCK、O_SYNC */
        fmode_t                 f_mode;/* 文件读/写模式,FMODE_READ、FMODE_WRITE */
        struct mutex              f_pos_lock;
        loff_t                  f_pos;/* 当前读写位置 */
        struct fown_struct        f_owner;
        const struct cred        *f_cred;
        struct file_ra_state        f_ra;
        u64                f_version;

        #ifdef CONFIG_SECURITY
        void *f_security;
        #endif
        /* needed for tty driver, and maybe others */
        void *private_data; /* 文件私有数据 */
        #ifdef CONFIG_EPOLL
        /* Used by fs/eventpoll.c to link all the hooks to this file */
        struct list_head f_ep_links;
        struct list_head f_tfile_llink;
        #endif /* #ifdef CONFIG_EPOLL */
        struct address_space *f_mapping;
        errseq_t f_wb_err;
    }
    __randomize_layout
  __attribute__((aligned(4)));/* lest something weird decides that 2 is OK */
  
    struct file_handle {
      __u32 handle_bytes;
      int handle_type;
      /* file identifier */
      unsigned char f_handle[0];
    };


文件读/写模式 mode、标志 f_flags 都是设备驱动关心的内容,而私有数据指针 private_data 在设备驱动中被广泛应用,大多被指向设备驱动自定义以用于描述设备的结构体。


2. inode 结构体

VFS inode 包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改事件等信息。它是 Linux 管理文件系统的基本单位,也是文件系统连接任何子目录、文件的桥梁,inode 结构体的定义如下:



  • struct inode {



  •         umode_t                        i_mode;                                                        /* inode的权限 */



  •         unsigned short                i_opflags;                                        



  •         kuid_t                        i_uid;                                                        /* inode拥有者的id */



  •         kgid_t                        i_gid;                                                        /* inode所属的群组id */



  •         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;



  •         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;



  •         /*



  •          * 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;                                                        /* 若是设备文件,此字段将记录设备的设备号 */



  •         loff_t                        i_size;                                                        /* inode所代表的文件大小 */



  •         struct timespec                i_atime;                                        /* inode最近一次的存取时间 */



  •         struct timespec                i_mtime;                                        /* inode最近一次的修改时间 */



  •         struct timespec                i_ctime;                                        /* inode的产生时间 */



  •         spinlock_t                i_lock;        /* i_blocks, i_bytes, maybe i_size */



  •         unsigned short          i_bytes;



  •         unsigned int                i_blkbits;



  •         enum rw_hint                i_write_hint;



  •         blkcnt_t                i_blocks;                                                /* inode所使用的block数,一个block为512字节 */







  • #ifdef __NEED_I_SIZE_ORDERED



  •         seqcount_t                i_size_seqcount;



  • #endif







  •         /* Misc */



  •         unsigned long                i_state;



  •         struct rw_semaphore        i_rwsem;







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



  •         unsigned long                dirtied_time_when;







  •         struct hlist_node        i_hash;



  •         struct list_head        i_io_list;        /* backing dev IO list */



  • #ifdef CONFIG_CGROUP_WRITEBACK



  •         struct bdi_writeback        *i_wb;                /* the associated cgroup wb */







  •         /* foreign inode detection, see wbc_detach_inode() */



  •         int                        i_wb_frn_winner;



  •         u16                        i_wb_frn_avg_time;



  •         u16                        i_wb_frn_history;



  • #endif



  •         struct list_head        i_lru;                /* inode LRU list */



  •         struct list_head        i_sb_list;



  •         struct list_head        i_wb_list;        /* backing dev writeback list */



  •         union {



  •                 struct hlist_head        i_dentry;



  •                 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 */



  •         struct file_lock_context        *i_flctx;



  •         struct address_space        i_data;



  •         struct list_head        i_devices;



  •         union {



  •                 struct pipe_inode_info        *i_pipe;



  •                 struct block_device        *i_bdev;                        /* 若是块设备,为其对应的block_device结构体指针 */



  •                 struct cdev                *i_cdev;                                /* 若是字符设备,为其对应的cdev结构体指针 */



  •                 char                        *i_link;



  •                 unsigned                i_dir_seq;



  •         };







  •         __u32                        i_generation;







  • #ifdef CONFIG_FSNOTIFY



  •         __u32                        i_fsnotify_mask; /* all events this inode cares about */



  •         struct fsnotify_mark_connector __rcu        *i_fsnotify_marks;



  • #endif







  • #if IS_ENABLED(CONFIG_FS_ENCRYPTION)



  •         struct fscrypt_info        *i_crypt_info;



  • #endif







  •         void                        *i_private; /* fs or device private pointer */



  • } __randomize_layout;