转载:https://blog.csdn.net/qq_34501940/article/details/51192257
dentry
dentry是一个内存实体,其中的d_inode成员指向对应的inode

struct dentry {atomic_t d_count;struct inode * d_inode; //指向一个inode结构。这个inode和dentry共同描述了一个普通文件或者目录文件struct dentry * d_parent; //父目录的目录项对象struct list_head d_hash; //链接到dentry cache的hash链表。
struct list_head d_lru; //未使用链表的指针struct list_head d_child;//dentry自身的链表头,需要链接到父dentry的d_subdirs成员struct list_head d_subdirs;//项(子项可能是目录,也可能是文件)的链表头,所有的子项都要链接到这个链表int d_mounted;// 指示dentry是否是一个挂载点。如果是挂载点,该成员不为零。struct qstr d_name;// 成员保存的是文件或者目录的名字。打开一个文件的时候,根据这个成员和用户输入的名字比较来搜寻目标文件
...};

当移动文件的时候,需要把一个dentry结构从旧的父dentry的链表上脱离,然后链接到新的父dentry的d_subdirs成员。这样dentry结构之间就构成了一颗目录树
每个dentry都有一个指向其父目录的指针(d_parent),一个子dentry的哈希列表(d_child)。其中,子dentry基本上就是目录中的文件

dentry状态:
1.d_count=0,未使用(unused)状态,d_inode指向相关的的索引节点。该目录项仍然包含有效的信息,只是当前没有人引用他。这种dentry对象在回收内存时可能会被释放。
2.d_count>0,正在使用(inuse)状态,d_inode指向相关的inode对象。这种dentry对象不能被释放。
3.d_count<0,y负(negative)状态,inode对象不复存在可能被删除,dentry对象的d_inode指针为NULL。但这种dentry对象仍然保存在dcache中,以便后续对同一文件名的查找能够快速完成。这种dentry对象在回收内存时将首先被释放。

dentry与dentry_cache
  dentry_cache(dcache,目录项高速缓存)由两个数据结构组成:
  1、哈希链表dentry_hashtable:dcache中的所有dentry对象都通过d_hash指针域链到相应的dentry哈希链表中。
  2、未使用的dentry对象链表dentry_unused:dcache中所有处于unused状态和negative状态的dentry对象都通过其d_lru指针域链入dentry_unused链表中。该链表也称为LRU链表。
   dcache中的dentry对象控制着icache中的inode对象的生命期转换。无论何时,只要一个目录项对象存在于dcache中(非 negative状态),则相应的inode就将总是存在,因为 inode的引用计数i_count总是大于0。当dcache中的一个dentry被释放时,针对相应inode对象的iput()方法就会被调用

inode(索引节点)
文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读磁盘时会多个扇区组成一个块(block)一起读取,最常见大小为4kb,8个扇区组成一个块。inode储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等。inode对应于物理磁盘上的具体对象,一个inode可以在运行的时候链接多个dentry,d_count记录了这个链接的数量

struct ext3_inode {__le16 i_mode; /* 文件的属性(读、写、执行权限)*/
__le16 i_uid; /* 文件拥有者的User ID */
__le32 i_size; /* 文件的字节数*/
__le32 i_atime; /* atime指文件上一次打开的时间 */
__le32 i_ctime; /* 文件的时间戳ctime指inode上一次变动的时间 */
__le32 i_mtime; /* mtime指文件内容上一次变动的时间 */
__le16 i_gid; /* 文件的Group ID*/
__le16 i_links_count; /* 链接数,即有多少文件名指向这个
inode */
......
__le32 i_block[EXT2_N_BLOCKS];/*文件数据block的位置*/
......
}

可以用stat命令,查看某个文件的inode信息:
stat example.txt

函数得到当前文件或目录的inode值后,进入dcache查找对应的dentry,然后顺着父目录指针d_parent得到父目录的dentry,这样逐级向上直到dentry= root,就得到全部目录名称。

inode的大小
inode会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。
df -i

sudo dumpe2fs -h /dev/hda | grep “Inode size” //查看每个inode节点的大小

inode号码
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
移动文件或重命名文件,只是改变文件名,不影响inode号码。
打开一个文件以后,系统就以inode号码来识别这个文件,而系统无法从inode号码得知文件名。

ls -i a.cpp //查看文件名对应的inode号码

硬链接就是多个文件名指向同一个inode号码。可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。

ln 源文件 目标文件 //创建硬链接

两文件指向同一个inode。d_count加1。删除一个文件名,d_count减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。
创建目录时,默认会生成两个目录项:”.”和”…”。前者的inode号码就是当前目录的inode号码,等同于当前目录的”硬链接”;后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的”硬链接”。所以,任何一个目录的”硬链接”总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的“硬链接”和当前目录下的”.硬链接“。

软连接就像int &a=b,虽然名字不一样,文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。如果删除了文件B,打开文件A就会报错。文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode”链接数”不会因此发生变化。

ln -s 源文文件或目录 目标文件或目录   //创建软链接

open文件

总结:
1、根据文件名,通过Directory里的对应关系,找到文件对应的Inode number
2、再根据Inode number读取到文件的Inode table
3、再根据Inode table中的Pointer读取到相应的Blocks

dentry 和inode相关推荐

  1. Linux那些事儿之我是Sysfs(7)dentry与inode

    我们在进程中要怎样去描述一个文件呢?我们用目录项(dentry)和索引节点(inode).它们的定义如下: include/linux/dcache.h struct dentry { /* RCU ...

  2. dentry与inode

    dentry与inode 首先看dentry数据结构.位于include/linux/dcache.h中 struct dentry ps:dentry虽然是目录的意思,但是在vfs中,目录和文件都有 ...

  3. 【文件】VFS四大struct:file、dentry、inode、super_block 是什么?区别?关系?--编辑中...

    简略 推荐:<VFS.超级块.inode.dentry.file>https://www.itdaan.com/blog/2014/08/31/f99ae6e6e574449076a385 ...

  4. dentry和inode的关系

    vfs 是具体文件系统(如 ext4.nfs.fat)和 Kernel 之间的桥梁,它将各个文件系统抽象出来并提供一个统一的机制来组织和管理各个文件系统,但具体的实现策略则由各个文件系统来实现,这很好 ...

  5. 【操作系统】LinuxKernel-VFS虚拟文件系统 认知框架构建(super_block,inode,dentry,file)

    VFS 概念 虚拟文件系统(也称为虚拟文件系统交换机)是内核中的软件层,为用户空间程序提供文件系统接口.它还在内核中提供了一个抽象,允许不同的文件系统实现共存 "一切皆文件"是Li ...

  6. Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系

    一:文件系统 1. 什么是文件系统? 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统. 通常文件系统是用于存储和组织文件的一种机制,便于对文件进行方便的查找与访问. 文件系统 ...

  7. linux文件系统dentry_文件系统中超级块、inode和dentry三者的分析

    原标题:文件系统中超级块.inode和dentry三者的分析 文件系统是用于存储和组织文件的一种机制,便于对文件进行方便的查找与访问. 而随着文件种类的增多,扩增了更多的文件系统,为了对各种文件系统进 ...

  8. linux 内核 目录项高速缓存 dentry cache 简介

    每个dentry对象都属于下列几种状态之一: (1)未使用(unused)状态:该dentry对象的引用计数d_count的值为0,但其d_inode指针仍然指向相关的的索引节点.该目录项仍然包含有效 ...

  9. kernel部分数据结构列表三(inode)

    kernel部分数据结构列表三(inode) /* *索引节点对象由inode结构体表示,定义文件在linux/fs.h中 */ struct inode {         struct hlist ...

最新文章

  1. ”图书馆助手“典型用户和用户场景
  2. Access和SQL SERVER两种数据库的直接转换,不需要第三方工具
  3. image.helper.php,image.php
  4. JavaScript实现截留雨水问题的蛮力方法的算法(附完整源码)
  5. 记一次无法登录 wine QQ
  6. LINUX下载编译x265
  7. 【水果识别】基于matlab GUI灰度+二值化+腐蚀+膨胀算法水果识别【含Matlab源码 671期】
  8. 用 Java 实现人脸识别功能
  9. 计算机体系结构和计算机组成原理
  10. 偏微分方程数值解主要步骤
  11. win10u盘被写保护怎么解除_教你win10系统中u盘被写保护怎么解除
  12. 计算机核心期刊论文模板,中文核心期刊(论文)模板.doc
  13. 作为一名APP开发者,你更Care什么?
  14. 华为gt3智能跑步计划体验:心率监测、gps轨迹、训练计划
  15. python中numpy数组形状和计算
  16. CCF- CSP 202012-5星际旅行 80分骗分题解
  17. mac的python怎么输入中文_帮你解决mac上python没法输入中文问题
  18. android bsp入门到精通,网管教程:从入门到精通(软件篇).pdf
  19. iOS 整体项目竖屏 相机横屏
  20. 闪银奇异安全负责人:互金行业安全建设的四个心得

热门文章

  1. vue 展开收起的过渡效果
  2. 将archlinux 2013-06-01版,安装配置为个人工作站
  3. phpinfo无法显示
  4. 浏览器自动识别验证码插件
  5. CT和MRI的局限性和克服措施
  6. obsidian 多设备文件同步配置,不需要 iCloud,使用 webdav
  7. Visual C++ Tips: 忽略 LNK4099 警告
  8. php fwrite 错误信息,fwrite错误
  9. 什么是设计?设计的本质是什么
  10. 超声波发射探头的性能评估——水听器