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

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

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

  2.2.1 超级块对象

  存储一个已安装的文件系统的控制信息,代表一个已安装的文件系统;每次一个实际的文件系统被安装时,内核会从磁盘的特定位置读取一些控制信息来填充内存中的超级块对象。一个安装实例和一个超级块对象一一对应。超级块通过其结构中的一个域s_type记录它所属的文件系统类型。

  根据第三部分追踪源代码的需要,以下是对该超级块结构的部分相关成员域的描述,(如下同):

  清单1. 超级块

struct super_block { //超级块数据结构
    struct list_head s_list;        /*指向超级块链表的指针*/
    ……
    struct file_system_type *s_type;    /*文件系统类型*/
    struct super_operations *s_op;     /*超级块方法*/
    ……
    struct list_head     s_instances;  /*该类型文件系统*/
    ……
};
struct super_operations { //超级块方法
    ……
    //该函数在给定的超级块下创建并初始化一个新的索引节点对象
    struct inode *(*alloc_inode)(struct super_block *sb);
    ……
    //该函数从磁盘上读取索引节点,并动态填充内存中对应的索引节点对象的剩余部分
    void (*read_inode) (struct inode *);
    ……
};

  2.2.2 索引节点对象

  索引节点对象存储了文件的相关信息,代表了存储设备上的一个实际的物理文件。当一个文件首次被访问时,内核会在内存中组装相应的索引节点对象,以便向内核提供对一个文件进行操作时所必需的全部信息;这些信息一部分存储在磁盘特定位置,另外一部分是在加载时动态填充的。

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

正在加载评论...