VFS四大对象之三 struct dentry

继上一篇文章介绍了inode结构体:继续介绍目录项dentry:

http://www.cnblogs.com/linhaostudy/p/7427794.html

三、dentry结构体

目录项:目录项是描述文件的逻辑属性,只存在于内存中,并没有实际对应的磁盘上的描述,更确切的说是存在于内存的目录项缓存,为了提高查找性能而设计。注意不管是文件夹还是最终的文件,都是属于目录项,所有的目录项在一起构成一颗庞大的目录树。例如:open一个文件/home/xxx/yyy.txt,那么/、home、xxx、yyy.txt都是一个目录项,VFS在查找的时候,根据一层一层的目录项找到对应的每个目录项的inode,那么沿着目录项进行操作就可以找到最终的文件。
注意:目录也是一种文件(所以也存在对应的inode)。打开目录,实际上就是打开目录文件。

 struct dentry {
/* RCU lookup touched fields */
unsigned int d_flags; /* protected by d_lock */
seqcount_t d_seq; /* per dentry seqlock */
struct hlist_bl_node d_hash; /* lookup hash list */
struct dentry *d_parent; /* parent directory */
struct qstr d_name;
struct inode *d_inode; /* Where the name belongs to - NULL is
* negative */
unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */ /* Ref lookup also touches following */
unsigned int d_count; /* protected by d_lock */
spinlock_t d_lock; /* per dentry lock */
const struct dentry_operations *d_op;
struct super_block *d_sb; /* The root of the dentry tree */
unsigned long d_time; /* used by d_revalidate */
void *d_fsdata; /* fs-specific data */ struct list_head d_lru; /* LRU list */
/*
* d_child and d_rcu can share memory
*/
union {
struct list_head d_child; /* child of parent list */
struct rcu_head d_rcu;
} d_u;
struct list_head d_subdirs; /* our children */
struct list_head d_alias; /* inode alias list */
};

解释一些字段:
d_count:引用计数

d_flags:目录项缓存标识,可取DCACHE_UNUSED、DCACHE_REFERENCED等

d_inode:与该目录项关联的inode

d_parent:父目录的目录项

d_hash:内核使用dentry_hashtable对dentry进行管理,dentry_hashtable是由list_head组成的链表,一个dentry创建之后,就通过

d_hash链接进入对应的hash值的链表中。

d_lru:最近未使用的目录项的链表

d_child:目录项通过这个加入到父目录的d_subdirs中

d_subdirs:本目录的所有孩子目录链表头

d_alias:一个有效的dentry必然与一个inode关联,但是一个inode可以对应多个dentry,因为一个文件可以被链接到其他文件,所以,这个dentry就是通过这个字段链接到属于自己的inode结构中的i_dentry链表中的。(inode中讲过)

d_mounted:安装在该目录的文件系统的数量!注意一个文件目录下可以有不同的文件系统!

d_name:目录项名称

d_time:重新变为有效的时间!注意只要操作成功这个dentry就是有效的,否则无效。

d_op:目录项操作

d_sb:这个目录项所属的文件系统的超级块

d_vfs_flags:一些标志

d_fsdata:文件系统私有数据

d_iname:存放短的文件名

一些解释:一个有效的dentry结构必定有一个inode结构,这是因为一个目录项要么代表着一个文件,要么代表着一个目录,而目录实际上也是文件。所以,只要dentry结构是有效的,则其指针d_inode必定指向一个inode结构。但是inode却可以对应多个

dentry,上面已经说过两次了。

注意:整个结构其实就是一棵树。

上一篇:用可配置外部工具的编辑器编译与执行java


下一篇:python学习之----BeautifulSoup的find()和findAll()及四大对象