JavaEEHTML&JS+前端Python+大数据开发人工智能开发UI/UE设计软件测试新媒体+短视频直播运营产品经理C/C++Linux云计算+运维开发拍摄剪辑+短视频制作PMP项目管理认证电商运营Go语言与区块链大数据PHP工程师iOSAndroid+物联网.NET

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

来源:黑马程序员

浏览37689人

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;        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;        fmode_t                 f_mode;        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                void *private_data;         #ifdef CONFIG_EPOLL                struct list_head f_ep_links;        struct list_head f_tfile_llink;        #endif         struct address_space *f_mapping;        errseq_t f_wb_err;    }    __randomize_layout  __attribute__((aligned(4)));      struct file_handle {      __u32 handle_bytes;      int handle_type;            unsigned char f_handle[0];    };


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


2. inode 结构体

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



  • struct inode {



  •         umode_t                        i_mode;                                                        



  •         unsigned short                i_opflags;                                        



  •         kuid_t                        i_uid;                                                        



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



  •         struct super_block        *i_sb;



  •         struct address_space        *i_mapping;







  • #ifdef CONFIG_SECURITY



  •         void                        *i_security;



  • #endif







  •         



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



  •         struct timespec                i_atime;                                        



  •         struct timespec                i_mtime;                                        



  •         struct timespec                i_ctime;                                        



  •         spinlock_t                i_lock;        



  •         unsigned short          i_bytes;



  •         unsigned int                i_blkbits;



  •         enum rw_hint                i_write_hint;



  •         blkcnt_t                i_blocks;                                                







  • #ifdef __NEED_I_SIZE_ORDERED



  •         seqcount_t                i_size_seqcount;



  • #endif







  •         



  •         unsigned long                i_state;



  •         struct rw_semaphore        i_rwsem;







  •         unsigned long                dirtied_when;        



  •         unsigned long                dirtied_time_when;







  •         struct hlist_node        i_hash;



  •         struct list_head        i_io_list;        



  • #ifdef CONFIG_CGROUP_WRITEBACK



  •         struct bdi_writeback        *i_wb;                







  •         



  •         int                        i_wb_frn_winner;



  •         u16                        i_wb_frn_avg_time;



  •         u16                        i_wb_frn_history;



  • #endif



  •         struct list_head        i_lru;                



  •         struct list_head        i_sb_list;



  •         struct list_head        i_wb_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; 



  • #endif



  •         const struct file_operations        *i_fop;        



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



  •                 struct cdev                *i_cdev;                                



  •                 char                        *i_link;



  •                 unsigned                i_dir_seq;



  •         };







  •         __u32                        i_generation;







  • #ifdef CONFIG_FSNOTIFY



  •         __u32                        i_fsnotify_mask; 



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



  • } __randomize_layout;