免费注册 查看新帖 |

Chinaunix

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

[内核入门] /1/../2/file是如何一步步找到文件的? [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-10-25 19:00 |只看该作者 |倒序浏览
/*
* 程序要访问某个目录/文件(目录是特殊的文件)时,要根据设备上存储的xx_dentry、xx_inode,在内存建立dentry、inode结构
* 比如访问/1/../2/file(先不考虑缓存):
* ① 得到"/"目录的dentry,根据"/"目录dentry->inode->i_block[]磁盘索引读取"/"目录内容
* ② 根据①得到的内容,得到"1"目录的dentry,根据"1"目录dentry->inode->i_block[]磁盘索引读取"1"目录内容
* ③ 从"1"目录返回到上一层,回到"1"目录
* ④ 根据①得到的内容,得到"2"目录的dentry,根据"2"目录dentry->inode->i_block[]磁盘索引读取"2"目录内容
* ⑤ 根据④得到的内容,得到"file"文件的dentry,根据"file"文件dentry->inode->i_block[]磁盘索引读取"file"文件内容
*
* 注意:dentry被翻译为“目录项”,但它跟通常所说的目录(比如1、2)没有任何关系,而且对于文件系统来说,目录也是文件,只不过它存的是子目录或文件的dentry,而文件存的是电脑用户真正需要的数据
*
* 通过①②③④⑤可以看出来,除了"/"目录的dentry,其它目录的dentry都是从上层目录的内容中找到的,因为"/"目录没有上一层了,所以"/"目录的dentry由内核启动时构造,并在创建进程时,赋到进程的task_struct结构里面
* task_struct结构里面,除了记录了当前进程的根目录(root/altroot),还记录了当前目录,一般启动进程时所在的目录就是进程的当前目录,进程如果调用了chdir(),当前目录就可能被改掉
*
* path_init()正是根据name是绝对路径还是相对路径,将起点dentry确定为root/altroot或pwd
* 另外,vfsmount结构用于挂载,如果将一个设备(比如U盘)挂载到一个目录(比如/mnt/u),访问/mnt/u,就等同于访问U盘中的文件系统的"/"目录
*
* 刚接触“挂载”这个东西时,可能会觉得有点糊涂,比如mount /dev/sda1 /mnt/u,将u盘设备(/dev/sda1)挂载到目标目录(/mnt/u),访问/mnt/u就可以访问到u盘里存的文件了(比如好多种子文件),那么访问/dev/sda1得到的是什么呢?
* /dev/sda1存的只是设备号,用于指示VFS选择相应的文件驱动将真正的文件系统“加载”进来,具体“加载”到哪里,就用户执行mount命令时自由选择,不过windows以及一些Linux桌面系统会自动挂载(暂时不理解没关系,可以看一下这篇文章:http://bbs.chinaunix.net/thread-4255337-1-1.html
*/


/*
* 经过path_init()函数,nd就已经包含万里长征的起点,就可以交给path_walk()以"/"为分割,依次得到下一个dentry,从而得到最终文件的dentry或中途失败
* 这个函数稍微有点巨大,可以先忽略一些细节,看懂关键部分再回头详见读一遍
*/


/*
* 值得说明的是path_walk()中调用的do_follow_link(),属于VFS层面的函数,最终会调用到具体驱动的相关函数,比如ext2_follow_link()
* 而ext2_follow_link()函数又会调用VFS层的函数vfs_follow_link()->...->path_walk()
* 这是因为具体文件系统的文件,可以链接到另一种文件系统的文件
*/


/*
* 通过real_lookup()可以感受到VFS向具体驱动的"转移"
*/


/*
* 通过ext2_lookup()最终也可以看到具体驱动向VFS的"转移"
*
* ① 根据文件名,调用ext2_find_entry()函数,从父目录内容中找到当前文件的ext2_dentry信息,并在内存中建立dentry信息
* ② 调用iget()->iget4(),读该文件在磁盘的ext2_inode信息,并建立内存中的inode信息
* ③ 调用d_add()建立与父目录、兄弟目录等之间的关系
*/


/*
* 下面的调用过程看似复杂,实际上理解了dentry结构、inode等VFS层数据结构的设计含义,其实从VFS进入具体文件系统的驱动,以及在驱动函数中做的事,就很容易理解了
* (未完待续)
*/


/*
* 文件的一步步抽象:outb()、out?()→由驱动抽象成block→VFS抽象成缓存/交换页面
* outb()就可以看到最终的out、in汇编指令了
*/
http://bbs.chinaunix.net/thread-4252699-1-1.html


时间仓促,等有空了再完善。

__user_walk_2prime.png (15.83 KB, 下载次数: 22)

__user_walk_2prime.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP