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