当前位置:文档之家› Linux文件系统相关数据结构及相互间的关系案例分析

Linux文件系统相关数据结构及相互间的关系案例分析

文件系统相关数据结构及相互间的关系一.详细关系:1.进程要访问文件,就要首先与文件系统中要访问的文件建立连接,在进程数据结构task_struct中,有两个指针fs和files,一个指向fs_struct数据结构,是关于文件系统的信息;另一个指向files_struct数据结构,是关于已打开文件的信息。

2.fs_struct数据结构中有dentry结构指针,dentry结构中有inode结构指针。

Dentry结构所代表的是逻辑意义上的文件,记录的是其逻辑上的属性,而inode 结构所代表的是物理意义上的文件,记录的是物理上的属性。

它们之间的关系是多对一的关系。

Inode结构中定义union数据结构用于大致反应Linux内核目前所支持的各种文件系统。

2.1.dentry结构中有一个d_inode指针指向相应的inode结构,dentry结构代表的是逻辑意义上的文件,描述文件的逻辑属性,因此目录项在磁盘上并没有对应的映像;而inode结构代表的是物理意义上的文件,记录其物理属性,对与一个具体的文件系统,inode结构在磁盘上有对应的映像。

由此可见,一个索引节点对象可能对应多个目录项对象。

一个有效的dentry结构必定对应一个inode 结构,这是因为一个目录项要么代表一个文件,要么代表一个目录,而目录实际上也是文件。

所以只要dentry结构是有效的,则其指针d_inode必定指向一个inode结构。

反之则不成立,因为一个inode可以对应多个dentry结构,即一个文件可以有不止一个文件名或路径名。

因为一个已经建立的文件可以被链接到其他文件名。

所以inode结构中有一个i_dentry,凡是代表着同一个文件的所有目录项都通过其dentry结构体中的d_alias域挂入相应的inode结构体中的i_dentry队列中。

2.2.inode包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息。

它是linux管理文件系统的最基本单位,也是文件系统连接任何子目录、文件的桥梁。

inode结构中的静态信息取自物理设备上的文件系统,由文件系统指定的函数填写,它只存在于内存中,可以通过inode缓存访问。

虽然每个文件都有相应的inode结点,但是只有在需要的时候系统才会在内存中为其建立相应的inode数据结构,建立的inode结构将形成一个链表,我们可以通过遍历这个链表去得到我们需要的文件结点,VFS也为已分配的inode构造缓存和hash table,以提高系统性能。

inode结构中的struct inode_operations *iop为我们提供了一个inode操作列表,通过这个列表提供的函数我们可以对VFS inode结点进行各种操作。

每个inode结构都有一个i结点号i_ino,在同一个文件系统中每个i结点号是唯一的。

3.在打开文件时,要执行路径名查找。

对于不在目录项高速缓存内的路径名元素,会创建一个新的目录项对象和索引节点对象。

当VFS访问一个Ext2磁盘索引节点时,它会创建一个ext2_inode_info类型的索引节点描述符二.数据结构分析:struct fs_struct {atomic_t count;/* 计数器*/rwlock_t lock;/* 读写锁*/int umask;struct dentry * root, * pwd, * altroot;/* 本进程根目录、进程当前所在目录、替换根目录*/struct vfsmount * rootmnt, * pwdmnt, * altrootmnt;/* 本进程根目录的"安装点"、进程当前所在目录的"安装点"、替换根目录的"安装点" */};struct dentry {atomic_t d_count; /* 目录项对象使用计数器,可以有未使用态,使用态和负状态*/unsigned int d_flags; /* 目录项标志*/struct inode * d_inode; /* 与文件名关联的索引节点*/struct dentry * d_parent; /* 父目录的目录项对象*/struct list_head d_hash; /* 散列表表项的指针*/struct list_head d_lru; /* 未使用链表的指针*/struct list_head d_child; /* 父目录中目录项对象的链表的指针*/struct list_head d_subdirs; /* 对目录而言,表示子目录目录项对象的链表*/struct list_head d_alias; /* 相关索引节点(别名)的链表*/int d_mounted; /* 对于安装点而言,表示被安装文件系统根项*/struct qstr d_name; /* 文件名*/unsigned long d_time; /* 被d_revalidate使用*/struct dentry_operations *d_op; /* 目录项方法*/struct super_block * d_sb; /* 文件的超级块对象*/vunsigned long d_vfs_flags; /* 标志位*/void * d_fsdata; /* 与文件系统相关的数据*/unsigned char d_iname [DNAME_INLINE_LEN]; /* 存放短文件名*/ };struct inode {struct hlist_node i_hash; /* 哈希表*/struct list_head i_list; /* 索引节点链表*/struct list_head i_dentry; /* 目录项链表*/unsigned long 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; /* 以字节为单位的文件大小*/struct timespec i_atime; /* 最后访问时间*/struct timespec i_mtime; /* 最后修改(modify)时间*/ struct timespec i_ctime; /* 最后改变(change)时间*/ unsigned int i_blkbits; /* 以位为单位的块大小*/ unsigned long i_blksize; /* 以字节为单位的块大小*/ unsigned long i_version; /* 版本号*/unsigned long i_blocks; /* 文件的块数*/unsigned short i_bytes; /* 使用的字节数*/spinlock_t i_lock; /* 自旋锁*/struct rw_semaphore i_alloc_sem; /* 索引节点信号量*/ struct inode_operations *i_op; /* 索引节点操作表*/ struct file_operations *i_fop; /* 默认的索引节点操作*/ struct super_block *i_sb; /* 相关的超级块*/struct file_lock *i_flock; /* 文件锁链表*/struct address_space *i_mapping; /* 相关的地址映射*/ struct address_space i_data; /* 设备地址映射*/struct dquot *i_dquot[MAXQUOTAS];/* 节点的磁盘限额*/ struct list_head i_devices; /* 块设备链表*/struct pipe_inode_info *i_pipe; /* 管道信息*/struct block_device *i_bdev; /* 块设备驱动*/unsigned long i_dnotify_mask;/* 目录通知掩码*/struct dnotify_struct *i_dnotify; /* 目录通知*/unsigned long i_state; /* 状态标志*/unsigned long dirtied_when;/* 首次修改时间*/unsigned int i_flags; /* 文件系统标志*/unsigned char i_sock; /* 套接字*/atomic_t i_writecount; /* 写者记数*/void *i_security; /* 安全模块*/__u32 i_generation; /* 索引节点版本号*/union {struct minix_inode_info minix_i;/* minix:迷你版本的类Unix操作系统*/struct ext2_inode_info ext2_i; /* ext2:GNU/Linux 系统中标准的文件系统*/struct hpfs_inode_info hpfs_i;/* hpfs:IBM为PC开发的os/2操作系统所采用的文件系统。

这种格式只用于硬盘,而OS/2所用的软盘则与msdos相同*/struct ntfs_inode_info ntfs_i;/* ntfs:windows NT 的文件系统*/struct msdos_inode_info msdos_i;/* msdos: 微软非NT内核的操作系统,具有只读、系统、隐藏三个属性*/struct umsdos_inode_info umsdos_i;/* umsdos:一种特殊的“文件系统”,用msdos 文件系统来模拟Ext2文件系统。

其好处是可以再磁盘上的DOS分区中直接运行linux,而不需要先重新划分区并格式化,坏处首先是降低了运行的速度,而且这样一来就对DOS文件系统的病毒失去了免疫力*/struct iso_inode_info isofs_i;/* isofs:用于CDROM(光盘)*/struct nfs_inode_info nfs_i;/* nfs:“网络文件系统”NFS */struct sysv_inode_info sysv_i;/* sysv:unix系统V的文件系统S5FS */。

相关主题