Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系 (5)

对其中一些重要的结果进行分析:

方法 含义
create()   如果该inode描述一个目录文件,那么当在该目录下创建或打开一个文件时,内核必须为这个文件创建一个inode。VFS通过调用该inode的i_op->create()函数来完成上述新inode的创建。该函数的第一个参数为该目录的 inode,第二个参数为要打开新文件的dentry,第三个参数是对该文件的访问权限。如果该inode描述的是一个普通文件,那么该inode永远都不会调用这个create函数;  
lookup()   查找指定文件的dentry;  
link()   用于在指定目录下创建一个硬链接。这个link函数最终会被系统调用link()调用。该函数的第一个参数是原始文件的dentry,第二个参数即为上述指定目录的inode,第三个参数是链接文件的dentry。  
unlink ()   在某个目录下删除指定的硬链接。这个unlink函数最终会被系统调用unlink()调用。 第一个参数即为上述硬链接所在目录的inode,第二个参数为要删除文件的dentry。  
symlink ()   在某个目录下新建  
mkdir()   在指定的目录下创建一个子目录,当前目录的inode会调用i_op->mkdir()。该函数会被系统调用mkdir()调用。第一个参数即为指定目录的inode,第二个参数为子目录的dentry,第三个参数为子目录权限;  
rmdir ()   从inode所描述的目录中删除一个指定的子目录时,该函数会被系统调用rmdir()最终调用;  
mknod()   在指定的目录下创建一个特殊文件,比如管道、设备文件或套接字等。  
3)目录项(dentry)

目录项是描述文件的逻辑属性,只存在于内存中,并没有实际对应的磁盘上的描述,更确切的说是存在于内存的目录项缓存,为了提高查找性能而设计。

注意不管是文件夹还是最终的文件,都是属于目录项,所有的目录项在一起构成一颗庞大的目录树。

例如:open一个文件/home/xxx/yyy.txt,那么/、home、xxx、yyy.txt都是一个目录项,VFS在查找的时候,根据一层一层的目录项找到对应的每个目录项的inode,那么沿着目录项进行操作就可以找到最终的文件。

注意:目录也是一种文件(所以也存在对应的inode)。打开目录,实际上就是打开目录文件。

108 struct dentry { 109 /* RCU lookup touched fields */ 110 unsigned int d_flags; /* protected by d_lock */ 111 seqcount_t d_seq; /* per dentry seqlock */ 112 struct hlist_bl_node d_hash; /* lookup hash list */ 113 struct dentry *d_parent; /* parent directory 父目录*/ 114 struct qstr d_name; 115 struct inode *d_inode; /* Where the name belongs to - NULL is 116 * negative 与该目录项关联的inode*/ 117 unsigned char d_iname[DNAME_INLINE_LEN]; /* small names 短文件名*/ 118 119 /* Ref lookup also touches following */ 120 struct lockref d_lockref; /* per-dentry lock and refcount */ 121 const struct dentry_operations *d_op; /* 目录项操作 */ 122 struct super_block *d_sb; /* The root of the dentry tree 这个目录项所属的文件系统的超级块(目录项树的根)*/ 123 unsigned long d_time; /* used by d_revalidate 重新生效时间*/ 124 void *d_fsdata; /* fs-specific data 具体文件系统的数据 */ 125 126 struct list_head d_lru; /* LRU list 未使用目录以LRU 算法链接的链表 */ 127 /* 128 * d_child and d_rcu can share memory 129 */ 130 union { 131 struct list_head d_child; /* child of parent list 目录项通过这个加入到父目录的d_subdirs中*/ 132 struct rcu_head d_rcu; 133 } d_u; 134 struct list_head d_subdirs; /* our children 本目录的所有孩子目录链表头 */ 135 struct hlist_node d_alias; /* inode alias list 索引节点别名链表*/ 136 };

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssgzj.html