dentry和inode
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dentry和inode相关的知识,希望对你有一定的参考价值。
文件系统在内存中以inode和dentry的方式展现:inode是底层文件/目录的对象, dentry是一个带有字符串的名称(d_name)的对象,有一个指向inode的指针(d_inode)和指向父dentry(d_parent)的指针
一个典型的树状结构:
/
|
foo
| \
bar bar2
四个inode,分别用于/,foo,bar,bar2.三个dentry,分别用于/->foo, foo->bar, foo->bar2
注意d_inode给出的从dentry到inode的映射都是多对一的映射,单文件在同一个文件系统中可能被多个路径指向(称作"硬链接"),在这种情况下,只要用一个path存在,都不能被删除.
文件和目录可以由进程打开,一个struct file用来表示这个.其包含一个指向目录项的指针,只要有进程打开这个文件,则此底层文件将不会被删除,即使该文件无法通过文件系统内的任何路径获得. (详见这里)
struct file
{
//...
struct path f_path;
#define f_dentry f_path.dentry
//...
}
inode另外还有指向超级块的i_sb指针,一个代表底层文件系统(通常代表存储在本地分区上的物理文件系统或者远程文件系统NFS)的结构
然而,进程看到的命名空间(详见这里)通常由多个而非一个单独的文件系统组成; 多个不同的文件系统在在彼此的顶部安装. 挂载点的结构是由一个vfsmount的结构树构成,每个挂载点一棵
除了父级和子级vfsmount的链接之外,每个vfsmount包括了: mnt_root(一个指向dentry的指针,它是vfsmount的根), mnt_mountpoint(一个指向dentry的指针,这个dentry是vfsmount所挂载上的)
vfsmount和底层文件系统的关系也是多对一;使用mount --bind可以将相同的文件系统挂载在不同的位置.从而导致不同的vfsmount共享相同的dentry,inode和superblock.
以下一条路径:/foo/bar:
1.从task->fs->rootmnt开始,dentry在task->fs->root
2.找到d_name是"foo"的dentry并且其d_parent是/
3.检查有东西挂载在这个dentry上,如果有,替换
4.重复步骤2直到结束
struct task_struct
{
//...
/* Open file information: */
struct file_struct *files;
//...
};
struct fs_struct
{
int users;
rwlock_t lock;
int umask;
int in_exec;
struct path root, pwd;
}
struct namespace //2.6.20之后被拆分到不同的文件里了
{
atomic_t count;
struct vfsmount *root;
struct list_head list;
struct rw_semaphore sem;
}
以上是关于dentry和inode的主要内容,如果未能解决你的问题,请参考以下文章
VFS(虚拟文件系统)中的inode和dentry关系混淆,文件名和inode之间的映射在哪里
文件系统VFS数据结构(超级块 inode dentry file)(收集整理)