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,上面已经说过两次了。
注意:整个结构其实就是一棵树。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Kafka快速上手(2017.9官方翻译)
- 【动手学深度学习笔记】之Pytorch实现线性回归
- 【动手学深度学习笔记】之softmax回归
- 一文全面梳理各种锁机制
- 【动手学深度学习笔记】之图像分类数据集(Fashion-MNIST)
- 探讨缓存行与伪共享
- Stream 流解读
- 3 分钟生成一个单元测试报告,这个样式爱了
- 使用pymouse模块时候报错No module named 'windows'
- GO用内置包写爬虫
- rsyslog详解实战和避坑
- 删除行对MySQL序列有这么多影响?
- 论C++如何优雅的使用数组
- Dubbo如何通过SPI提高框架的可扩展性?
- 你必须熟练使用的30个有用Python代码片段