预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10
亲,该文档总共17页,到这已经超出免费预览范围,如果喜欢就直接下载吧~
如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
Linux2.6VFS相关数据结构及说明一.VFS文件系统的主要功能:传统的操作系统仅能支持一种类型的文件系统,随着信息技术的发展和应用需求的增长,迫切要求计算机之间共享网络文件系统。为了能同时支持多种文件系统,不同操作系统采用不同技术方案来提供虚拟文件系统,它要实现以下目标:把多种个文件系统纳入统一框架中,不同的磁盘分区可以包含不同的文件系统,对它们的使用和传统单一文件系统没有区别;用户可以通过同一组系统调用来对不同的文件系统及文件进行操作,更进一步,系统调用可以跨物理介质和跨文件系统执行,如从一个文件系统拷贝或移动数据到另一个文件系统;对网络共享文件提供完全支持,访问远程节点上的文件应与访问本地节点的文件一致;开发出新的文件系统后,可以模块方式加入到操作系统中。VFS是一种软件机制,也许称它为Linux的文件系统管理者更确切点,与它相关的数据结构只存在于物理内存当中。所以在每次系统初始化期间,Linux都首先要在内存当中构造一棵VFS的目录树(在Linux的源代码里称之为namespace),实际上便是在内存中建立相应的数据结构。VFS中的各目录其主要用途是用来提供实际文件系统的挂载点,当然在VFS中也会涉及到文件级的操作。一般地说,VFS提供以下功能:•记录可用的文件系统类型,并对具体文件系统的数据结构进行抽象,以一种统一的数据结构进行管理;•把文件系统与对应的存储设备联系起来;•处理面向文件的通用操作,接受用户层的系统调用,例如write、open、stat、link等等;•涉及具体文件系统的操作时,把它们映射到相关的具体文件系统。•支持多种具体文件系统之间相互访问。•接受内核其他子系统的操作请求,特别是内存管理子系统。整个Linux中文件系统的逻辑关系如图所示:二.文件系统的注册、安装和卸载(1)文件系统的注册Linux支持的文件系统必须注册后才能被安装和使用,文件系统不再使用时则予以注销。一般在编译内核的时侯注册;也可以加载模块的方式手动注册。向内核注册有两种方式:一种是在系统引导时在VFS中注册,在系统关闭时注销;另一种是把文件系统作为内核可装载的模块,在实际安装时进行注册,并在模块卸载时注销。每个文件系统都有一个初始化例程(如intinit_ext2_fs(void)),它的作用就是把注册结构体作为参数,调用内核提供的注册函数regiater_filesystem()在VFS中进行注册(如regiater_filesystem(&ext2_fs_type)),即填写一个叫做file_system_type的数据结构,该结构包含了文件系统的名称以及一个指向对应的VFS超级块读取例程的地址,所有已注册的文件系统的file_system_type结构形成一个链表,为区别后面将要说到的已安装的文件系统形成的另一个链表,我们把这个链表称为注册链表。如图所示就是内核中的file_system_type链表,链表头由file_systems全局变量指定。上图仅示意性地说明系统中已安装注册的三个文件系统Ext2、proc、iso9660其file_system_type结构所形成的链表。当然,系统中实际安装的文件系统要更多。file_system_type的数据结构在fs.h中定义如下:structfile_system_type{constchar*name;//文件系统的类型名intfs_flags;//文件系统的类型标志structsuper_block*(*get_sb)(structfile_system_type*,intchar*,void*,);//读超级块函数指针structmodule*owner;//文件系统模块structfile_system_type*next;//链表中下一个文件系统类型structlist_headfs_supers;//超级块对象链表};对其中几个域的说明如下:fs_flags:指明具体文件系统的一些特性,有关标志定义于fs.h中:/*publicflagsforfile_system_type*/#defineFS_REQUIRES_DEV1#defineFS_NO_DCACHE2/*Onlydcachethenecessarythings.*/#defineFS_NO_PRELIM4/*preventpreloadingofdentries,evenif*FS_NO_DCACHEisnotset.*/#defineFS_SINGLE8/*Filesystemthatcanhaveonlyonesuperblock*/#defineFS_NOMOUNT16/*Nevermountfromuserland*/#d