• VFS四大对象之三 struct dentry


    继上一篇文章介绍了inode结构体:继续介绍目录项dentry:

    http://www.cnblogs.com/linhaostudy/p/7427794.html

    三、dentry结构体

    目录项:目录项是描述文件的逻辑属性,只存在于内存中,并没有实际对应的磁盘上的描述,更确切的说是存在于内存的目录项缓存,为了提高查找性能而设计。注意不管是文件夹还是最终的文件,都是属于目录项,所有的目录项在一起构成一颗庞大的目录树。例如:open一个文件/home/xxx/yyy.txt,那么/、home、xxx、yyy.txt都是一个目录项,VFS在查找的时候,根据一层一层的目录项找到对应的每个目录项的inode,那么沿着目录项进行操作就可以找到最终的文件。
    注意:目录也是一种文件(所以也存在对应的inode)。打开目录,实际上就是打开目录文件。

     1 struct dentry {
     2     /* RCU lookup touched fields */
     3     unsigned int d_flags;        /* protected by d_lock */
     4     seqcount_t d_seq;        /* per dentry seqlock */
     5     struct hlist_bl_node d_hash;    /* lookup hash list */
     6     struct dentry *d_parent;    /* parent directory */
     7     struct qstr d_name;
     8     struct inode *d_inode;        /* Where the name belongs to - NULL is
     9                      * negative */
    10     unsigned char d_iname[DNAME_INLINE_LEN];    /* small names */
    11 
    12     /* Ref lookup also touches following */
    13     unsigned int d_count;        /* protected by d_lock */
    14     spinlock_t d_lock;        /* per dentry lock */
    15     const struct dentry_operations *d_op;
    16     struct super_block *d_sb;    /* The root of the dentry tree */
    17     unsigned long d_time;        /* used by d_revalidate */
    18     void *d_fsdata;            /* fs-specific data */
    19 
    20     struct list_head d_lru;        /* LRU list */
    21     /*
    22      * d_child and d_rcu can share memory
    23      */
    24     union {
    25         struct list_head d_child;    /* child of parent list */
    26          struct rcu_head d_rcu;
    27     } d_u;
    28     struct list_head d_subdirs;    /* our children */
    29     struct list_head d_alias;    /* inode alias list */
    30 };

     解释一些字段:
    d_count:引用计数

    d_flags:目录项缓存标识,可取DCACHE_UNUSED、DCACHE_REFERENCED等

    d_inode:与该目录项关联的inode

    d_parent:父目录的目录项

    d_hash:内核使用dentry_hashtable对dentry进行管理,dentry_hashtable是由list_head组成的链表,一个dentry创建之后,就通过

    d_hash链接进入对应的hash值的链表中。

    d_lru:最近未使用的目录项的链表

    d_child:目录项通过这个加入到父目录的d_subdirs中

    d_subdirs:本目录的所有孩子目录链表头

    d_alias:一个有效的dentry必然与一个inode关联,但是一个inode可以对应多个dentry,因为一个文件可以被链接到其他文件,所以,这个dentry就是通过这个字段链接到属于自己的inode结构中的i_dentry链表中的。(inode中讲过)

    d_mounted:安装在该目录的文件系统的数量!注意一个文件目录下可以有不同的文件系统!

    d_name:目录项名称

    d_time:重新变为有效的时间!注意只要操作成功这个dentry就是有效的,否则无效。

    d_op:目录项操作

    d_sb:这个目录项所属的文件系统的超级块

    d_vfs_flags:一些标志

    d_fsdata:文件系统私有数据

    d_iname:存放短的文件名


    一些解释:一个有效的dentry结构必定有一个inode结构,这是因为一个目录项要么代表着一个文件,要么代表着一个目录,而目录实际上也是文件。所以,只要dentry结构是有效的,则其指针d_inode必定指向一个inode结构。但是inode却可以对应多个

    dentry,上面已经说过两次了。

    注意:整个结构其实就是一棵树。

  • 相关阅读:
    记一次省赛总结
    护网杯一道密码学的感想
    配置phpstudy+phpstorm+xdebug环境
    python 模板注入
    hash扩展攻击本地实验
    kali rolling更新源之gpg和dirmngr问题
    web信息泄露注意事项
    ctf常见php弱类型分析
    文件上传小结
    ctf变量覆盖漏洞
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/7428971.html
Copyright © 2020-2023  润新知