一个简单的文件管理系统的实现

一个简单的文件管理系统的实现,第1张

<%

Dim user_name,user_pwd,user_pass,user_sex,user_mail

user_name=Request.Form("user_name")

user_pwd=Request.Form("user_pwd")

user_pass=Request.Form("user_pass")

user_sex=Request.Form("user_sex")

user_mail=Request.Form("user_mail")

If user_sex="unll" then '判断user_sex的值

user_sex=""

Else

user_sex=user_sex

End If

If Len(user_name)=0 Or Len(user_pwd)=0 Then '判断用户密码是否为空

Response.Write("<script language=javascript>alert('注册失败!原因:用户名密码不能为空'),window.location.href='Reg_User.asp?Reg_User=true'</script>")

ElseIf user_pwd<>user_pass Then '判断用户2次输入的密码是否一样

Response.Write("<script language=javascript>alert('注册失败!原因:两次输入密码不一致'),window.location.href='Reg_User.asp?Reg_User=true'</script>")

Else

Set rs=Server.CreateObject("ADODB.RecordSet") '打开数据库

sql="select * from [user] where user_name='"&user_name&"'"

rs.Open sql,myconn,1,3

If rs.BOF And rs.EOF Then '判断数据库是否已有此用户

SqlReg="Insert InTo [user](user_name,user_pwd,user_sex,user_mail) values ('"&user_name&"','"&user_pwd&"','"&user_sex&"','"&user_mail&"')" '通过验证,向数据库插入数据

myconn.execute (SqlReg)

Response.Write("<script language=javascript>alert('注册成功'),window.location.href='index.asp'</script>")

Else

Response.Write("<script language=javascript>alert('注册失败!原因:此用户已存在'),window.location.href='Reg_User.asp?Reg_User=true'</script>")

End If

End If

%>

<%

End If

%>

这是注册的 登录的就简单了 验证下数据库里面有没就OK了

1、文件系统的主要目的是( ).

A,实现对文件的按名存取 B,实现虚拟存储 C,提供外存的读写速度 D,用于存储系统文件 答案-1:A

2、文件系统是指( ).

A,文件的集合 B,文件的目录集合 C,实现文件管理的一组软件 D,文件,管理文件的软件及数据结构的总体答案-2:D

3、文件管理实际上是管理( ).

A,主存空间 B,辅助存储空间 C,逻辑地址空间 D,物理地址空间 答案-2:B

4、下列文件的物理结构中,不利于文件长度动态增长的文件物理结构是( ).

A,顺序文件 B,链接文件 C,索引文件 D,系统文件

下列描述不是文件系统功能的是( ).

A,建立文件目录 B,提供一组文件 *** 作

C,实现对磁盘的驱动调度 D,实现从逻辑文件到物理文件间的转换

文件系统在创建一个文件时,为它建立一个( ).

A,文件目录 B,目录文件

C,逻辑结构 D,逻辑空间

索引式(随机)文件组织的一个主要优点是( ).

A,不需要链接指针 B,能实现物理块的动态分配

C,回收实现比较简单 D,用户存取方便

面向用户的文件组织机构属于( ).

A,虚拟结构 B,实际结构

C,逻辑结构 D,物理结构

按文件用途来分,编译程序是( ).

A,用户文件 B,档案文件

C,系统文件 D,库文件

答案-1:C

将信息加工形成具有保留价值的文件是( ).

A,库文件 B,档案文件

C,系统文件 D,临时文件

答案-1:B

文件目录的主要作用是( ).

A, 按名存取 B, 提高速度

C, 节省空间 D, 提高外存利用率

如果文件系统中有两个文件重名,不应采用( ).

A,一级目录结构 B,树型目录结构

C,二级目录结构 D,A和C

文件系统采用树型目录结构后,对于不同用户的文件,其文件名( ).

A,应该相同 B,应该不同

C,可以不同,也可以相同 D,受系统约束

文件系统采用二级文件目录可以( ).

A,缩短访问存储器的时间 B,实现文件共享

C,节省内存空间 D,解决不同用户间的文件命名冲突

文件代表了计算机系统中的( ).

A,硬件 B,软件

C,软件资源 D,硬件资源

在UNIX系统中,用户程序经过编译之后得到的可执行文件属于( ).

A,ASCII文件 B,普通文件 C,目录文件 D,特别文件

特殊文件是与( )有关的文件.

A,文本 B,图象

C,硬件设备 D,二进制数据

文件的存储方法依赖于( ).

A,文件的物理结构 B,存放文件的存储设备的特性

C,A和B D,文件的逻辑结构

答案-3:C

多级目录结构形式为( ).

A,线形结构 B,散列结构

C,网状结构 D,树型结构

答案-1:D

树型目录结构的主文件目录称为( ).

A,父目录 B,根目录 C,子目录 D,用户文件目录

答案-2:B

树型目录结构的第一级称为目录树的( ).

A,分支节点 B,根节点 C,叶节点 D,终节点

使用绝对路径名访问文件是从( )开始按目录结构访问某个文件.

A,当前目录 B,用户主目录 C,根目录 D,父目录

目录文件所存放的信息是( ).

A,某一文件存放的数据信息

B,某一文件的文件目录

C,该目录中所有数据文件目录

D,该目录中所有子目录文件和数据文件的目录

( )是指有关 *** 作系统和其他系统程序组成的文件.

A,系统文件 B,档案文件

C,用户文件 D,顺序文件

由字符序列组成,文件内的信息不再划分结构,这是指( ).

A,流式文件 B, 记录式文件

C,顺序文件 D,有序文件

AUTOEXEC.BAT文件的逻辑结构形式是( ).

A,字符流式文件 B, 库文件

C,记录式文件 D,只读文件

数据库文件的逻辑结构形式是( ).

A,字符流式文件 B, 档案文件

C,记录式文件 D,只读文件

逻辑文件是( )的文件组织形式.

A,在外部设备上 B,从用户观点看

C,虚拟存储 D,目录

对顺序文件做读文件 *** 作时,总是从( )按顺序读出信息.

A,文件头部向后 B,文件中部开始

C,文件尾部开始 D,当前位置开始

在文件系统中,要求物理块必须连续的物理文件是( ).

A,顺序文件 B,链接文件

C,索引文件 D,多重索引文件

对文件的存取时必须按指针进行,效率较低,采用这种物理结构的是( ).

A,顺序文件 B,链接文件

C,索引文件 D,多重索引文件

答案-2:B

若用户总是要求用随机存取方式查找文件记录,则采用索引结构比采用链接结构( ).

A,麻烦 B,方便 C,一样 D,有时方便有时麻烦

磁盘与主机之间传递数据的单位是( ).

A,柱面 B,磁道 C,数据块 D,记录

答案-2:C

用户归还文件的使用权可以调用的文件 *** 作是( ).

A,建立 B,打开 C,关闭 D,删除

在UNIX系统中,磁盘存储空间空闲块的链接方式是( ).

A,单块链接 B,位示图法 C,顺序结构 D,成组链接

答案-3:D

有一个长度为3000个字节的流式文件要存储在磁盘上,磁盘的每块可以存放512个字节,该文件至少用( )块.

A,5 B,6 C,7 D,3000

答案-3:B

在UNIX系统中,某文件的使用权限设置为754,则表示( ).

A,文件主可读,写,执行 B,同组用户仅能读

C,其他用户可读,写,执行 D,同组用户仅能写

二,是非题(正确的划"√",错误的划"×")

( )1,在文件系统管理中,可以利用串联文件存储结构来实现直接存取.

( )2,可顺序存取的文件不一定能随机存取但可随机存取的文件都可以顺序存取.

( )3,采用数型目录结构的文件系统中,各用户的文件名必须互不相同.

( )4,顺序文件适合于建立在顺序存储设备上,而不适合建立在磁盘上.

( )5,在文件系统的支持下,用户需要知道文件存放的物理地址.

( )6,一般的文件系统都是基于磁盘设备的,而磁带设备可以作为转储设备使用,以提高系统的可靠性.

( )7,在磁盘上的顺序文件中插入新的记录时,必须复制整个文件.

( )8,文件的具体实现是 *** 作系统考虑的范畴,因而用户不必关心.

( )9,随机访问文件也能顺序访问,但一般效率较差.

( )10,UNIX的i节点是文件内容的一部分.

( )11,在UNIX系统中,常采用单空闲块链接法来实施存储空间的分配与回收.

三,填空题

按 *** 作系统中文件的性质与用途分,文件分为:________,________和________.

按保护级别分类,文件可分为________,________和________.

在UNIX系统中,文件分为________,________和________.

按文件的逻辑存储结构分,文件分为有结构文件,又称为_ ______和无结构文件,又称________.

用户对文件的基本 *** 作时,涉及的系统调用主要是文件的: , ,

, , 和 .

文件系统为每个文件另建立一张指示逻辑记录和物理块之间的对应表,由此表和文件本身构成的文件是________.

文件的结构就是文件的物理组织形式,从用户观点出发所看到的文件组织形式称为文件的________,从实际观点出发,文件在外存上存放的组织形式称为文件的________.

UNIX文件系统对空闲磁盘空间的管理方法是_______ _.

*** 作系统实现"按名存取"进行检索等的关键在于解决文件名与_______ _的转换.

在UNIX文件系统中,文件的路径名有两种表示形式,它们是________和________其中,以"/"开始的路径名表示________.

某UNIX文件的保护信息是111 110 100,则表示________可读,写,执行,________可读,写,其他用户只能读.

一级文件目录结构不能解决________的问题.多用户系统所用的文件目录结构至少应是________.

磁盘与主机之间传递数据是________为单位进行的.

目前 *** 作系统常采用的文件的物理结构有 , 和 .

四,简答题

什么是文件 它包含哪些内容及特点

在UNIX系统中,如果当前目录是/user/wang,那么,相对路径为../ast/xxx文件的绝对路径名是什么

有3个学生使用一个分时计算机系统,程序和数据同时存放在同一磁盘上,他们各自的终端上如果都为自己的程序取了一个名字WJ1,请问:

⑴ 系统应采用何种目录结构,才能区别这些学生的程序

⑵ 简单阐述系统怎样为这3个学生索取他们各自的程序WJ1.

文件的逻辑结构,物理组织及存取方法之间的关系如何

五,综合题

1,设UNIX文件系统中的目录结构如下图所示:

(1) 设当前工作目录是/usr/mengqc,那么,访问文件file_a的绝对路径名和相对路径名各是什么

(2) 现在想把工作目录改到liu,应使用什么命令(写出完整命令行)

(3) 如果用 ls -l 命令列出当前工作目录的内容,其中有如下所示的一项:

- r w - r - - r - - 2 mengqc …… m2.c

那么,该文件m2.c对文件主,同组用户,其他用户分别规定了什么权限

摘要:本文目的是分析在Linux系统中如何实现新的文件系统。在介绍文件系统具体实现前先介绍文件系统的概念和作用,抽象出了文件系统概念模型。熟悉文件系统的内涵后,我们再近一步讨论Linux系统中和文件系统的特殊风格和具体文件系统在Linux中组成结构,为读者勾画出Linux中文件系统工作的全景图。最后,我们再通过Linux中最简单的Romfs作实例分析实现文件系统的普遍步骤。(我们假定读者已经对Linux文件系统初步了解)

什么是文件系统

首先要谈的概念就是什么是文件系统,它的作用到底是什么。

文件系统的概念虽然许多人都认为是再清晰不过的了,但其实我们往往在谈论中或多或少地夸大或片缩小了它的实际概念(至少我时常混淆),或者说,有时借用了其它概念,有时说的又不够全面。

比如在 *** 作系统中,文件系统这个术语往往既被用来描述磁盘中的物理布局,比如有时我们说磁盘中的“文件系统”是EXT2或说把磁盘格式化成FAT32格式的“文件系统”等——这时所说的“文件系统”是指磁盘数据的物理布局格式;另外,文件系统也被用来描述内核中的逻辑文件结构,比如有时说的“文件系统”的接口或内核支持Ext2等“文件系统”——这时所说的文件系统都是内存中的数据组织结构而并非磁盘物理布局。还有些时候说“文件系统”负责管理用户读写文件——这时所说的“文件系统”往往描述 *** 作系统中的“文件管理系统”,也就是文件子系统。

虽然上面我们列举了混用文件系统的概念的几种情形,但是却也不能说上述说法就是错误的,因为文件系统概念本身就囊括众多概念,几乎可以说在 *** 作系统中自内存管理、系统调度到I/O系统、设备驱动等各个部分都和文件系统联系密切,有些部分和文件系统甚至未必能明确划分——所以不能只知道文件系统是系统中数据的存储结构,一定要全面认识文件系统在 *** 作系统中的角色,才能具备自己开发新文件系统的能力。

为了澄清文件系统的概念,必须先来看看文件系统在 *** 作系统中处于何种角色,分析文件系统概念的内含外延。所以我们先抛开Linux文件系统的实例,而来看看 *** 作系统中文件系统的普遍体系结构,从而增强对文件系统的理论认识。

下面以软件组成的结构图[1]的方式描述文件系统所涉及的内容。

我们针对各层做以简要分析:

首先我们来分析最低层——设备驱动层,该层负责与外设——磁盘等——通讯。基于磁盘的文件系统都需要和存储设备打交道,而系统 *** 作外设离不开驱动程序。所以内核对文件的最后 *** 作行为就是调用设备驱动程序完成从主存(内存)到辅存(磁盘)的数据传输。文件系统相关的多数设备都属于块设备,常见的块设备驱动程序有磁盘驱动,光驱驱动等,之所以称它们为块设备,一个原因是它们读写数据都是成块进行的,但是更重要的原因是它们管理的数据能够被随机访问——不需要向字符设备那样必须顺序访问。

设备驱动层的上一层是物理I/O层,该层主要作为计算机外部环境和系统的接口,负责系统和磁盘交换数据块。它要知道据块在磁盘中存储位置,也要知道文件数据块在内存缓冲中的位置,另外它不需要了解数据或文件的具体结构。可以看到这层最主要的工作是标识别磁盘扇区和内存缓冲块[2]之间的映射关系。

再上层是基础I/O监督层,该层主要负责选择文件 I/O需要的设备,调度磁盘请求等工作,另外分配I/O缓冲和磁盘空间也在该层完成。由于块设备需要随机访问数据,而且对速度响应要求较高,所以 *** 作系统不能向对字符设备那样简单、直接地发送读写请求,而必须对读写请求重新优化排序,以能节省磁盘寻址时间,另外也必须对请求提交采取异步调度(尤其写 *** 作)的方式进行。总而言之,内核对必须管理块设备请求,而这项工作正是由该层负责的。

倒数第二层是逻辑I/O层,该层允许用户和应用程序访问记录。它提供了通用的记录(record)I/O *** 作,同时还维护基本文件数据。由于为了方便用户 *** 作和管理文件内容,文件内容往往被组织成记录形式,所以 *** 作系统为 *** 作文件记录提供了一个通用逻辑 *** 作层。

和用户最靠近的是访问方法层,该层提供了一个从用户空间到文件系统的标准接口,不同的访问方法反映了不同的文件结构,也反映了不同的访问数据和处理数据方法。这一层我们可以简单地理解为文件系统给用户提供的访问接口——不同的文件格式(如顺序存储格式、索引存储格式、索引顺序存储格式和哈希存储格式等)对应不同的文件访问方法。该层要负责将用户对文件结构的 *** 作转化为对记录的 *** 作。

对比上面的层次图我们再来分析一下数据流的处理过程,加深对文件系统的理解。

假如用户或应用程序 *** 作文件(创建/删除),首先需要通过文件系统给用户空间提供的访问方法层进入文件系统,接着由使用逻辑I/O层对记录进行给定 *** 作,然后记录将被转化为文件块,等待和磁盘交互。这里有两点需要考虑——第一,磁盘管理(包括再磁盘空闲区分配文件和组织空闲区);第二,调度块I/O请求——这些由基础I/O监督层的工作。再下来文件块被物理I/O层传递给磁盘驱动程序,最后磁盘驱动程序真正把数据写入具体的扇区。至此文件 *** 作完毕。

当然上面介绍的层次结构是理想情况下的理论抽象,实际文件系统并非一定要按照上面的层次或结构组织,它们往往简化或合并了某些层的功能(比如Linux文件系统因为所有文件都被看作字节流,所以不存在记录,也就没有必要实现逻辑I/O层,进而也不需要在记录相关的处理)。但是大体上都需要经过类似处理。如果从处理对象上和系统独立性上划分,文件系统体系结构可以被分为两大部分:——文件管理部分和 *** 作系统I/O部分。文件管理系统负责 *** 作内存中文件对象,并按文件的逻辑格式将对文件对象的 *** 作转化成对文件块的 *** 作;而 *** 作系统I/O部分负责内存中的块与物理磁盘中的数据交换。

数据表现形式再文件 *** 作过程中也经历了几种变化:在用户访问文件系统看到的是字节序列,而在字节序列被写入磁盘时看到的是内存中文件块(在缓冲中),在最后将数据写入磁盘扇区时看到的是磁盘数据块[3]。

本文所说的实现文件系统主要针对最开始讲到第二种情况——内核中的逻辑文件结构(但其它相关的文件管理系统和文件系统磁盘存储格式也必须了解),我们用数据处理流图来分析一下逻辑文件系统主要功能和在 *** 作系统中所处的地位。

其中文件系统接口与物理布局管理是逻辑文件系统要负责的主要功能。

文件系统接口为用户提供对文件系统的 *** 作,比如open、close、read、write和访问控制等,同时也负责处理文件的逻辑结构。

物理存储布局管理,如同虚拟内存地址转化为物理内存地址时,必须处理段页结构一样,逻辑文件结构必须转化到物理磁盘中,所以也要处理物理分区和扇区的实际存储位置,分配磁盘空间和内存中的缓冲也要在这里被处理。

所以说要实现文件系统就必须提供上面提到的两种功能,缺一不可。

在了解了文件系统的功能后,我们针对Linux *** 作系统分析具体文件系统如何工作,进而掌握实现一个文件系统需要的步骤。

Linux 文件系统组成结构

Linux 文件系统的结构除了我们上面所提到的概念结构外,最主要有两个特点,一个是文件系统抽象出了一个通用文件表示层——虚拟文件系统或称做VFS。另外一个重要特点是它的文件系统支持动态安装(或说挂载、登陆等),大多数文件系统都可以作为根文件系统的叶子接点被挂在到根文件目录树下的子目录上。另外Linux系统在文件读写的I/O *** 作上也采取了一些先进技术和策略。

我们先从虚拟文件系统入手分析linux文件系统的特性,然后介绍有关文件系统的安装、注册和读写等概念。

虚拟文件系统

虚拟文件系统为用户空间程序提供了文件系统接口。系统中所有文件系统不但依赖VFS共存,而且也依靠VFS系统协同工作。通过虚拟文件系统我们可以利用标准的UNIX文件系统调用对不同介质上的不同文件系统进行读写 *** 作[4]。

虚拟文件系统的目的是为了屏蔽各种各样不同文件系统的相异 *** 作形式,使得异构的文件系统可以在统一的形式下,以标准化的方法访问、 *** 作。实现虚拟文件系统利用的主要思想是引入一个通用文件模型——该模型抽象出了文件系统的所有基本 *** 作(该通用模型源于Unix风格的文件系统),比如读、写 *** 作等。同时实际文件系统如果希望利用虚拟文件系统,既被虚拟文件系统支持,也必须将自身的诸如,“打开文件”、“读写文件”等 *** 作行为以及“什么是文件”,“什么是目录”等概念“修饰”成虚拟文件系统所要求的(定义的)形式,这样才能够被虚拟文件系统支持和使用。

我们可以借用面向对象的一些思想来理解虚拟文件系统,虚拟文件系统好比一个抽象类或接口,它定义(但不实现)了文件系统最常见的 *** 作行为。而具体文件系统好比是具体类,它们是特定文件系统的实例。具体文件系统和虚拟文件系统的关系类似具体类继承抽象类或实现接口。而在用户看到或 *** 作的都是抽象类或接口,但实际行为却发生在具体文件系统实例上。至于如何将对虚拟文件系统的 *** 作转化到对具体文件系统的实例,就要通过注册具体文件系统到系统,然后再安装具体文件系统才能实现转化,这点可以想象成面向对象中的多态概念。

我们个实举例来说明具体文件系统如何通过虚拟文件系统协同工作。

例如:假设一个用户输入以下shell命令:

$ cp /hda/test1 /removable/test2

其中 /removable是MS-DOS磁盘的一个安装点,而 /hda 是一个标准的第二扩展文件系统( Ext2)的目录。cp命令不用了解test1或test2的具体文件系统,它所看到和 *** 作的对象是VFS。cp首先要从ext3文件系统读出test1文件,然后写入MS-DOS文件系统中的test2。VFS会将找到ext3文件系统实例的读方法,对test1文件进行读取 *** 作;然后找到MS-DOS(在Linux中称VFAT)文件系统实例的写方法,对test2文件进行写入 *** 作。可以看到 VFS是读写 *** 作的统一界面,只要具体文件系统符合VFS所要求的接口,那么就可以毫无障碍地透明通讯了。

Unix风格的文件系统

虚拟文件系统的通用模型源于Unix风格的文件系统,所谓Unix风格是指Unix传统上文件系统传统上使用了四种和文件系统相关的抽象概念:文件(file)、目录项(dentry)、索引节点(inode)和安装点(mount point)。

文件——在Unix中的文件都被看做是一有序字节串,它们都有一个方便用户或系统识别的名称。另外典型的文件 *** 作有读、写、创建和删除等。

目录项——不要和目录概念搞混淆,在Linux中目录被看作文件。而目录项是文件路径中的一部分。一个文件路径的例子是“/home/wolfman/foo”——根目录是/,目录home,wolfman和文件foo都是目录项。

索引节点——Unix系统将文件的相关信息(如访问控制权限、大小、拥有者、创建时间等等信息),有时被称作文件的元数据(也就是说,数据的数据)被存储在一个单独的数据结构中,该结构被称为索引节点(inode)。

安装点——在Unix中,文件系统被安装在一个特定的安装点上,所有的已安装文件系统都作为根文件系统树中的叶子出现在系统中。

上述概念是Unix文件系统的逻辑数据结构,但相应的Unix文件系统(Ext2等)磁盘布局也实现了部分上述概念,比如文件信息(文件数据元)存储在磁盘块中的索引节点上。当文件被载如内存时,内核需要使用磁盘块中的索引点来装配内存中的索引接点。类似行为还有超级块信息等。

对于非Unix风格文件系统,如FAT或NTFS,要想能被VFS支持,它们的文件系统代码必须提供这些概念的虚拟形式。比如,即使一个文件系统不支持索引节点,它也必须在内存中装配起索引节点结构体——如同本身固有一样。或者,如果一个文件系统将目录看作是一种特殊对象,那么要想使用VFS,必须将目录重新表示为文件形式。通常,这种转换需要在使用现场引入一些特殊处理,使得非Unix文件系统能够兼容Unix文件系统的使用规则和满足VFS的需求。通过这些处理,非Unix文件系统便可以和VFS一同工作了,是性能上多少会受一些影响[5]。这点很重要,我们实现自己文件系统时必须提供(模拟)Unix风格文件系统的抽象概念。

Linux文件系统中使用的对象

Linux文件系统的对象就是指一些数据结构体,之所以称它们是对象,是因为这些数据结构体不但包含了相关属性而且还包含了 *** 作自身结构的函数指针,这种将数据和方法进行封装的思想和面向对象中对象概念一致,所以这里我们就称它们是对象。

Linux文件系统使用大量对象,我们简要分析以下VFS相关的对象,和除此还有和进程相关的一些其它对象。

VFS相关对象

这里我们不展开讨论每个对象,仅仅是为了内容完整性,做作简要说明。

VFS中包含有四个主要的对象类型,它们分别是:

超级块对象,它代表特定的已安装文件系统。

索引节点对象,它代表特定文件。

目录项对象,它代表特定的目录项。

文件对象,它代表和进程打开的文件。

每个主要对象中都包含一个 *** 作对象,这些 *** 作对象描述了内核针对主要对象可以使用的方法。最主要的几种 *** 作对象如下:

super_operations对象,其中包括内核针对特定文件系统所能调用的方法,比如read_inode()和sync_fs()方法等。

inode_operations对象,其中包括内核针对特定文件所能调用的方法,比如create()和link()方法等。

dentry_operations对象,其中包括内核针对特定目录所能调用的方法,比如d_compare()和d_delete()方法等。

file对象,其中包括,进程针对已打开文件所能调用的方法,比如read()和write()方法等。

除了上述的四个主要对象外,VFS还包含了许多对象,比如每个注册文件系统都是由file_system_type对象表示——描述了文件系统及其能力(如比如ext3或XFS);另外每一个安装点也都利用vfsmount对象表示——包含了关于安装点的信息,如位置和安装标志等。

其它VFS对象

系统上的每一进程都有自己的打开文件,根文件系统,当前工作目录,安装点等等。另外还有几个数据结构体将VFS层和文件的进程紧密联系,它们分别是:file_struct 和fs_struct

file_struct结构体由进程描述符中的files项指向。所有包含进程的信息和它的文件描述符都包含在其中。第二个和进程相关的结构体是fs_struct。该结构由进程描述符的fs项指向。它包含文件系统和进程相关的信息。每种结构体的详细信息不在这里说明了。

缓存对象

除了上述一些结构外,为了缩短文件 *** 作响应时间,提高系统性能,Linux系统采用了许多缓存对象,例如目录缓存、页面缓存和缓冲缓存(已经归入了页面缓存),这里我们对缓存做简单介绍。

页高速缓存(cache)是 Linux内核实现的一种主要磁盘缓存。其目的是减少磁盘的I/O *** 作,具体的讲是通过把磁盘中的数据缓存到物理内存中去,把对磁盘的I/O *** 作变为对物理内存的I/O *** 作。页高速缓存是由RAM中的物理页组成的,缓存中每一页都对应着磁盘中的多个块。每当内核开始执行一个页I/O *** 作时(通常是对普通文件中页大小的块进行磁盘 *** 作),首先会检查需要的数据是否在高速缓存中,如果在,那么内核就直接使用高速缓存中的数据,从而避免了访问磁盘。

但我们知道文件系统只能以每次访问数个块的形式进行 *** 作。内核执行所有磁盘 *** 作都必须根据块进行,一个块包含一个或多个磁盘扇区。为此,内核提供了一个专门结构来管理缓冲buffer_head。缓冲头[6]的目的是描述磁盘扇区和物理缓冲之间的映射关系和做I/O *** 作的容器。但是缓冲结构并非独立存在,而是被包含在页高速缓存中,而且一个页高速缓存可以包含多个缓冲。我们将在文件后面的文件读写部分看到数据如何被从磁盘扇区读入页高速缓存中的缓冲中的。

文件系统的注册和安装

使用文件系统前必须对文件系统进行注册和安装,下面分别对这两种行为做简要介绍。

文件系统的注册

VFS要想能将自己定义的接口映射到实际文件系统的专用方法上,必须能够让内核识别实际的文件系统,实际文件系统通过将代表自身属性的文件类型对象(file_system_type)注册(通过register_filesystem()函数)到内核,也就是挂到内核中的文件系统类型链表上,来达到使文件系统能被内核识别的目的。反过来内核也正是通过这条链表来跟踪系统所支持的各种文件系统的。

我们简要分析一下注册步骤:

struct file_system_type {

const char *name/*文件系统的名字*/

int fs_flags /*文件系统类型标志*/

/*下面的函数用来从磁盘中读取超级块*/

struct super_block * (*read_super) (struct file_system_type *, int,

const char *, void *)

struct file_system_type * next /*链表中下一个文件系统类型*/

struct list_head fs_supers /*超级块对象链表*/

}

其中最重要的一项是read_super()函数,它用来从磁盘上读取超级块,并且当文件系统被装载时,在内存中组装超级块对象。要实现一个文件系统首先需要实现的结构体便是file_system_type结构体。

注册文件系统只能保证文件系统能被系统识别,但此刻文件系统尚不能使用,因为它还没有被安装到特定的安装点上。所以在使用文件系统前必须将文件系统安装到安装点上。

文件系统被实际安装时,将在安装点创建一个vfsmount结构体。该结构体用代表文件系统的实例——换句话说,代表一个安装点。

vfsmount结构被定义在<linux/mount.h>中,下面是具体结构

―――――――――――――――――――――――――――――――――――――――

struct vfsmount

{

struct list_head mnt_hash /*哈希表*/

struct vfsmount *mnt_parent /*父文件系统*/

struct dentry *mnt_mountpoint /*安装点的目录项对象*/

struct dentry *mnt_root/*该文件系统的根目录项对象*/

struct super_block *mnt_sb /*该文件系统的超级块*/

struct list_head mnt_mounts /*子文件系统链表*/

struct list_head mnt_child /*和父文件系统相关的子文件系统*/

atomic_t mnt_count /*使用计数*/

int mnt_flags /*安装标志*/

char *mnt_devname /*设备文件名字*/

struct list_head mnt_list /*描述符链表*/

}

――――――――――――――――――――――――――――――――――――――

文件系统如果仅仅注册,那么还不能被用户使用。要想使用它还必须将文件系统安装到特定的安装点后才能工作。下面我们接着介绍文件系统的安装[7]过程。

安装过程

用户在用户空间调用mount()命令——指定安装点、安装的设备、安装类型等——安装指定文件系统到指定目录。mount()系统调用在内核中的实现函数为sys_mount(),该函数调用的主要例程是do_mount(),它会取得安装点的目录项对象,然后调用do_add_mount()例程。

do_add_mount()函数主要做的是首先使用do_kern_mount()函数创建一个安装点,再使用graft_tree()将安装点作为叶子与根目录树挂接起来。

整个安装过程中最核心的函数就是do_kern_mount()了,为了创建一个新安装点(vfsmount),该函数需要做一下几件事情:

l 1 检查安装设备的权利,只有root权限才有能力执行该 *** 作。

l 2 Get_fs_type()在文件链表中取得相应文件系统类型(注册时被填加到练表中)。

l 3 Alloc_vfsmnt()调用slab分配器为vfsmount结构体分配存储空间,并把它的地址存放在mnt局部变量中。

l 4 初始化mnt->mnt_devname域

l 5 分配新的超级块并初始化它。do_kern_mount( )检查file_system_type描述符中的标志以决定如何进行如下 *** 作:根据文件系统的标志位,选择相应的方法读取超级块(比如对Ext2,romfs这类文件系统调用get_sb_dev();对于这种没有实际设备的虚拟文件系统如 ramfs调用get_sb_nodev())——读取超级块最终要使用文件系统类型中的read_super方法。

安装过程做的最主要工作是创建安装点对象,挂接给定文件系统到根文件系统的指定接点下,然后初始化超级快对象,从而获得文件系统基本信息和相关 *** 作方法(比如读取系统中某个inode的方法)。

总而言之,注册过程是告之内核给定文件系统存在于系统内;而安装是请求内核对给定文件系统进行支持,使文件系统真正可用。

转载


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7947201.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存