动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息

本月文章推荐
.C++/CLI思辨录之再谈继承.
.螺旋矩阵.
.VC里一些容易混淆的地方.
.[收藏]ASP.Net生成静态HTML页 .
.c++中布尔类型的入门教程.
.C++程序中导出Word文档的简易方法.
.开机密码.
.C语言循环控制语句.
.《c语言程序设计》第九章:预处理.
.用CGI编写WEB查询系统.
.C++初学者应该关心的优秀图书一览.
.C/C++编程新手错误分析.
.C语言图形编程(三、绘图函数-02).
.解析C++中的内部连接与外部连接.
.在CB中如何自定义属性[propertie.
.2000年4月基础知识知识和C语言程.
.利用管道进行进程的通信示例.
.旋转的立体椭球(效果非常好).
.实现LZARI压缩算法的C++类.
.C语言初学者入门讲座 第十讲 函数.

虚拟文件系统

发表日期:2008-3-8 |



  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
上一篇:C++ sizeof 使用规则及陷阱分析 人气:400
下一篇:修正后的“模拟windows 日期/时间 的C程序 人气:390
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-10 企业网站智能管理系统(TZIMS) v6
2008-10-10 拓文asp.net网站内容管理系统 v6
2008-10-10 动网论坛PHP版 v2.0++ Build 081
2008-10-10 免费时代CMS v5.0
2008-10-10 wodig第四季中文DIGG社区 v4.1 b
2008-10-10 老Y文章管理系统 v2.2 bulid 081
2008-10-10 魔法盒动感相册 ASP+SQL版 v2.0
2008-10-10 Asoft签到管理系统 v3.0 Pack1
2008-10-10 哥特人音乐网潮流留言本 v1.1
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号