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

时间:2015-12-21 19:51:54

标签: c linux kernel

以下是来自http://lxr.free-electrons.com/source/include/linux/dcache.h#L150的Linux dentry结构的片段。该struct包含一个成员struct qstr d_name - 下面的定义。我想知道这是否是在运行时对应于此dentry的特定文件的名称。令我困惑的是proc / PID / maps使用struct dentry_operations - > d_name(dentry的另一个成员)生成文件名...那么waht是struct qstr d_name的目的吗?请注意,我从纯粹的记忆内省观点(libvmi)接近这一点,因此我将成为"走路记忆"对于这些结构和使用C / C ++代码检索并不是那么简单。

   ב-  MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection connection)    ב-  System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection)    ב-  MySql.Data.Entity.MySqlManifestTokenResolver.ResolveManifestToken(DbConnection connection)    ב-  System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest& providerManifest)    ב-  System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)    ב-  System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)    ב-  System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)    ב-  System.Data.Entity.Internal.LazyInternalContext.InitializeContext()    ב-  System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)    ב-  System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()    ב-  System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()   ב-  System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)    ב-  System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)    ב-  System.Data.Entity.DbSet`1.Add(TEntity entity)    ב-  MySqlWithEF.Program.Main(String[] args) ב- C:\Users\X7\Desktop\MyExampls C#\MySqlWithEF\Program.cs:שורה 24    ב-  System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)    ב-  System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)    ב-  Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()    ב-  System.Threading.ThreadHelper.ThreadStart_Context(Object state)    ב-  System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)    ב-  System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)    ב-  System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)    ב-  System.Threading.ThreadHelper.ThreadStart()

1 个答案:

答案 0 :(得分:2)

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

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

d_path方法的实施有助于理解d_named_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字段。