C 内核dentry中的qstr结构是否包含Linux文件的文件名?

C 内核dentry中的qstr结构是否包含Linux文件的文件名?,c,linux,kernel,C,Linux,Kernel,下面是来自的LinuxDentry结构的一个片段。该结构包含下面的成员结构qstr d_name-定义。我想知道这是否是运行时与此dentry对应的特定文件的名称。让我困惑的是proc/PID/maps使用struct dentry_operations->d_name(dentry的另一个成员)来生成文件名……那么struct qstr d_name的用途是什么呢?请注意,我是从纯内存内省的角度(libvmi)来处理这个问题的,因此我将是这些结构的“步行内存”,使用C/C++代码进行检索并不是

下面是来自的LinuxDentry结构的一个片段。该结构包含下面的成员结构qstr d_name-定义。我想知道这是否是运行时与此dentry对应的特定文件的名称。让我困惑的是proc/PID/maps使用struct dentry_operations->d_name(dentry的另一个成员)来生成文件名……那么struct qstr d_name的用途是什么呢?请注意,我是从纯内存内省的角度(libvmi)来处理这个问题的,因此我将是这些结构的“步行内存”,使用C/C++代码进行检索并不是那么简单

 struct dentry {

     /* RCU lookup touched fields */
     unsigned int d_flags;           /* protected by d_lock */
     seqcount_t d_seq;               /* per dentry seqlock */
     struct hlist_bl_node d_hash;    /* lookup hash list */
     struct dentry *d_parent;        /* parent directory */
     struct qstr d_name;

              ....

struct qstr {
     union {
             struct {
                      HASH_LEN_DECLARE;
             };
              u64 hash_len;
      };
     const unsigned char *name;
};

Dentry的field
d_name
是维护Dentry命名的一种简单(且常用)方法。在这种情况下,文件系统驱动程序需要指定dentry的名称一次,所有其他工作都将由VFS完成

但在某些情况下,静态分配的名称对于文件系统来说是不够的。正如您所注意到的,
proc
文件系统就是这种情况,它将每个进程的信息展示到用户空间中。对于这种情况,存在方法
->d_op->d_dname

该方法的实现可能有助于理解
d_name
d_op->d_dname

...
if (path->dentry->d_op && path->dentry->d_op->d_dname &&
    (!IS_ROOT(path->dentry) || path->dentry != path->mnt->mnt_root))
        return path->dentry->d_op->d_dname(path->dentry, buf, buflen);
rcu_read_lock();
get_fs_root_rcu(current->fs, &root);
error = path_with_deleted(path, &root, &res, &buflen);
rcu_read_unlock();
...

如您所见,
d_op->d_dname
方法的字段首先被选中。如果不为NULL,则使用该方法。否则将读取
d_name
字段。

Dentry的字段
d_name
是维护Dentry命名的一种简单(且常用)方法。在这种情况下,文件系统驱动程序需要指定dentry的名称一次,所有其他工作都将由VFS完成

但在某些情况下,静态分配的名称对于文件系统来说是不够的。正如您所注意到的,
proc
文件系统就是这种情况,它将每个进程的信息展示到用户空间中。对于这种情况,存在方法
->d_op->d_dname

该方法的实现可能有助于理解
d_name
d_op->d_dname

...
if (path->dentry->d_op && path->dentry->d_op->d_dname &&
    (!IS_ROOT(path->dentry) || path->dentry != path->mnt->mnt_root))
        return path->dentry->d_op->d_dname(path->dentry, buf, buflen);
rcu_read_lock();
get_fs_root_rcu(current->fs, &root);
error = path_with_deleted(path, &root, &res, &buflen);
rcu_read_unlock();
...

如您所见,
d_op->d_dname
方法的字段首先被选中。如果不为NULL,则使用该方法。否则将读取
d\u name
字段。

目的显然是在联合体中添加
hash\u len
信息。目的显然是在联合体中添加
hash\u len
信息。