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 条评论
登录 后参与评论

相关文章

来自专栏linux驱动个人学习

VFS四大对象之四-struct file

继上一篇文章: http://yehe.isd.com/column/support-plan/article-edit/93709 四、file结构体 文件对...

3496
来自专栏编程

ThinkPHP3.2和5.0的区别

5.0 版本和之前版本的差异较大,本篇对熟悉3.2 版本的用户给出了一些5.0 的主要区别。 URL和路由 5.0 的URL访问不再支持普通URL 模式,路由也...

1939
来自专栏游戏杂谈

自定义Flex Library的使用

一般为了达到资源或是组件的共用,会用到flex library。在flex library可以添加swf、图片资源或的引用。

642
来自专栏python3

python 文件操作2

Somehow, it seems the love I knew was always the most destructive kind

751
来自专栏烙馅饼喽的技术分享

用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- Demo分析

如何创建工程 下载最新的Unity发布插件包。 打开Unity,新建一个项目 将插件包导入 ? 在菜单中点击ASRuntime/Create ActionScr...

31810
来自专栏岑玉海

hadoop 参数

看《Hadoop:权威指南》的时候收集了书上写的一些需要优化的参数,记录了一下子,给大家分享一下吧。 1.mapred.task.timeout ...

3434
来自专栏Pythonista

python模块和包

一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py 的后缀。

621
来自专栏idba

Python模块之fileinput

一 简介 fileinput 是python 提供的一个可以快速遍历,修改一个或者多个文件的模块。我们可以使用该模块进行文本替换 并做文件备份。

642
来自专栏C/C++基础

C的全缓冲、行缓冲和无缓冲

基于流的操作最终会调用read或者write函数进行I/O操作。为了使程序的运行效率最高,流对象通常会提供缓冲区,以减少调用系统I/O库函数的次数。

522
来自专栏开发与安全

linux系统编程之基础必备(三):文件描述符file descriptor与inode的相关知识

       每个进程在Linux内核中都有一个task_struct结构体来维护进程相关的 信息,称为进程描述符(Process Descriptor),而在...

1986

扫码关注云+社区