码迷,mamicode.com
首页 > 其他好文 > 详细

dentry和inode

时间:2017-10-28 13:52:10      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:blank   命名   相同   super   包括   空间   多对一   开始   files   

文件系统在内存中以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

标签:blank   命名   相同   super   包括   空间   多对一   开始   files   

原文地址:http://www.cnblogs.com/lovewisdom/p/7744792.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!