VFS四大对象之三 struct dentry

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

https://cloud.tencent.com/developer/article/1053852

三、dentry结构体

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

 1 struct dentry {
 2     /* RCU lookup touched fields */
 3     unsigned int d_flags;        /* protected by d_lock */
 4     seqcount_t d_seq;        /* per dentry seqlock */
 5     struct hlist_bl_node d_hash;    /* lookup hash list */
 6     struct dentry *d_parent;    /* parent directory */
 7     struct qstr d_name;
 8     struct inode *d_inode;        /* Where the name belongs to - NULL is
 9                      * negative */
10     unsigned char d_iname[DNAME_INLINE_LEN];    /* small names */
11 
12     /* Ref lookup also touches following */
13     unsigned int d_count;        /* protected by d_lock */
14     spinlock_t d_lock;        /* per dentry lock */
15     const struct dentry_operations *d_op;
16     struct super_block *d_sb;    /* The root of the dentry tree */
17     unsigned long d_time;        /* used by d_revalidate */
18     void *d_fsdata;            /* fs-specific data */
19 
20     struct list_head d_lru;        /* LRU list */
21     /*
22      * d_child and d_rcu can share memory
23      */
24     union {
25         struct list_head d_child;    /* child of parent list */
26          struct rcu_head d_rcu;
27     } d_u;
28     struct list_head d_subdirs;    /* our children */
29     struct list_head d_alias;    /* inode alias list */
30 };

 解释一些字段: 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,上面已经说过两次了。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C/C++基础

Makefile教程

Makefile定义了软件开发过程中,项目工程编译链、链接的方法和规则。 由IDE自动生成或者开发者手动书写。 Unix(MAC OS、Solaris)和Lin...

1002
来自专栏自动化测试实战

Appium+python (3) 异常处理

2845
来自专栏蓝天

crontab使用环境变量

两种方式: 1)直接在crontab中定义变量,如: A=123 * * * * * echo $A > /tmp/a.txt 注意在定义变量时...

571
来自专栏深度学习之tensorflow实战篇

JavaScript 学习一

JavaScript 是 Web 的编程语言。 所有现代的 HTML 页面都使用 JavaScript。 下面是一个基础 <!DOCTYPE html> <...

3314
来自专栏晓晨的专栏

nodejs总结之日志模块log4js

1273
来自专栏Eugene's Blog

php文件包含漏洞分类目录文章标签友情链接联系我们

902
来自专栏ml

ijg库的使用的几点注意

ijg库(http://www.ijg.org/)是用于处理jpeg解码和压缩的库,最新版本为2014发布的版本,可以在官网中下载jpegsr9a.zip 使用...

3215
来自专栏Django中文社区

Django Pagination 完善分页

在 Django Pagination 简单分页 中,我们实现了一个简单的分页导航效果。但效果有点差强人意,我们只能点上一页和下一页的按钮进行翻页。比较完善的分...

2845
来自专栏JavaQ

细说MySQL区分字母大小写

在Linux系统上使用MySQL,MySQL是区分字母大小写的,例如建A表时表名是大写的A,修改A表时脚本里写的a,就会报错表a不存在。在MySQL中,数据库对...

2905
来自专栏JetpropelledSnake

Python入门之Python引用模块和查找模块路径

#这篇文章主要介绍了Python引用模块和Python查找模块路径的相关资料,需要的朋友可以参考下 模块间相互独立相互引用是任何一种编程语言的基础能力。对于“模...

3079

扫描关注云+社区