【转】Linux那些事儿之我是Sysfs(8)一起散散步-pathwalk - wilso...

来源:百度文库 编辑:神马文学网 时间:2024/04/30 09:58:57

【转】Linux那些事儿之我是Sysfs(8)一起散散步-pathwalk

linux kernel 2009-07-14 16:30:37 阅读83 评论0   字号:大小 订阅

前面说过,只要知道文件的索引节点号,就可以得到那个文件。但是我们在操作文件时,从没听说谁会拿着索引节点号来操作文件,我们只知道文件名而已。它们是如何"和谐"起来的呢?linux把目录也看成一种文件,里面记录着文件名与索引节点号的对应关系。比如在ext3文件系统中,如果文件是一个目录,那么它的内容就是一系列ext3_dir_entry_2的结构


struct ext3_dir_entry_2 {
__u32 inode; /* Inode number */
__u16 rec_len; /* Directory entry length */
__u8 name_len; /* Name length */
__u8 file_type;
char name[EXT3_NAME_LEN]; /* File name */
};


举个例子,比如要打开/home/test/hello.c。首先,找到‘/’,读入其内容,找到名为"home"的文件的索引节点号,打开/home这个 "文件",读入内容,找到名为 "test" 的的文件的索引节点号,同理,再打开文件"/home/test",找到找到名为"hello.c”的文件的索引节点号,最后就得到 /home/test/hello.c了。这就是path_walk()函数的原理。

其中,根据一个文件夹的inode,和一个文件名来获取该文件的inode结构的函数,就叫lookup,它是inode_operations里面的函数。
struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *);
lookup,顾名思义,就是查找,比如查查在test这个文件夹下,有没有叫hello.c的文件,有的话,就从存储介质中读取其inode结构。并用dentry- >d_inode指向它。所以,我们只要知道了文件的路径和名字,总可以从根目录开始,一层一层的往下走,定位到某一个文件。 

superblock与vfsmount

接下来还要介绍两个数据结构,superblock和vfsmount。super_block结构是从所有具体的文件系统所抽象出来的一个结构,每一个文件系统实例都会有一对应super_block结构。比如每一个ext2的分区就有一个super_block结构,它记录了该文件系统实例(分区)的某些描述性的信息,比如该文件系统实例的文件系统类型,有多大,磁盘上每一块的大小, 还有就是super_operations。它与inode,dentry一样,只是某些内容在内存中的映像。就ext2文件系统而言,设备上的超级块为 ext2_super_block。由于sysfs是虚拟的文件系统,独一无二, 并且只能被mount一次,sysfs的super_block结构是sysfs_sb。sysfs_sb也是动态的从内存中生成的。


还有要提一下super_operations,它也算是VFS的一个接口。实现一个文件系统file_operations, dentry_operations, inode_operations, super_operations这四个结构都要实现。

把一个设备安装到一个目录节点时要用一个vfsmount的作为连接件。vfsmount结构定义如下:

struct vfsmount {
              struct list_head mnt_hash;
              struct vfsmount *mnt_parent; /* fs we are mounted on */
              struct dentry *mnt_mountpoint; /* dentry of mountpoint */
              struct dentry *mnt_root; /* root of the mounted tree */
              struct super_block *mnt_sb; /* pointer to superblock */
              ..........
}

对 于某个文件系统实例,内存中super_block和vfsmount都是唯一的。比如,我们将某个挂载硬盘分区mount -t vfat /dev/hda2 /mnt/d。实际上就是新建一个vfsmount结构作为连接件,vfsmount->mnt_sb = /dev/hda2的超级块结构;vfsmount->mntroot = /dev/hda2的"根"目录的dentry;vfsmount->mnt_mountpoint = /mnt/d的dentry; vfsmount->mnt_parent = /mnt/d所属的文件系统的vfsmount。并且把这个新建的vfsmount连入一个全局的hash表mount_hashtable中。

从 而我们就可以从总根’/’开始,沿着dentry往下找。假如碰到一个某个目录的dentry是被mount了的,那么我们就从 mount_hashtable表中去寻找相应的vfsmount结构 (函数是lookup_mnt())。然后我们得到vfsmount ->mnt_root,就可以找到mount在该目录的文件系统的"根"dentry结构。然后又继续往下走,就可以畅通无阻了。

关于path_walk()的代码我就不贴了,太长了。其实懂了原理后再去看,很简单,跟看故事会差不多。我当年就是看完这个函数后,信心倍增阿。pathwalk,不管前面是高速公路,或是泥泞的乡间小路,我们都要走到底。

【转】Linux那些事儿之我是Sysfs(8)一起散散步-pathwalk - wilso... 【转】Linux那些事儿之我是Sysfs(9)sysfs文件系统模型 - wilson的日... [转]Linux那些事儿之我是Sysfs(1)sysfs初探 - wilson的日志 - ... 【转】Linux那些事儿之我是Sysfs(10)sysfs 创建目录 - wilson的日... 【转】Linux那些事儿之我是Sysfs(11)sysfs 创建普通文件 - wilson... 【转】Linux那些事儿之我是Sysfs(12)举例三:sysfs读入文件夹内容 - wi... 【转】Linux那些事儿之我是Sysfs(13)举例四:sysfs读入普通文件内容 - w... 【转】Linux那些事儿之我是Sysfs(7)dentry与inode - wilson的... 【转】Linux那些事儿之我是Sysfs(6)文件系统 - wilson的日志 - 网易博... 【转】Linux那些事儿之我是Sysfs(5)举例二sculld - wilson的日志 ... 【转】Linux那些事儿之我是Sysfs(4)举例一lddbus - wilson的日志 ... [明朝那些事儿]朱元璋传说之二 [转] 60 70年代的那些事儿 书话之八十一:【读书人那些事儿:姑妄言之】 书话之八十一:【读书人那些事儿:姑妄言之2】 书话之八十三:【读书人那些事儿:用爱筑梦】 书话之八十三:【读书人那些事儿:用爱筑梦2】 书话之八十三:【读书人那些事儿:用爱筑梦3】 书话之八十三:【读书人那些事儿:用爱筑梦4】 书话之八十四:【读书人那些事儿:静夜高颂4】 缪侃西游之徒弟们的那些事儿 二小那些事儿 明朝的那些事儿 明朝那些事儿6