集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1256|回复: 1

VFS文件系统结构分析(2)

[复制链接]
辉煌 发表于 2017-6-17 09:23:41 | 显示全部楼层 |阅读模式
                             > ls -i

                              
                                        975311 file1 975312 file2

                       
        接着,根据file1对应的inode号重建inode4,并通过文件数据与inode4重建file1的dentry节点。
        最后,就可以通过inode4节点访问文件了。
        

        注意:文件对应的inode号是确定的,只是inode结构体需要重新构造。
        7 有dentry时定位文件        一旦在Dentry cache中建立了dentry项,下次访问就很方便了。
        Dentry中的一个关键变量是d_subdirs,它保存了下一级目录的列表,用于快速定位文件。
        首先,在代表dir目录的dentry0的d_subdirs中查找名字为“subdir0”的dentry项,找到了dentry1。
        然后在dentry1中查找名字为“file1”的dentry项,然后找到了file1对应的dentry项,
        最后通过file1对应的dentry项获得file1对应的inode4。
        与无dentry项时比较,有dentry项时的操作精简了许多。
        
        8 Symbolic link        建立symboliclink的命令为:ln -s 源文件目标文件
        Linux中的symbolic link类似于Windows系统中的快捷方式。如下图所示,symlink1是指向file1的symbolic link。symlink1本身也是文件,因此有自己独立的inode节点。symlink中实际存储的是源文件的相对路径。
        大部分文件操作会直接对symbolic link指向的目标进行操作,比如open(“symlikn1”),实际上打开的是file3。
        

        如果file3不在会发生什么事情呢?open函数照样会按照symlink1中的文件路径打开文件。但file3不存在,因此会报错说文件不存在。
        

        9 hard link        Linux除了symbolic link,还有hard link的概念。
        Hard link建立实际上是dentry项的一个拷贝,它们都指向同一个inode节点。当我们使用write改写file1的内容时,hardlink1的内容也会被改写,因为所以实际上它们是同一个文件。
        如下图所示,hardlink1是file1的一个hard link。它们都指向同一个inode1节点。Inode1中有一个计数器,用于记录有几个dentry项指向它。删除任意一个dentry项都不会导致inode1的删除。只有所有指向inode1的dentry都被删除了,inode1才会被删除。
        他们实际从某种意义上讲,所有dentry项都是hard link。
        


        10 进程对文件的管理        进程控制块task_struct中有两个变量与文件有关:fs与files。
        files中存储着root与pwd两个指向dentry项的指针。用户定路径时,绝对路径会通过root进行定位;相对路径会的通过pwd进行定位。(一个进程的root不一定是文件系统的根目录。比如ftp进程的根目录不是文件系统的根目录,这样才能保证用户只能访问ftp目录下的内容)
        fs是一个file object列表,其中每一个节点对应着一个被打开了的文件。当进程定位到文件时,会构造一个file object,并通过f_inode关联到inode节点。文件关闭时(close),进程会释放对应对应file object。File object中的f_mode是打开时选择的权限,f_pos为读写位置。当打开同一个文件多次时,每次都会构造一个新的file object。每个file object中有独立的f_mode与f_pos。
        

        11 open的过程        打开文件涉及到里一系列的结构调整,这里分步骤进行说明:
        首先建立一个文件管理结构,如下图所示,该进程已经打开了两个文件,接下来我们再打开一个新文件。
        


        第一步:找到文件;
        从上文中能定位到我们文件的inode节点,找到了inode节点也就找到了文件。
        

        第二步:建立file object;
        建立一个新的file object对象,放入file object对象列表,并把它指向inode节点。
        
zxopenljx 发表于 2021-3-22 09:40:07 | 显示全部楼层
VFS文件系统结构分析(2)
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-29 05:47 , Processed in 0.053397 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表