1. 目录项(dentry)基础概念解析
在Linux文件系统中,目录项(dentry)是连接文件名与inode的关键数据结构。简单来说,当你在终端输入ls /home时,屏幕上显示的每个文件名背后,都对应着一个dentry对象。这个对象不直接存储文件内容,而是作为文件路径与存储数据的inode之间的桥梁。
dentry结构体定义在Linux内核源码的include/linux/dcache.h文件中,主要包含以下核心字段:
d_name:记录文件名(如"document.txt")d_inode:指向对应的inode结构d_parent:指向父目录的dentryd_subdirs:子目录链表头d_count:引用计数器
注意:dentry对象是动态创建的,当首次访问某个路径时,内核会实时构建dentry缓存。例如执行
cat /var/log/syslog时,内核会依次为/、var、log、syslog创建dentry链。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. dentry缓存机制深度剖析
2.1 缓存组织结构
Linux采用哈希表(dentry_hashtable)和LRU链表管理dentry缓存。哈希表实现O(1)时间复杂度的查找,而LRU链表用于缓存回收。具体工作流程如下:
- 计算文件名哈希值:
hash = hash_name(parent_dentry, name) - 在哈希桶中查找:
hlist_bl_for_each_entry(dentry, &dentry_hashtable[hash], d_hash) - 命中缓存时直接返回,否则创建新dentry
2.2 缓存一致性维护
当文件被修改时,内核通过以下机制保证缓存正确性:
- 目录修改通知(DCACHE_DISCONNECTED标志)
- 父目录的d_inode->i_mutex锁保护
- d_flags中的状态标志(如DCACHE_UNHASHED)
实测案例:通过echo 3 > /proc/sys/vm/drop_caches清空dentry缓存后,首次ls操作会明显变慢,因为需要重新构建dentry结构。
