从文件 I/O 看 Linux 的虚拟文件系统

http://tech.ddvip.com   2008年04月15日    社区交流

内容摘要:本文在简要介绍 VFS 的相关数据结构后,以文件 I/O 为切入点深入 Linux 内核源代码,追踪了 sys_open 和 sys_read 两个系统调用的代码结构,并在追踪的过程中理清了跨文件系统的文件操作的基本原理和“一切皆是文件”的口号得以实现的根本。

  清单2. 索引节点

struct inode {//索引节点结构
   ……
   struct inode_operations *i_op;   /*索引节点操作表*/
   struct file_operations  *i_fop;   /*该索引节点对应文件的文件操作集*/
   struct super_block    *i_sb;   /*相关的超级块*/
   ……
};
struct inode_operations { //索引节点方法
   ……
   //该函数为dentry对象所对应的文件创建一个新的索引节点,主要是由open()系统调用来调用
   int (*create) (struct inode *,struct dentry *,int, struct nameidata *);
   //在特定目录中寻找dentry对象所对应的索引节点
   struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *);
   ……
};

  2.2.3 目录项对象

  引入目录项的概念主要是出于方便查找文件的目的。一个路径的各个组成部分,不管是目录还是普通的文件,都是一个目录项对象。如,在路径/home/source/test.c中,目录 /, home, source和文件 test.c都对应一个目录项对象。不同于前面的两个对象,目录项对象没有对应的磁盘数据结构,VFS在遍历路径名的过程中现场将它们逐个地解析成目录项对象。

  清单3. 目录项

struct dentry {//目录项结构
   ……
   struct inode *d_inode;      /*相关的索引节点*/
  struct dentry *d_parent;     /*父目录的目录项对象*/
  struct qstr d_name;       /*目录项的名字*/
  ……
   struct list_head d_subdirs;   /*子目录*/
  ……
   struct dentry_operations *d_op; /*目录项操作表*/
  struct super_block *d_sb;    /*文件超级块*/
  ……
};
struct dentry_operations {
  //判断目录项是否有效;
  int (*d_revalidate)(struct dentry *, struct nameidata *);
  //为目录项生成散列值;
  int (*d_hash) (struct dentry *, struct qstr *);
  ……
};

来源:ibm    作者:吴美清    责编:豆豆技术应用

正在加载评论...