免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5800 | 回复: 11
打印 上一主题 下一主题

[文件系统] 请问:linux内核中结构体dentry与inode的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-01 10:28 |只看该作者 |倒序浏览
我在看内核时,对这两个结构体有些不明白,
请问:是每个文件都有结构体dentry与inode呢,
还是只有目录有?如何通过一个结构得到另一个结构,
就是说能否由dentry得到inode,或由inode得到dentry?

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
2 [报告]
发表于 2013-11-01 10:39 |只看该作者
回复 1# netdoger

inode代表物理视角,同一个 inode代表的是物理上同一个文件,目录

dentry代表的是进程视角,是站在进程的名字空间角度看待文件和目录。

同样的文件,目录,可能映射到同一个进程的不同 dentry上去,比如硬链接

同样的文件,目录,可能映射到不同 dentry上去,比如 进程调用chroot


   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
3 [报告]
发表于 2013-11-01 11:53 |只看该作者
netdoger 发表于 2013-11-01 10:28
我在看内核时,对这两个结构体有些不明白,
请问:是每个文件都有结构体dentry与inode呢,
还是只有目录有 ...

文件和目录都有,inode和dentry结构中有互相引用的指针。

论坛徽章:
0
4 [报告]
发表于 2013-11-01 15:23 |只看该作者
inode代表物理视角,同一个 inode代表的是物理上同一个文件,目录
dentry代表的是进程视角,是站在进程的名字空间角度看待文件和目录。
==============
那是不是说任何文件都有inode,而同时只有把文件调入内存才有dentry?

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
5 [报告]
发表于 2013-11-01 16:33 |只看该作者
回复 1# netdoger

同样的文件,目录,可能映射到同一个进程的不同 dentry上去,比如硬链接

同样的文件,目录,可能映射到不同 dentry上去,比如 进程调用chroot


这里的描述有问题,应该是

同一个物理文件或目录,可以映射到同一个进程的不同 dentry上去,比如硬链接

同一个路径名代表的文件或目录,不一定映射到相同的 dentry上去,比如进程调用 chroot前与调用后, /就会映射到不同的 dentry上去。


   

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
6 [报告]
发表于 2013-11-01 16:33 |只看该作者
回复 4# netdoger

而inode是代表实际的文件,目录。但只有当内核对某个文件或目录感兴趣时,才从icache中创建 inode。

   

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
7 [报告]
发表于 2013-11-01 16:55 |只看该作者
每个文件都有一个inode,并且至少有一个dentry。

inode代表真实的文件,dentry代表真实的文件在目录中的镜像。

如果一个文件被硬链接了多份,则会有多个dentry,但只有一个inode。

文件访问过程中,通过各级目录达到最后一级目录,根据文件名,获得dentry,通过dentry获得inode。

目录也有inode,但只能有一个dentry,因为目录不支持硬链接。

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
8 [报告]
发表于 2013-11-01 16:59 |只看该作者
本帖最后由 asuka2001 于 2013-11-01 17:00 编辑

LS解释的赞!

   

论坛徽章:
0
9 [报告]
发表于 2013-11-01 17:38 |只看该作者
inode代表真实的文件,dentry代表真实的文件在目录中的镜像。
=================
可是inode结构中没有文件名,dentry中只有目录名

文件访问过程中,通过各级目录达到最后一级目录,根据文件名,获得dentry,通过dentry获得inode。
====================
dentry中只有目录名,怎么根据文件名,获得dentry?用什么内核API?
通过dentry应该获得的是目录的inode吧,如何获得文件的inode?

论坛徽章:
20
CU大牛徽章
日期:2013-04-17 11:48:26羊年新春福章
日期:2015-03-10 22:39:202015年中国系统架构师大会
日期:2015-06-29 16:11:282015亚冠之平阳省
日期:2015-07-31 09:19:042015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-09-30 06:20:002015亚冠之柏太阳神
日期:2015-10-19 20:29:5915-16赛季CBA联赛之天津
日期:2016-11-29 14:03:4315-16赛季CBA联赛之北控
日期:2016-12-24 20:51:492015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-12 20:58:532014年中国系统架构师大会
日期:2014-10-14 15:59:00
10 [报告]
发表于 2013-11-03 09:39 |只看该作者
dentry这个结构体中,不止目录名,还包括本目录的inode信息。内核文件查找过程,先根据文件名,在目录项缓冲区开始查找,如果没有,内核则从根目录开始查找,先查找/目录的目录项dentry,再找到/目录的inode信息,通过inode查找这个目录下所有的目录项,再找到你要的文件对应的目录项,进入这个目录项,找到这个目录项里面的inode号,最后,根据inode号结构体的成员所指向的文件系统块,找到文件内容。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP