下面是来自http://lxr.free-electrons.com/source/include/linux/dcache.h#L150的Linux dentry结构片段。结构包含以下成员结构qstr d_name-definition。我想知道这是否是在运行时与此dentry对应的特定文件的名称。令我困惑的是proc/PID/maps使用struct dentry_operations->d_name(dentry的另一个成员)来生成文件名…那么struct qstr d_name的用途是什么?请注意,我是从纯记忆内省观点(LIVVMI)接近的,因此我将为这些结构“行走记忆”,而使用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's fieldd_name
是维护Dentry命名的一种简单(且主要使用)方法。在这种情况下,文件系统驱动程序需要指定一次dentry的名称,所有其他工作都将由VFS完成。
但在某些情况下,静态分配的名称不足以用于文件系统。正如您所注意到的,这是proc
文件系统的情况,它将每个进程的信息显示到用户空间中。对于这种情况,方法->d_op->d_dname
存在。
实施d_path方法有助于理解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
方法的字段首先被选中。如果不为空,则使用该方法。否则将读取d_name
字段。