关于Linux系统中“目录项”的解释
2013-12-26 16:14
246 查看
每个文件除了有一个索引节点inode数据结构外,还有一个目录项dentry(directory enrty)数据结构。dentry 结构中有个d_inode指针指向相应的inode结构。读者也许会问,既然inode结构和dentry结构都是对文件各方面属性的描述,那为什么不把这两个结构“合而为一”呢?这是因为二者所描述的目标不同,dentry结构代表的是逻辑意义上的文件,所描述的是文件逻辑上的属性,因此,目录项对象在磁盘上并没有对应的映像;而inode结构代表的是物理意义上的文件,记录的是物理上的属性,对于一个具体的文件系统(如Ext2),Ext2_
inode结构在磁盘上就有对应的映像。所以说,一个索引节点对象可能对应多个目录项对象。
dentry 的定义在include/linux/dcache.h中:
下面对dentry结构给出进一步的解释。
一个有效的dentry结构必定有一个inode结构,这是因为一个目录项要么代表着一个文件,要么代表着一个目录,而目录实际上也是文件。所以,只要dentry结构是有效的,则其指针d_inode必定指向一个inode结构。可是,反过来则不然,一个inode却可能对应着不止一个dentry结构;也就是说,一个文件可以有不止一个文件名或路径名。这是因为一个已经建立的文件可以被连接(link)到其他文件名。所以在inode结构中有一个队列i_dentry,凡是代表着同一个文件的所有目录项都通过其dentry结构中的d_alias域挂入相应inode结构中的i_dentry队列。
在内核中有一个哈希表dentry_hashtable ,是一个list_head的指针数组。一旦在内存中建立起一个目录节点的dentry 结构,该dentry结构就通过其d_hash域链入哈希表中的某个队列中。
内核中还有一个队列dentry_unused,凡是已经没有用户(count域为0)使用的dentry结构就通过其d_lru域挂入这个队列。
Dentry结构中除了d_alias 、d_hash、d_lru三个队列外,还有d_vfsmnt、d_child及d_subdir三个队列。其中d_vfsmnt仅在该dentry为一个安装点时才使用。另外,当该目录节点有父目录时,则其dentry结构就通过d_child挂入其父节点的d_subdirs队列中,同时又通过指针d_parent指向其父目录的dentry结构,而它自己各个子目录的dentry结构则挂在其d_subdirs域指向的队列中。
从上面的叙述可以看出,一个文件系统中所有目录项结构或组织为一个哈希表,或组织为一颗树,或按照某种需要组织为一个链表,这将为文件访问和文件路径搜索奠定下良好的基础。
inode结构在磁盘上就有对应的映像。所以说,一个索引节点对象可能对应多个目录项对象。
dentry 的定义在include/linux/dcache.h中:
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; /*未使用的 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; /* 目录项树的根 (即文件的超级块)*/ unsigned long d_vfs_flags; void * d_fsdata; /* 具体文件系统的数据 */ unsigned char d_iname[DNAME_INLINE_LEN]; /* 短文件名 */ };
下面对dentry结构给出进一步的解释。
一个有效的dentry结构必定有一个inode结构,这是因为一个目录项要么代表着一个文件,要么代表着一个目录,而目录实际上也是文件。所以,只要dentry结构是有效的,则其指针d_inode必定指向一个inode结构。可是,反过来则不然,一个inode却可能对应着不止一个dentry结构;也就是说,一个文件可以有不止一个文件名或路径名。这是因为一个已经建立的文件可以被连接(link)到其他文件名。所以在inode结构中有一个队列i_dentry,凡是代表着同一个文件的所有目录项都通过其dentry结构中的d_alias域挂入相应inode结构中的i_dentry队列。
在内核中有一个哈希表dentry_hashtable ,是一个list_head的指针数组。一旦在内存中建立起一个目录节点的dentry 结构,该dentry结构就通过其d_hash域链入哈希表中的某个队列中。
内核中还有一个队列dentry_unused,凡是已经没有用户(count域为0)使用的dentry结构就通过其d_lru域挂入这个队列。
Dentry结构中除了d_alias 、d_hash、d_lru三个队列外,还有d_vfsmnt、d_child及d_subdir三个队列。其中d_vfsmnt仅在该dentry为一个安装点时才使用。另外,当该目录节点有父目录时,则其dentry结构就通过d_child挂入其父节点的d_subdirs队列中,同时又通过指针d_parent指向其父目录的dentry结构,而它自己各个子目录的dentry结构则挂在其d_subdirs域指向的队列中。
从上面的叙述可以看出,一个文件系统中所有目录项结构或组织为一个哈希表,或组织为一颗树,或按照某种需要组织为一个链表,这将为文件访问和文件路径搜索奠定下良好的基础。
相关文章推荐
- 关于Linux系统安装中Swap分区的解释
- 关于linux 文件系统中的目录,目录项,硬链接,符号链接
- Linux常用命令英文全称与中文解释Linux系统
- 关于UBOOT,LINUX内核编译,根文件系统的15个弱智问题(转)
- 关于Linux系统中 Access Modify Change 三个时间的理解
- 关于UNIX和Linux系统下SUID、SGID的解析
- 关于Virtualbox下安装Linux系统
- 关于Linux系统的平均负载最全面介绍
- Linux常用命令英文全称与中文解释Linux系统
- 关于网络安装linux系统(无盘工作站)的一点心得
- 关于Linux系统上 SU命令的几点安全建议
- 新版linux系统设备架构中关于电源管理方式的变更
- 关于给虚拟机Linux系统安装vmware tools工具的细节
- 关于linux下代码获取系统GPU情况
- 关于linux系统内核参数
- 关于Linux系统下内存泄漏的检查方法
- 关于 Linux 系统下的关机命令
- 关于UNIX和Linux系统下SUID、SGID的解析
- 关于linux系统的OOM Killer