[计算机软件及应用]虚拟文件系统.docVIP

  • 0
  • 0
  • 约3.52万字
  • 约 39页
  • 2018-03-09 发布于浙江
  • 举报
[计算机软件及应用]虚拟文件系统

解析 Linux 中的 VFS 文件系统机制 简介:?总体上说 Linux 下的文件系统主要可分为三大块:一是上层的文件系统的系统调用,二是虚拟文件系统 VFS(Virtual Filesystem Switch),三是挂载到 VFS 中的各实际文件系统。 1. 摘要 2. VFS 概述 VFS 是一种软件机制,与它相关的数据结构只存在于物理内存当中。所以在每次系统初始化期间,Linux 都首先要在内存当中构造一棵 VFS 的目录树(在 Linux 的源代码里称之为 namespace),实际上便是在内存中建立相应的数据结构。在笔者看来,VFS 中的各目录其主要用途是用来提供实际文件系统的挂载点。图 1 是一种可能的目录树在内存中的影像: 3. 文件系统的注册 这里的文件系统是指可能会被挂载到目录树中的各个实际文件系统,所谓实际文件系统,。 3.1 数据结构 在 Linux 源代码中,每种实际的文件系统用以下的数据结构表示: struct file_system_type { const char *name; int fs_flags; struct super_block *(*read_super) (struct super_block *, void *, int); struct module *owner; struct file_system_type * next; struct list_head fs_supers; }; 注册过程实际上将表示各实际文件系统的 struct file_system_type 数据结构的实例化,然后形成一个链表,内核中用一个名为 file_systems 的全局变量来指向该链表的表头。 3.2 注册 rootfs 文件系统 rootfs 的注册是通过 init_rootfs() 这一初始化函数来完成,这意味着 rootfs 的注册过程是 Linux 内核初始化阶段不可分割的一部分。 init_rootfs() 通过调用 register_filesystem(rootfs_fs_type) 函数来完成 rootfs 文件系统注册的,其中rootfs_fs_type 定义如下: struct file_system_type rootfs_fs_type = { \ name: rootfs, \ read_super: ramfs_read_super, \ fs_flags: FS_NOMOUNT|FS_LITTER, \ owner: THIS_MODULE, \ } 注册之后的 file_systems 链表结构如下图2所示: 4. VFS 目录树的建立 本节阐述 Linux 在初始化阶段是如何建立根结点的,即 /目录。这其中会包括挂载 rootfs 文件系统到根目录 / 的具体过程。构造根目录的代码是在 init_mount_tree() 函数 (fs\namespace.c) 中。 首先,init_mount_tree() 函数会调用 do_kern_mount(rootfs, 0, rootfs, NULL) 来挂载前面已经注册了的 rootfs 文件系统。这里我们调用的是 do_kern_mount(),这个函数内部自然会创建我们最关心也是最关键的根目录(在 Linux 中,目录对应的数据结构是 struct dentry)。 在这个场景里,do_kern_mount() 做的工作主要是: 1)调用 alloc_vfsmnt() 函数在内存里申请了一块该类型的内存空间(struct vfsmount *mnt),并初始化其部分成员变量。 2) 调用 get_sb_nodev() 函数在内存中分配一个超级块结构 (struct super_block) sb,并初始化其部分成员变量,将成员 s_instances 插入到 rootfs 文件系统类型结构中的 fs_supers 指向的双向链表中。 3) 通过 rootfs 文件系统中的 read_super 函数指针调用 ramfs_read_super() 函数。 4) ramfs_read_super() 函数调用 ramfs_get_inode() 在内存中分配了一个 inode 结构 (struct inode) inode,并初始化其部分成员变量,其中比较重要的有 i_op、i_fop 和 i_sb: inode-i_op = ramfs_dir_inode_operations; inode-i_fop = dcache_dir_ops; inode-i_sb = sb;这使得将来通过文件系统调用对 VFS 发起的文件操作等指令将被 rootfs 文件系统中相应的函数

文档评论(0)

1亿VIP精品文档

相关文档