虚拟文件系统

yq1072371660

yq1072371660

2016-02-19 15:56

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

  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
展开更多 50%)
分享

猜你喜欢

虚拟文件系统

编程语言 网络编程
虚拟文件系统

VFS虚拟文件系统

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
VFS虚拟文件系统

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

ReiserFS文件系统

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
ReiserFS文件系统

文件系统控件方案

编程语言 网络编程
文件系统控件方案

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Vista虚拟文件夹探索之旅

windows 操作系统
Vista虚拟文件夹探索之旅

MySQL的文件系统

编程语言 网络编程
MySQL的文件系统

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

一个简单的口令保护程式

一个简单的口令保护程式

人间消失 曾经的天长地久 - QQ图案分组

人间消失 曾经的天长地久 - QQ图案分组
下拉加载更多内容 ↓