系统是如何根据我们给的路径而找到并读取文件的呢?在网上看到两种截然不同的说法:

1.根据父目录的数据块来读取:
当我们在 Linux 下的 ext2 档案系统建立一个目录时, ext2会分配一个 inode 与至少一块 Block 给该目录。其中,inode 记录该目录的相关属性,并指向分配到的那块 Block ;而 Block 则是记录在这个目录下的相关连的档案(或目录)的关连性!也就是说是根据父目录的block块读取到该目录底下文件/目录的inode信息,进而读取文件内容的。

2.还有另外一种说法则是根据目录的dentry结构来读取的:
假设我们想访问刚才安装的文件系统中的一个文件/mnt/tmp/test,内核需要进行一系列的操作。Linux内核得到了用户想要打开的文件名称后,从根目录“/”开始一级一级的往下查询。

首先,在dentry缓存中查找“mnt”目录项,如果没找到,则说明以前还没有别的用户查找过这个目录项。这时,内核就需要从硬盘上读取mnt这个目录项相应的inode,这就得借助各个文件系统的不同实现来完成这个操作。

通过mnt的父目录即根目录(dentry→d_inode→i_sb)可以找到这个文件系统的super_block,通过super_block的read_inode负责读取相应的inode。同时建立mnt目录相应的dentry并把它加入到dentry缓存中,以备以后的查询使用。

如果找到,则在dentry缓存中继续从mnt目录里查找tmp的目录项。找到tmp这个目录项后,内核会发现在这个目录项上安装了一个文件系统,这时会把当前找到的tmp目录项替换成所安装文件系统的根目录,从这个根目录开始继续查找。这时如果再读取某个文件的inode时,会找到这个新安装的文件系统的super_block,所有查询、读取等inode的操作都会使用这个文件系统的实现。正是通过这种方式,Linux内核实现了多种文件系统的支持。


各位有什么看法,我是比较倾向于第二种说法的。