linux VFS中dentry结构解析

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
先看<<understanding the linux kernel>>此书中对dentry,file,process,inode这几个数据结构关系的解析。

进程每打开一个文件,就会有一个file结构与之对应。同一个进程可以多次打开同一个文件而得到多个不同的file结构,file结构描述了被打开文件的属性,读写的偏移指针等等当前信息。

       两个不同的file结构可以对应同一个dentry结构。进程多次打开同一个文件时,对应的只有一个dentry结构。Dentry结构存储目录项和对应文件(inode)的信息。

       在存储介质中,每个文件对应唯一的inode结点,但是,每个文件又可以有多个文件名。即可以通过不同的文件名访问同一个文件。这里多个文件名对应一个文件的关系在数据结构中表示就是dentry和inode的关系。

       Inode中不存储文件的名字,它只存储节点号;而dentry则保存有名字和与其对应的节点号,所以就可以通过不同的dentry访问同一个inode。

       不同的dentry则是同个文件链接(ln命令)来实现的。


dentry

一、dentry的定义

dentry的中文名称是目录项,是Linux文件系统中某个索引节点(inode)的链接。这个索引节点可以是文件,也可以是目录。

二、dentry的结构:以下是dentry的结构体

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; 未使用链表的指针
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; /* used by d_revalidate */
struct dentry_operations *d_op; 目录项方法
struct super_block * d_sb; 文件的超级块对象
vunsigned long d_vfs_flags;
void * d_fsdata;与文件系统相关的数据
unsigned char d_iname [DNAME_INLINE_LEN]; 存放短文件名
};
三、dentry与inode
inode(可理解为ext2 inode)对应于物理磁盘上的具体对象,dentry是一个内存实体,其中的d_inode成员指向对应的inode。也就是说,一个inode可以在运行的时候链接多个dentry,而d_count记录了这个链接的数量。
按照d_count的值,dentry分为以下三种状态:
1、未使用(unused)状态:该dentry对象的引用计数d_count的值为0,但其d_inode指针仍然指向相关的的索引节点。该目录项仍然包含有效的信息,只是当前没有人引用他。这种dentry对象在回收内存时可能会被释放。
2、正在使用(inuse)状态:处于该状态下的dentry对象的引用计数d_count大于0,且其d_inode指向相关的inode对象。这种dentry对象不能被释放。
3、负(negative)状态:与目录项相关的inode对象不复存在(相应的磁盘索引节点 可能已经被删除),dentry对象的d_inode指针为NULL。但这种dentry对象仍然保存在dcache中,以便后续对同一文件名的查找能够 快速完成。这种dentry对象在回收内存时将首先被释放。
四、dentry与dentry_cache
dentry_cache简称dcache,中文名称是目录项高速缓存,是Linux为了提高目录项对象的处理效率而设计的。它主要由两个数据结构组成:
1、哈希链表dentry_hashtable:dcache中的所有dentry对象都通过d_hash指针域链到相应的dentry哈希链表中。
2、未使用的dentry对象链表dentry_unused:dcache中所有处于unused状态和negative状态的dentry对象都通过其d_lru指针域链入dentry_unused链表中。该链表也称为LRU链表。
目录项高速缓存dcache是索引节点缓存icache的主控器(master),也即 dcache中的dentry对象控制着icache中的inode对象的生命期转换。无论何时,只要一个目录项对象存在于dcache中(非 negative状态),则相应的inode就将总是存在,因为 inode的引用计数i_count总是大于0。当dcache中的一个dentry被释放时,针对相应inode对象的iput()方法就会被调用。
五、dentry_operations *d_op
struct dentry_operations {
int (*d_revalidate)(struct dentry *);
int (*d_hash) (struct dentry *, struct qstr *);
int (*d_compare) (struct dentry *, struct qstr *, struct qstr *);
void (*d_delete)(struct dentry *);
void (*d_release)(struct dentry *);
void (*d_iput)(struct dentry *, struct inode *);
};
d_revalidate:用于VFS使一个dentry重新生效。
d_hash:用于VFS向哈希表中加入一个dentry。
d_compare:dentry的最后一个inode被释放时(d_count等于零),此方法被调用,因为这意味这没有inode再使用此dentry;当然,此dentry仍然有效,并且仍然在dcache中。
d_release: 用于清除一个dentry。
d_iput:用于一个dentry释放它的inode(d_count不等于零)
六、d_parent和d_child
每个dentry都有一个指向其父目录的指针(d_parent),一个子dentry的哈希列表(d_child)。其中,子dentry基本上就是目录中的文件。
七、怎样从inode值得到目录名?
函数得到当前文件或目录的inode值后,进入dcache查找对应的dentry,然后顺着父目录指针d_parent得到父目录的dentry,这样逐级向上直到dentry= root,就得到全部目录名称。
Linux 文件系统 inodedentry:从 VFS 到 ext4 的 3 层映射解析 本文深入解析Linux文件系统中inodedentry的核心机制,从VFS抽象层到ext4物理存储的三层映射过程。通过详细剖析inode元数据结构dentry缓存机制及ext4磁盘布局,揭示文件路径解析与数据定位的底层原理,并提供性能优化与故障排查的实用技巧,帮助开发者深入理解操作系统文件管理的关键技术。 阅读详情

相关推荐

Linux·VFS虚拟文件系统

VFS 虚拟文件系统

m0_64560763的博客 841

dentryinode的关系

vfs 是具体文件系统(如 ext4、nfs、fat)和 Kernel 之间的桥梁,它将各个文件系统抽象出来并提供一个统一的机制来组织和管理各个文件系统,但具体的实现策略则由各个文件系统来实现,这很好的屏蔽的各个文件系统的差异,也非常容易扩展,这就是 Linux 著名格言“提供机制而不是策略”的具体实践。vfs 中有两个个很重要的数据结构 dentryinodedentry 就是“目录项”...

jinking01的专栏 5196

Linux VFS实战:从dentry到mount,手把手解析文件系统挂载全流程

本文深入解析Linux虚拟文件系统(VFS)的核心机制,重点探讨dentry缓存与文件系统挂载流程。通过实战案例和调试技巧,帮助开发者理解VFS在性能优化和系统调试中的关键作用,提升Linux文件系统管理能力。

weixin_29284201的博客 192

浅谈 目录项(dentry) 、 inode 、硬链接

浅谈 目录项(dentry) 、 inode 和 硬链接

kite的博客 1232

文件系统中dentryinode的关系

每一个文件都有一个 inode,这个 inode 存储了该文件的所有元数据信息,如文件的创建时间、修改时间、访问时间、文件所有者、文件所属组等。因此,通过 dentry 可以找到对应文件的 inode,进而获取文件的详细信息。例如,当用户创建一个硬链接时,实际上就是创建了一个新的 dentry,但其所指向的 inode 与原始文件的 inode 是相同的。在执行文件操作时,Linux 内核会首先从文件系统中的根目录(/)开始查找目标文件所在的目录,直至定位到目标文件的 inode

HHFQ的博客 1131

vfs四大对象之inodedentry、super_block——基于linux4.18

系统调用open和creat调用create方法来创建普通文件,系统调用link调用link方法来创建硬链接,系统调用symlink调用symlink方法来创建符号链接,系统调用mkdir调用mkdir方法来创建目录,系统调用mknod调用mknod方法来创建字符设备文件、块设备文件、命名管道和套接字。(1)软链接,也称为符号链接,这种文件的数据是另一个文件的路径。(2)目录:目录是一种特殊的文件,这种文件的数据是由目录项组成的,每个目录项存储一个子目录或文件的名称以及对应的索引节点号。

m0_47524163的博客 1978

Linux文件系统 struct dentry 结构解析

Linux文件系统 struct dentry 结构解析,以及一个内核demo:根据inode获取其所有硬链接的文件路径。

小立仔 3237

VFS的数据结构

linux混混之牢骚: 万恶的金钱,有人为你卖儿卖女,有人为你去坐牢。在具有中国特色的社会主义制度下,剥削似乎并没有像《资本论》中所述那样消失,反倒日益的猖獗。富人,是我个人所能理解的,毕竟他们曾付出过。但富人中有一大批富不仁之人,开宝马撞人,砍手.....比比皆是。 是否真的要让富人消灭了穷人才能达到共同富裕的目标,才能使中国富强?这是个问题!linux结构复杂,但靠着大批量的程序员不断的奋战

linux-混混 2573

vfs文件体系结构linux,VFS文件系统结构分析

本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,并注明原作者及原链接。内容可任意使用,但对因使用该内容引起的后果不做任何保证。作者:fireaxe_hq@hotmail.com博客:fireaxe.blog.chinaunix.netVFSLinux非常核心的一个概念,linux下的大部分操作都要用到VFS的相关功能。这里从使用者的角度,对VFS进行了简单...

weixin_30550985的博客 754

Linux 虚拟文件系统(VFS)介绍

1. 通用文件模型Linux内核支持装载不同的文件系统类型,不同的文件系统有各自管理文件的方式。Linux中标准的文件系统为Ext文件系统族,当然,开发者不能为他们使用的每种文件系统采用不同的文件存取方式,这与操作系统作为一种抽象机制背道而驰。为支持各种文件系统,Linux内核在用户进程(或C标准库)和具体的文件系统之间引入了一个抽象层,该抽象层称之为“虚拟文件系统(VFS)”。VFS一方面提供一...

落尘纷扰的专栏 1万+

深入linux内核架构--虚拟文件系统VFS

Linux中,“万物兼文件”,我们知道在linux下面有很多文件系统,如EXT/2/3/4,XFS等,为了很好的支持各种类型的文件系统,Linux抽象了一层虚拟文件系统层,用于更加灵活的适配各种具体的文件系统实现。其基本架构如下: 虚拟文件系统架构 可以看到所有的虚拟文件系统操作都必须在内核态执行,这是由于对于系统存储及外部设备的访问极其复杂,这部分的操作不能交给用户去操作,...

jinking01的专栏 1025

虚拟文件系统VFS

Linux为了支持不同的文件系统而创造了虚拟文件系统,虚拟文件系统更像一个规范(或者说接口),真实的文件系统需要实现虚拟文件系统的规范(接口)才能接入到Linux内核中。在这种情况下,其中的每个进程都使用自己的文件对象,但只需要两个目录项对象,每个硬链接对应一个目录项对象。不同于前面的两个对象,目录项对象没有对应的磁盘数据结构VFS 在遍历路径名的过程中现场将它们逐个地解析成目录项对象。接口来尝试读取超级块信息,因为每种文件系统的超级块都有不同的魔数,用于识别不同的文件系统,所以当调用。

qq_42757463的博客 1213

Linux 文件系统 inodedentry 详解:从 VFS 到 ext4 的 3 层抽象与 1 个实战案例

本文深入解析Linux文件系统中inodedentry的核心机制,从VFS的3层抽象到ext4等文件系统的具体实现。通过实战案例演示如何查看inode信息、优化dentry缓存,并对比ext4、XFS和Btrfs的inode设计差异,帮助开发者深入理解文件系统工作原理与性能调优方法。

weixin_30984001的博客 262

Linux 虚拟文件系统(VFS)深度解析

接下来,我们需要定义超级块操作和 inode 操作。现在,我们实现if (!inode) {// . 目录// .. 目录通过对 Linux 虚拟文件系统(VFS)的深入分析,我们可以清晰地看到 VFS 作为 Linux 内核中文件系统抽象层的核心价值和设计精髓。VFS 不仅实现了"一切皆是文件"的 Unix 哲学,还为多种异构文件系统提供了统一的访问接口,极大地增强了 Linux 操作系统的灵活性和可扩展性。

X 1712

LinuxVFS之美

VFS定义了统一的结构体,提供了统一的函数指针,不同的文件系统只需要提供具体的实现函数,然后挂载到相应的结构体中,类似java中的接口;在VFS的设计中c语言的函数指针和数据指针都体现了非常重要的作用。...

TK_XIEBIN的博客 350

Linux VFS 深度剖析(二):目录项缓存 dentry

本文基于 Linux 4.19 内核源码,深入剖析了 VFS 中的目录项缓存(dentry)机制。dentry 作为路径解析的核心数据结构,负责缓存路径名到 inode 的映射关系,加速文件访问。文章详细分析了 struct dentry 的组成结构,包括文件名存储、目录树关联、引用计数等关键字段,并解释了 dentryinode 的多对一关系。通过示意图展示了 dcache 在 VFS 路径解析中的作用,以及短文件名优化、负缓存等特性。最后还介绍了 dentry 的状态转换和 LRU 回收机制。

siny_hj的博客 461
下一篇: iget iput bmap 函数介绍
JuliusRyan
博客等级 码龄19年 4粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值