有关linux文件系统的几个问题
时间:2024-08-22 05:17:07 点击:260

  问题一:如果要找某一个特定的文件,内核如何处理?

  答案:

  (1)在目录项缓存中查找,注意这里是通过哈西函数查找的,而且查找顺序为从右向左。

  e.g.

  处理/usr/src/jiawei.c,会从 jiawei.c 开始向上逐级查找,直到根目录,这样的效率很高。

  (2)如果缓存中没有,那么然后文件系统会从根目录开始找起,逐级查找。

  具体是这样,先找到/目录(根目录)的dentry(目录项),然后会找到它的inode,它的inode会有一项专门记录其下一级的所有 dentry,找到对应的 dentry,再如上述一样接着进行。然后就这样一直找到所要找的文件(注意 linux下面没有目录,因为目录也是文件)。

  问题二:dentry 结构体中的 d_inode 指向的的是哪个 inode?

  答案:

  切记这里指向的是本 dentry 的 inode,而不是下一级的 inode。

  问题三:vfs 中的 dentry 结构体中的 vunsigned 类型?

  答案:

  如下是在网上下载的源码(有我们自己的解释):

  struct dentry {

  atomic_t d_count; //目录项对象使用计数器

  unsigned int d_flags; //目录项标志

  struct inode * d_inode;//与文件名关联的索引节点,从该指针找到 inode,从而找到所要找的文件(应该是这样)

  struct dentry * d_parent;// 父目录的目录项对象

  struct list_head d_hash; //散列表表项的指针

  struct list_head d_lru; //未使用链表的指针

  struct list_head d_child; //父目录中目录项对象的链

  struct list_head d_subdirs;//对目录而言,表示子目录目录项对象的链表

  struct list_head d_alias; //相关索引节点(别名)的链表

  int d_mounted;//对于安装点而言,表示被安装文件系统根项

  struct qstr d_name; //文件名

  unsigned long d_time; /* used by d_revalidate*/

  struct dentry_operations *d_op;// 目录项方法

  struct super_block * d_sb; //文件的超级块对象

  vunsigned long d_vfs_flags;

  void * d_fsdata;//与文件系统相关的数据

  unsigned char d_iname [DNAME_INLINE_LEN]; //存放短文件名

  };

  事实上 kernel 早就不用这个数据类型了,你可以找找最近2.6 版的,找不到了,下面是 2.6.34.4 的 dentry 源码。

  struct dentry {

  atomic_t d_count;

  unsigned int d_flags; /* protected by d_lock */

  spinlock_t d_lock;/* per dentry lock */

  int d_mounted;

  struct inode *d_inode; /* Where the name belongs

  to - NULL is

  * negative */

  /*

  * The next three fields are touched by

  __d_lookup.Place them here

  * so they all fit in a cache line.

  */

  struct hlist_node d_hash;/* lookup hash list */

  struct dentry *d_parent; /* parent directory */

  struct qstr d_name;

  struct list_head d_lru;/* LRU list */

  /*

  * d_child and d_rcu can share memory

  */

  union {

  struct list_head d_child/* child of parent list */

  truct rcu_head d_rcu;

  } d_u;

  struct list_head d_subdirs;/* our children */

  struct list_head d_alias;/* inode alias list */

  unsigned long d_time;/* used by d_revalidate */

  const struct dentry_operations *d_op;

  struct super_block *d_sb;/* The root of the dentry

  tree */

  void *d_fsdata;/* fs-specific data */

  unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /*

  small names */

  };

  以上是我们西邮linux兴趣小组中fs团队讨论的几个问题,现在来给大家说一下我们讨论的结果。如果有异议,希望各位提出来,谢谢!

最新游戏更多

最新软件更多

  • 玩家推荐
  • 游戏攻略

金钼软件下载站 Copyright(C) 2008- 601958.cn All Rights Reserved!

闽ICP备2023004188号| 免责声明