虚拟文件系统

2016-02-19 15:56 3 1 收藏

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享虚拟文件系统吧。

【 tulaoshi.com - 编程语言 】


  Richard Gooch
  翻译:difeijing
  
  本文档中的惯例用法

  ==================
  文档中的每一节标题的右边都有一个字符串"
"。
  每个小节都会有个""在右边。
  这些字符串是为了在文档中查询更轻易而设的。
  
  注重:本文档的最新更新可在下面找到:
  http://www.atnf.csiro.au/~rgooch/Linux/docs/vfs.txt
  
  
  它到底是什么?

  =============
  Virtual File System(或者被称为Virtual Filesystem Switch)是Linux内核中的
  一个软件层,用于给用户空间的程序提供文件系统接口。它也提供了内核中的一
  个抽象功能,答应不同的文件系统共存。
  
  
  
  它的工作方式的概览

  ==================
  在这一节里,在讲解细节问题之前,我会简单扼要的介绍一下VFS是如何工作的。
  首先,介绍一下当用户程序打开或者操作文件时发生了些什么,然后看看一个文
  件系统是如何被支持的。
  
  打开一个文件
  ------------
  VFS实现了open(2)系统调用。路径参数被VFS用来在目录入口缓存(dentry cache
  or "dcache")。这提供了一个将路径名转化为特定的dentry的一个快的查找机制。
  
  一个单独的dentry通常包含一个指向i节点(inode)的指针。i节点存在于磁盘驱动
  器上,它可以是一个规则文件,目录,FIFO文件,等等。Dentry存在于RAM中,并
  且永远不会被存到磁盘上:它们仅仅为了提高系统性能而存在。i节点存在于磁盘
  上,当需要时被拷入内存中,之后对它的任何改变将被写回磁盘。存在于RAM中的
  i节点就是VFS的i节点,dentry所包含的指针指向的就是它。
  
  dcache是你的整个文件空间的观察点。跟Linus不同,我们中的大多数人不可能有
  足够的RAM空间来放我们的文件空间的所有文件的目录入口缓存(dentry),所以我们
  的dcache会有缺少的项。为了将路径名转换为一个dentry,VFS不得不采取创建dentry
  的方式,并在创建dentry时将指针指向相应的i节点。这是通过对i节点的查找完成
  的。
  
  为了查找一个文件的i节点(通常从磁盘上读),VFS需要调用该文件的父目录的lookup()
  方法,此方法是特定的文件系统所设置的。后面对此将会有更详尽的描述。
  
  一旦VFS得到了所需要的dentry(同时也得到了相应的i节点),我们就能够对文件做想
  要的操作:打开文件,或者用stat(2)来看i节点中的数据。stat(2)的操作非常简单:
  在VFS得到dentry之后,它取得inode中的一些数据并将其中的一部分送回用户空间。
  打开一个文件需要其它的操作:分配一个strUCt file(定义于linux/fs.h,这是内核中
  的文件描述)结构。新分配的struct file结构被指向dentry的指针和对文件进行操作的
  函数集合所初始化,这些都是从i节点中得到的。通过这种方式,特定的文件系统实现
  才能起作用。
  
  文件结构(struct file)被放在进程的文件描述符表中。
  
  读,写和关闭文件(或者其它的VFS操作)是通过使用用户空间的文件描述符找到相应的
  文件结构(struct file),然后调用所需要的方法函数来实现的。
  
  当文件处于打开状态时,系统保持相应的dentry为"open"状态(正在使用),这表示相应的
  i节点在被使用。
  
  
  注册和安装一个文件系统
  ----------------------
  假如你想在内核中支持一种新的文件系统的话,你所需要做的仅仅是调用函数
  register_filesystem().你向内核中传递一个描述文件系统实现的结构(struct filesystem
  ),
  此结构将被加入到内核的支持文件系统表中去。你可以运行下面的命令:
  
   % cat /proc/filesystems
  这样可以看到你的系统支持哪些文件系统。
  
  当一个mount请求出现时,VFS将会为特定的文件系统调用相应的方法。安装点的
  dentry结构将会被改为指向新文件系统的根i节点。
  
  现在是看看细节的时候了,nice to look!
  struct file_system_type

  =======================
  此结构描述了文件系统。在内核2.1.99中,此结构的定义如下:
  (注:在2.2的内核中,此结构也没有变化)
  struct file_system_type {
  const char *name;
  int fs_flags;
  struct super_block *(*read_super) (struct super_block *, void *, int);
  struct file_system_type * next;
  };
  
  其中各个域的意义:
  name:文件系统的类型名称,如"vfat","ext2",等等。
  fs_flags:变量标志,如FS_REQUIRES_DEV, FS_NO_DCACHE,等等.
  read_super:当此种文件系统的一个新的实例要被安装时,此方法会被调用。
  next:被内部的VFS实现所使用,你只需要将其初试化为NULL。
  
  函数read_super具有以下的参数:
  struct super_block *sb:超级块结构。此结构的一部分被VFS初始化,余下的部分必须被
  函数read_super初始化。
  void * data:任意的安装选项,通常是ASCII的字符串。
  int silent:表示当出现错误时是否保持安静。(不报警?)
  
  read_super方法必须确定指定的块设备是否包含了一个所支持的文件系统。当成功时返回
  超级块结构的指针,错误时返回NULL。
  
  read_super方法填充进超级块结构(struct super_block)的最有用的域是"s_op"域。这是
  一个指向struct super_operations的指针,此结构描述了文件系统实现的下一层细节。
  
  struct super_operations

  =======================
  此结构描述了VFS对文件系统的超级块所能进行的操作。
  在内核2.1.99中,此结构的定义如下:
  (注:在2.2的内核中,此结构已经有了改变)
  struct super_operations {
  void (*read_inode) (struct inode *);
  void (*write_inode) (struct inode *);
  void (*put_inode) (struct inode *);
  void (*delete_inode) (struct inode *);
  int (*notify_change) (struct dentry *, struct iattr *);
  void (*put_super) (struct super_block *);
  void (*write_super) (struct super_block *);
  int (*statfs) (struct super_block *, struct statfs *, int);
  int (*remount_fs) (struct super_block *, int *, char *);
  void (*clear_inode) (struct inode *);
  };
  
  除非非凡提出,所有的方法都在未加锁的情况下被调用,这意味着大多数方法都可以
  安全的被阻塞。所有的方法都仅仅在进程空间被调用(例如,在中断处理程序和底半
  部中不能调用它们)
  
  read_inode:从一个文件系统中读取一个特定的i节点时调用此方法。i节点中的域"i_ino"
  又VFS初始化为指向所读的i节点,其余的域被此方法所填充。
  
  write_inode:当VFS需要向磁盘上的一个i节点写时调用。
  
  put_inode:当VFS的i节点被从i节点缓冲池移走时被调用。此方法是可选的。
  
  delete_inode:当VFS想删除一个i节点时调用次方法。
  
  notify_change:当VFS的i节点的属性被改变时调用。若此域为NULL则VFS会调用write_inode
  .
  此方法调用时需要锁住内核。
  
  put_super:当VFS要释放超级块时调用(umount一个文件系统).此方法调用时需要锁住内核。
  
  write_super:当VFS超级块需要被写入磁盘时被调用。此方法为可选的。
  
  statfs:当VFS需要得到文件系统的统计数据时调用。此方法调用时需要锁住内核。
  
  remount_fs:当文件系统被重新安装时调用。此方法调用时需要锁住内核。
  
  
  clear_inode:当VFS清除i节点时调用。可选项。
  
  以上方法中,read_inode需要填充"i_op"域,此域为一个指向struct inode_operations
  结构的指针,它描述了能够对一个单独的i节点所能进行的操作。
  
  
  
  struct inode_operations

  =======================
  此结构描述了VFS能够对文件系统的一个i节点所能进行的操作。
  在内核2.1.99中,此结构的定义如下:
  (注:在2.2的内核中,此结构已经有了少许改变)
  struct inode_operations {
  struct file_operations * default_file_ops;
  int (*create) (struct inode *,struct dentry *,int);
  int (*lookup) (struct inode *,struct dentry *);
  int (*link) (struct dentry *,struct inode *,struct dentry *);
  int (*unlink) (struct inode *,struct dentry *);
  int (*symlink) (struct inode *,struct dentry *,const char *);
  int (*mkdir) (struct inode *,struct dentry *,int);
  int (*rmdir) (struct inode *,struct dentry *);
  int (*mknod) (struct

来源:https://www.tulaoshi.com/n/20160219/1610721.html

延伸阅读
使用文件系统控件(DirectoryListBox、DriveListBox和FileListBox) 许多应用程序必须显示关于磁盘驱动器、目录和文件的信息。为使用户能够利用文件系统,VisualBasic提供了两种选择。可以使用由CommonDialog控件提供的标准对话框,或者使用DirListBox、DriveListBox和FileListBox这三种特殊的控件的组合创建自定义对话。 文件...
标签: 服务器
Linux文件系统基本结构   Linux的文件系统结构 Linux文件系统为一个倒转的单根树状结构 文件系统的根为"/" 文件系统严格区分大小写 路径使用/来分割,在windows使用"" 当前工作目录 1 每一个shell或系统进程都有一个当前工作目录 2 使用pwd命令可以显示当前的工作目录 ...
    简介 ReiserFS文件系统是一种新的linux文件系统。它通过一种与众不同的方式--完全平衡树结构来容纳数据, 包括文件数据,文件名以及日志支持,并能在上面继续保持很快的搜索速度和很高的效率。ReiserFS文件系统一直以来被用在高端Unix系统上如,SGI。 ReiserFS是在Hans Reiser和其领导下的开发小组下开发和发展,SuSE ...
标签: PHP
PHP有很多与文件系统相关的函数,不仅可以帮助你打开文件,还可以显示目录内容、移动文件等。很多人甚至使用PHP写出了基于Web的文件管理器。 首先需要提醒一些关于文件路径的东西:在Windows你可以在文件路径中使用斜线/或反斜线\,而其他操作系统仅使用/。出于兼容性考虑,以下实例使用/的表示方法: 下面的简单脚本显示了一...
文件系统控件方案:文件搜索器 应用程序因为用户常常希望快速查找应用程序的可用文件或文件组,所以,许多应用程序都提供查询文件系统的功能。Winseek.vbp 示例应用程序协助用户浏览驱动器和目录并显示所有类型的文件。 下表总结了 WinSeek 应用程序在Seek.frm 窗体中使用的控件。 注意 文件系统控件没有 caption ...

经验教程

156

收藏

75
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部