linux常见文件结构的综合解析

1.1文件结构



struct file结构定义中包括 / / fs.h.the Linux文件结构代表一个打开的文件,并在系统的每个打开的文件在内核空间相关的文件结构,它是由内核时,它打开文件并通过任何函数对文件操作后。文件的所有实例都是封闭的,内核版本的数据结构,在内核中创建和驱动源代码,生成文件的指针通常命名文件或倒装。如下图所示:



文件结构{



联盟{



结构list_head fu_list;文件对象指针链表Linux / / /列表包括Linux。H



结构rcu_head fu_rcuhead;RCU(读复制更新)是Linux 2.6内核的一个新的锁机制



} f_u;



Path f_path;包含dentry和MNT两成员确定文件路径



其中的#成员定义f_dentry f_path.dentry f_path,当前文件的目录项结构



#定义f_vfsmnt f_path.mnt代表安装根目录下的文件系统中的文件当前位置



const struct file_operations * f_op;操作功能与文件相关联的



atomic_t f_count;文件的引用计数(多少个进程打开的文件)



unsigned int f_flags;指定开放的旗帜



mode_t f_mode;读写方式:开放mod_t模式参数



off_t f_pos;当前进程中的文件偏移量



结构fown_struct f_owner;函数的结构是由一个信号通过信号通知数据。



unsigned int f_uid,f_gid;文件所有者ID,所有者组ID



结构file_ra_state f_ra;Linux / / /定义包括Linux FS。h,根据相关文件



无符号长f_version;



# ifdef config_security



void * f_security;



# endif



tty和 / /其他司机需要,也许



void * private_data;



# ifdef config_epoll



FS / eventpoll使用。C连接所有 /钩到这个文件。



结构list_head f_ep_links;



spinlock_t f_ep_lock;



# endif / * * config_epoll # ifdef



结构address_space * f_mapping;



};



1.2 dentry结构



的中文名称都是一个目录条目,一个链接到一个索引节点(inode)在Linux文件系统中,索引节点可以是文件或目录。Inode(可以理解为ext2 inode)对应的物理磁盘上的一个特定的对象,都是一种记忆的实体d_inode成员指出相应的索引节点,一个节点可以连接多个dentry运行时,和d_count记录链接的数量。



dentry结构{



atomic_t d_count;目录项对象使用一个计数器,可以不用,用消极的状态



unsigned int d_flags;目录项



struct inode * d_inode;索引节点的文件名称有关的



dentry结构* d_parent;父目录的目录项对象



结构list_head d_hash;指向哈希表项



结构list_head d_lru;一个未使用的指针链表



结构list_head d_child;父目录中的对象列表的指针



结构list_head d_subdirs;对于一个目录列表表示子目录子目录项的列表



结构list_head d_alias;相关的索引节点链表(化名)



国际d_mounted;安装点,它代表了安装的文件系统的根



结构的构效关系d_name;文件名



无符号长d_time用d_revalidate; / * * /



结构dentry_operations * d_op目录项的方法;



结构super_block * d_sb;文件的超级块对象



vunsigned长d_vfs_flags;



void * d_fsdata到文件系统的相关数据;



unsigned char d_iname { dname_inline_len };商店的短文件名



};



1.3结构files_struct



每一个过程,它包含一个files_struct结构记录的文件描述符的使用,定义在: / / H Linux文件。



结构files_struct



{



atomic_t计数;用表的进程数



fdtable * FDT结构;



结构fdtable fdtab;



spinlock_t file_lock ____cacheline_aligned_in_smp;



国际next_fd;的最后一个文件描述符的最小关闭文件,下一个可用的文件描述符



结构embedded_fd_set close_on_exec_init;文件描述符的初始值,需要关闭exec执行时



结构embedded_fd_set open_fds_init;文件描述符的屏幕的话初始值设定



文件结构* fd_array { nr_open_default };默认打开FD队列



};



结构fdtable {



unsigned int max_fds;



文件结构** FD;指向打开的文件描述符列表的指针,指向fd_array开始。



当超过max_fds,分配地址



fd_set * close_on_exec;执行exec需要关闭文件描述符的位图(fork,exec是不是子进程继承的文件



描述符)



fd_set * open_fds;打开的文件描述符的位图



结构rcu_head RCU;



结构fdtable *下;



};



1.4结构fs_struct



结构fs_struct {



atomic_t计数器计数;



rwlock_t锁;读写锁



Int umask;



dentry结构* * *根,PWD,altroot;根目录(/),当前目录的根目录,并替换



rootmnt结构安装点*,* * pwdmnt,altrootmnt;



};



1.5 struct inode



索引节点对象由inode结构表示,和定义文件在Linux / FS。H.



struct inode {



hlist_node i_hash哈希表结构;



结构list_head i_list;索引节点链表



结构list_head i_dentry;目录项链



无符号长i_ino;节点数



atomic_t i_count;参考号码



umode_t i_mode;访问控制



unsigned int i_nlink;硬链接数



uid_t i_uid;用户ID



gid_t i_gid;用户ID组



kdev_t i_rdev;房设备标识符



loff_t i_size;文件大小的字节数



结构timespec i_atime;最后访问时间



结构timespec i_mtime;最后修改(修改)时间



结构timespec i_ctime;最后的变化(变化)的时间



unsigned int i_blkbits比特块大小;



无符号长i_blksize字节大小的块;



无符号长i_version;版本号



无符号长i_blocks;文件编号



无符号短i_bytes字节的使用数量;



spinlock_t i_lock;自旋锁



结构rw_semaphore i_alloc_sem;索引节点的信号



结构inode_operations * i_op;索引节点操作台



结构file_operations * i_fop;默认的索引节点操作



结构super_block * i_sb;相关的重组



结构file_lock * i_flock文件链表;



结构address_space * i_mapping;相关的地址映射



结构address_space i_data;设备地址映射



* i_dquot maxquotas } {刑法结构;节点的磁盘配额



结构list_head i_devices;块设备清单



结构pipe_inode_info * i_pipe;管线信息



结构block_device * i_bdev;块设备驱动程序



无符号长i_dnotify_mask;目录通知面具



结构dnotify_struct * i_dnotify;目录的通知



无符号长i_state;状态标志



无符号长dirtied_when;第一次修改时间



unsigned int i_flags;文件系统标志



unsigned char i_sock;插座



atomic_t i_writecount;作家的数量



void * i_security;安全模块



__u32 i_generation;索引节点的版本号



联盟{



void * generic_ip文件特殊信息;



} U;



};



我们打开一个文件,在这个过程中,事实上,我们需要建立F的dentry和inode结构在内存中,并与他们的流程结构,并连接定义在VFS接口。让我们在这个经典的一看:



U3000 U3000



下图是通过多个进程打开同一文件的情况:



U3000 U3000

wps_clip_image-5416