如何实现一个文件系统

如何实现一个文件系统
如何实现一个文件系统

如何实现一个文件系统

本文作者:

康华:计算机硕士,主要从事Linux操作系统内核、Linux技术标准、计算机安全、软件测试等领域的研究与开发工作,现就职于信息产业部软件与集成电路促进中心所属的MII-HP Linux软件实验室。如果需要可以联系通过kanghua151@https://www.360docs.net/doc/466832238.html,联系他。

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

什么是文件系统

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

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

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

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

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

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

图1 :文件系统体系结构层次图

1[1]请参见OPERATION SYSTEMS INTERNALS AND DESIGN PRINCIPLES一书第12章

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

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

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

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

2[2]扇区是磁盘的最小寻址单元单元,而文件块是内核操作文件的最小单位,一个块可以包含一个或数个扇区。这些磁盘块被读入内存后即刻被存入缓冲中,同样文件块被写出是也要通过缓冲。

3[3]如果文件按记录形式组织,那么在数据在成为文件块前,还要经过记录形式的阶段。

图2 文件系统操作流程

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

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

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

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

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

Linux 文件系统组成结构

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

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

虚拟文件系统

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

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

4[4]摘自Linux 内核开发中第11 章中文件系统抽象层一节

么是文件”,“什么是目录”等概念“修饰”成虚拟文件系统所要求的(定义的)形式,这样才能够被虚拟文件系统支持和使用。

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

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

例如:假设一个用户输入以下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所要求的接口,那么就可以毫无障碍地透明通讯了。

下图给出Linux系统中VFS文件体统和具体文件系统能的层次示意图

图3 linux系统中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[5]。这点很重要,我们实现自己文件系统时必须提供(模拟)Unix风格文件系统的抽象概念。

Linux文件系统中使用的对象

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

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

5[5]请看Linux 内核开发一书第11章

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[6]的目的是描述磁盘扇区和物理缓冲之间的映射关系和做I/O操作

6[6]在2.6内核以后,缓冲头的作用比不象以前那么重要了。因为2.6中缓冲头仅仅作为内核中的I/O操作单元,而在2.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结构被定义在中,下面是具体结构―――――――――――――――――――――――――――――――――――――――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[7]过程。

安装过程

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

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

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

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

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

● 3 Alloc_vfsmnt()调用slab分配器为vfsmount结构体分配存储空间,并把它的地址存

放在mnt局部变量中。

● 4 初始化mnt->mnt_devname域

● 5 分配新的超级块并初始化它。do_kern_mount( )检查file_system_type描述符中的标

志以决定如何进行如下操作:根据文件系统的标志位,选择相应的方法读取超级块(比如对Ext2,romfs这类文件系统调用get_sb_dev();对于这种没有实际设备的虚拟文件系统如 ramfs调用get_sb_nodev())——读取超级块最终要使用文件系统类型中的read_super方法。

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

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

文件系统的读写

要自己创建文件系统必须知道文件系统需要那些操作,各种操作的功能范围,所以我们下面内容就是分析Linux文件系统文件读写过程,从中获得文件系统的基本功能函数信息和作用范围。

打开文件

在对文件进行写前,必须先打开文件。打开文件的目的是为了能使得目标文件能和当前进程关联,同时需要将目标文件的索引节点从磁盘载入内存,并初始化。

open操作主要包含以下几个工作要做(实际多数工作由sys_open()完成):

●1分配文件描述符号。

● 2 获得新文件对象。

7[7]这里安装的文件系统属于非根文件系统的安装方法。根文件系统安装方法有所区别,请查看相关资料。

● 3 获得目标文件的目录项对象和其索引节点对象(主要通过open_namei()函数)——具体的讲是通过调用索引节点对象(该索引节点或是安装点或是当前目录)的lookup方法找到目录项对应的索引节点号ino,然后调用iget(sb,ino)从磁盘读入相应索引节点并在内核中建立起相应的索引节点(inode)对象(其实还是通过调用sb->s_op->read_inode()超级块提供的方法),最后还要使用d_add(dentry,inode)函数将目录项对象与inode对象连接起来。

● 4 初始化目标文件对象的域,特别是把f_op域设置成索引节点中i_fop指向文件对象操作表——以后对文件的所有操作将调用该表中的实际方法。

● 5 如果定义了文件操作的open方法(缺省),就调用它。

到此可以看到打开文件后,文件相关的“上下文”、索引节点、目录对象等都已经生成就绪,下一步就是实际的文件读写操作了。

文件读写:

用户空间通过read/write系统调用进入内核执行文件操作,read操作通过sys_read内核函数完成相关读操作,write通过sys_write内核函数完成相关写操作。简而言之,sys_read( ) 和sys_write( )几乎执行相同的步骤,请看下面:

●1 调用fget( )从fd获取相应文件对象file,并把引用计数器file->f_count减1。

●2 检查file->f_mode中的标志是否允许请求访问(读或写操作)。

●3 调用locks_verify_area( )检查对要访问的文件部分是否有强制锁。

●4 调用file->f_op->read 或file->f_op->write来传送数据。两个函数都返回实际传送的字节数。

●5 调用fput( )以减少引用计数器file->f_count的值

●6 返回实际传送的字节数。

搞清楚大体流程了吧?但别得意,现在仅仅看到的是文件读写的皮毛。因为这里的读写方法仅仅是VFS提供的抽象方法,具体文件系统的读写操作可不是表面这么简单,接下来我们试试看能否用比较简洁的方法把从这里开始到数据被写入磁盘的复杂过程描述清楚。

现在我们要进入文件系统最复杂的部分——实际读写操作了。f_op->read/f_op->write两个方法属于实际文件系统的读写方法,但是对于基于磁盘的文件系统(必须有I/O操作),比如EXT2等,所使用的实际的读写方法都是利用Linux系统业以提供的通用函数——generic_file_read/generic_file_write完成的,这些通用函数的作用是确定正被访问的数据所在物理块的位置,并激活块设备驱动程序开始数据传送,它们针对Unix风格的文件系统都能很好的完成功能,所以没必要自己再实现专用函数了。下面来分析这些通用函数。

先说读方法:

第一部分利用给定的文件偏移量(ppos)和读写字节数(count)计算出数据所在页8[1]的逻辑号(index)。

第二然后开始传送数据页。

第三更新文件指针,记录时间戳等收尾工作。

其中最复杂的是第二部,首先内核会检查数据是否已经驻存在页高速缓存(page= find_get_page(mmaping ,index),其中mammping为页高速缓存对象,index为逻辑页号),如果在高速缓存中发现所需数据而且数据是有效的(通过检查一些标志位,如,PG_uptodate),那么内核就可以从缓存中快速返回需要的页;否则如果页中的数据是无效的,那么内核将分配一个新页面,然后将其加入到页高速缓存中,随即使用address_space对象的readpage方法(mapping->a_ops->readpage(file,page))激活相应的函数使磁盘到页的I/O数据传送。完成之后9[2]还要调用file_read_actor( )方法把页中的数据拷贝到用户态缓冲区,最好进行一些收尾等工作,如更新标志等。

到此为止,我们才要开始涉及和系统系统I/O层打交道了,下面我们就来分析readpage 函数具体如何激活磁盘到页的I/O传输。

8[1]无论读文件或写文件,文件中的数据都是必须经过内存中的页高速缓存做中间存储才能够被使用。高速缓存由一个叫做address_space的特殊数据结构表示,其中含有对页高速缓存宿主(address_space->host)的操作表。

9[2]这期间要要处理一些预读,以此提高未来访问的速度。

address_space对象的readpage方法存放的是函数地址,该函数激活从物理磁盘到页高速缓存的I/O数据传送。对于普通文件,该函数指针指向block_read_full_page( )函数的封装函数。例如,REISEFS文件系统的readpage方法指向下列函数实现:

int reiserfs _readpage(struct file *file, struct page *page)

{

return block_read_full_page(page, reiserfs _get_block);

}

需要封装函数是因为block_read_full_page( )函数接受的参数为待填充页的页描述符及有助于block_read_full_page()找到正确块的函数get_block的地址。该函数依赖于具体文件系统,作用是把相对于文件开始位置的块号转换为相对于磁盘分区中块位置的逻辑块号。在这里它指向reiserfs _get_block( )函数的地址。

block_read_full_page( )函数目的是对页所在的缓冲区启动页I/O操作,具体将要完成这几方面工作:

?调用create_empty_buffers( )为页中包含的所有缓冲区10[3]分配异步缓冲区首部

?从页所对应的文件偏移量(page->index域)导出页中第一个块的文件块号

?初始化缓冲区首部,最主要的工作是通过get_block函数进行磁盘寻址,找到缓冲

区的逻辑块号(相对于磁盘分区的开始而不是普通文件的开始)

?对于页中的每个缓冲区首部,对其调用submit_bh( )函数,指定操作类型为READ。

●接下来的工作就该交给I/O传输层处理了,I/O层负责磁盘访问请求调度和管理传输动

作。我们简要分析submit_bt()函数,该函数总体来说目的是向tq_disk任务队列11[4]提交请求,但它所做工作颇多,下面就简要分析该函数的行为:

◆从b_blocknr(逻辑块号)和b_size(块大小)两个域确定磁盘上第一个块的

扇区号,即b_rsector域的值

◆调用generic_make_request()函数向低级别驱动程序12[5]发送请求,它接受的参

数为缓冲区首部bh和操作类型rw。而该函数从低级驱动程描述符blk_dev[maj]

中获得设备驱动程序请求队列的描述符,接着调用请求队列描述符的

make_request_fn方法

make_request_fn方法是请求队列定义的合并相临请求,排序请求的主要执行函数。它将首先创建请求(实际上就是缓冲头和磁盘扇区的映射关系);然后检查请求队列是否为空:

●如果请求队列为空,则把新的请求描述符插入其中,而且还要将请求队列描述符插入

tq_disk任务队列,随后再调度低级驱动程序的策略例程的活动。

●如果请求队列不为空,则把新的请求描述符插入其中,试图把它与其他已经排队的请求

进行组合(使用电梯调度算法)。

低级驱动程序的活动策略函数是request_fn方法。

策略例程通常在新请求插入到空列队后被启动。随后队列中的所有请求要依次进行处理,直到队列为空才结束。

策略例程request_fn(定义在请求结构中)的执行过程如下:

◆策略例程处理队列中的第一个请求并设置块设备控制器,使数据传送完成后产

生一个中断。然后策略例程就终止。

◆数据传送完毕后块设备控制器产生中断,中断处理程序就激活下半部分。这个

下半部分的处理程序把这个请求从队列中删除(end_request( ))并重新执行策

略例程来处理队列中的下一个请求。

好了,写操作说完了,是不是觉得不知所云呀,其实上面仅仅是抽取写操作的骨架简要讲解,具体操作还要复杂得多,下面我们将上面的流程总结一便。

粗略地分,读操作依次需要经过:

用户界面层——负责从用户函数经过系统调用进入内核;

10[3]缓冲与相应的块一一对应,它的作用相当于是磁盘块在内存中的表示。

11[4]tq_disk是专门负责磁盘请求的任务队列,任务队列是用来推后异步执行的一种机制。2.6内核中已经用工作队列代替了工作队列。

12[5]块设备驱动程序可以划分为两部分:底级驱动程序(blk_dev_struct)和高级设备驱动(block_device)。底级设备驱动程序作用是记录每个高级驱动程序送来的请求组成的队列。

基本文件系统层——负责调用文件写方法,从高速缓存中搜索数据页,返回给用户。I/O调度层——负责对请求排队,从而提高吞吐量。

I/O传输层——利用任务列队异步操作设备控制器完成数据传输。

请看下图4给出的逻辑流程。

写操作和读操作大体相同,

作不象读操作那样必须和用户空间同步

存先存储在页高速缓存中,然后等页回写后台例程14[7]

15[8]进行下面status = a_ops->prepare_write(file,page,offset,offset+bytes);

page_fault = filemap_copy_from_user(page,offset,buf,bytes);

13[6]文件读区操作必须同步进行,在读取的数据返回前,工作无法继续进行。而且如果结果在30秒内回不来,则用户必需将无法忍受,所以读操作执行紧迫。而对于写操作,则可以异步执行,因为写入操作一般不会影响下一步的执行,所以紧迫性也低。

14[7] bdflush和kupdate 分别是当空闲内存过低时释放脏页和当脏缓冲区在内存中存在时间过长时刷新磁盘的。而在2.6内核中,这两个函数的功能已经被pdflush统一完成。

15[8]实际是从block_read_full_page( )函数中调用submit_bh()函数的。

status = a_ops->commit_write(file,page,offset,offset+bytes);

首先,在页高速缓存中搜索需要的页,如果需要的页不在高速缓存中,那么内核在高速缓存中新分配一空闲项;下一步,prepare_write()方法被调用,为页分配异步缓冲区首部;接着数据被从用户空间拷贝到了内核缓冲;最后通过commit_write()函数将对应的函数把基础缓冲区标记为脏,以便随后它们被页回写例程写回到磁盘。

好累呀,到此总算把文件读写过程顺了一便,大家明白了上述概念后,我门进入最后一部分: Romfs 事例分析。

Romfs 文件系统是如何实现的

Romfs 是基于块的只读文件系统,它使用块(或扇区)访问存储设备驱动(比如磁盘,CD,ROM 盘驱动)。由于它小型、轻量,所以常常用在嵌入系统和系统引导时。这种文件系统结构简单,实现容易,我们下面就分析一下它的实现方法,为读者勾勒出编写新文件系统的思路和步骤。希望能为大家自己设计文件系统起到抛砖引玉的效果。

Romfs 文件系统布局与文件结构

文件系统简单理解就是数据的分层存储结构,数据由文件组织,而文件又由文件系统安排存储形式,所以首先必须设计信息和文件组织形式——也就是这里所说的文件布局。 Romfs 是种很简单的文件系统,它的文件布局和Ext2等文件系统相比要简单的得多。在Linux 内核源代码种得Document/fs/romfs 中介绍了romfs 文件系统得布局和文件结构。现面我们简要说明一下它们。

上图是romfs 16位对其的,也就是说存储的偏移量必须最后4位为0,这样作是为了提高访问速度。随意如果信息不足时,需要填充0以保证所有信息的开始位置都为16为对其16[9]。

文件系统的开始8个字节存储文件系统的ASCII 形式的名称,比如“romfs ”;接着4个字节记录文件大小;然后的4

个字节存储的是文件系统开始处512字节的检验和;接下来是卷名;最后是第一个文件的文件头,从这里开始依次存储的信息就是文件本身了。

Romfs 的文件结构也非常简单,我们看下图

图 6 romfs文件布局

具体需要实现的对象

编写新文件系统自己需要一些基本对象17[10]:文件系统类型对象;文件对象;索引节点对象;高速缓存对象;超级块对象。这些文件对象前面已经介绍过了,要强调的是,多数对象中的数据和操作都已经定义或有通用实现,所以最需要自己定义的往往是针对具体文件系统中对象的操作函数。

Romfs文件系统定义针对文件系统布局和文件结构定义了一个磁盘超级块结构和磁盘inode(对应于文件)结构:

struct romfs_super_block {

__u32 word0;

__u32 word1;

__u32 size;

__u32 checksum;

char name[0];

};

struct romfs_inode {

__u32 next;

__u32 spec;

__u32 size;

__u32 checksum;

char name[0];

};

上述两种结构分别描述了文件系统结构与文件结构,它们将在内核装配超级块对象和索引节点对象时被使用。

Romfs文件系统首先要定义的对象是文件系统类型romfs_fs_type。定义该对象同时还要定义读取超级块的函数romfs_read_super。

ramfs_read_super()作用是从磁盘读取磁盘超级块给超级块对象,具体行为如下

1 装配超级块。

1.1 初始化超级块对象某些域。

1.2 从设备中读取磁盘第0块到内存到内存 bread(dev,0,ROMBSIZE),其中dev是文件系统安装时指定的设备,0指设备的首块,也就是磁盘超级块,ROMBSIZE是读取的大小。 1.3 检验磁盘超级块中的校验和

1.4 继续初始化超级块对象某些域

2 给超级块对象的操作表赋值(s->s_op = &romfs_ops)

3 为根目录分配目录项 s->s_root = d_alloc_root(iget(s,sz), sz为文件系统开始偏移。

超级块操作表中romfs文件系统实现了两个函数

static struct super_operations romfs_ops = {

17[10]对象指的是内存中的结构体实例,而不是物理上的存储结构。

read_inode: romfs_read_inode,

statfs: romfs_statfs,

};

第一个函数read_inode(inode)是用磁盘上的数据填充参数指定的索引节点对象的域;索引节点对象的i_ino域标识从磁盘上要读取的具体文件系统的索引节点。

1 根据inode参数寻找对应的索引节点。

2 初始化索引节点某些域

3 根据文件的访问权限(类别)设置索引节点的相应操作表

3.1 如果是目录文件则将索引节点表设为i->i_op = &romfs_dir_inode_operations;文件操作表设置为->i_fop = &romfs_dir_operations; 如果索引节点对应目录的话,那么需要的操作仅仅会是lookup操作(因为romfs是个功能很有限的文件系统);对于文件操作表中的两个方法一个为read,另一个为readdir。前者利用通用函数generic_read_dir,返回用户错误消息。后者是针对readdir/getdents等系统调用实现的返回目录中文件的函数

3.2 如果是常规文件,则将文件操作表设置为i->i_fop = &generic_ro_fops;

将页高诉缓存表设置为i->i_data.a_ops = &romfs_aops;由于romfs是只读文件系统,它在对正规文件操作时不需要索引节点操作,如mknod,link等,因此不用给管索引节点操作表。

对常规文件的操作也只需要使用内核提供的通用函数表struct generic_ro_fops ,它包含基本的三种常规文件操作:

llseek: generic_file_llseek,

read: generic_file_read,

mmap: generic_file_mmap,

利用这几种通用函数,完全能够满足romfs文件系统的的文件操作要求,具体函数请自己阅读源代码。

回忆前面我们提到过的页高速缓存,显然常规文件访问需要经过它,因此有必要实现页高诉缓存操作。因为只需要读文件,所以只用实现romfs_readpage函数,这里readpage

函数使用辅助函数romfs_copyfrom完成将数据从设备读入页高速缓存,该函数根据文件格式从设备读取需要的数据。设备读取操作需要使用bread块I/O例程,它的作用是从设备读取指定的块18[11]。

3.3 如果是连接文件,则将索引节点操作表设置为:

i->i_op=&page_symlink_inode_operations;

将页高速缓存操作表设置为:

i->i_data.a_ops = &romfs_aops;

符号连接文件需要使用通用符号连接操作page_symlink_inode_operations实现,同时也需要使用页高速缓存方法。

3.4 如果是套接字或管道则,进行特殊文件初始化操作init_special_inode(i, ino, nextfh);

到此,我们已经遍例了romfs文件系统使用的几种对象结构:romfs_super_block、

romfs_inode、romfs_fs_type、super_operations romfs_ops、address_space_operations romfs_aops 、file_operations romfs_dir_operations、inode_operations

romfs_dir_inode_operations 。实现上述对象是设计一个新文件系统的最低要求。

最后要说明的是为了使得romfs文件系统作为模块挂载,需要实现static int __init init_romfs_fs(void)

{

18[11]索引节点结构描述了从物理块(块设备上的存取单位,是每次I/O操作最小传输的数据大小)到逻辑块(文件实际操作基本单元)的映射关系。

return register_filesystem(&romfs_fs_type);

}

static void __exit exit_romfs_fs(void)

{

unregister_filesystem(&romfs_fs_type);

}

两个在安装romfs文件系统模块时使用的例程。

安装和卸载

module_init(init_romfs_fs)

module_exit(exit_romfs_fs)

到此,romfs文件系统的关键结构都已介绍,至于细节还是需要读者仔细推敲。Romfs是最简单的基于块的只读文件系统,而且没有访问控制等功能。所以很多访问权限以及写操作相关的方法都不必去实现。

总结:实现文件系统必须想上要清楚文件系统和系统调用的关系,想下要了解文件系统和I/O调度、设备驱动等的联系。另外还必须了解关于缓存、进程、磁盘格式等概念。在这里并没有对这些问题进行是深入分析,仅仅提供给大家一个文件系统全景图,希望能对自己设计文件系统有所帮助。文件系统内容庞大、复杂,许多问题我也比较含混,有文件系统经验的朋友希望能够广泛交流。

(完整版)操作系统毕业课程设计说明书-基于Linux的模拟文件系统的设计与实现

中北大学 操作系统课程设计 说明书 学院、系:软件学院 专业:软件工程 学生姓名:徐春花学号: 设计题目:基于Linux的模拟文件系统的设计与实现 起迄日 期: 2014年6月14日- 2014年6月26日指导教薛海丽

师: 2014 年 6月 26 日 前言 简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。这个系统是由世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。 Linux不仅为用户提供了强大的操作系统功能,而且还提供了丰富的应用软件。用户不但可以从Internet上下载Linux及其源代码,而且还可以从Internet上下载许多Linux的应用程序。可以说,Linux本身包含的应用程序以及移植到Linux上的应用程序包罗万象,任何一位用户都能从有关Linux的网站上找到适合自己特殊需要的应用程序及其源代码,这样,用户就可以根据自己的需要下载源代码,以便修改和扩充操作系统或应用程序的功能。这对Windows NT、Windows98、MS-DOS或OS2

等商品化操作系统来说是无法做到的。 Linux具有:稳定、可靠、安全的优点,并且有强大的网络功能。其中有对读、 写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。在相关软 件的支持下,可实现WWW、FTP、DNS、DHCP、E-mail等服务,还可作为路由器 使用,利用IPCHAINSIPTABLE网络治理工具可构建NAT及功能全面的防火墙。 Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系 统。Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑 器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的X-Windows图形 用户界面,如同我们使用Windows NT一样,允许我们使用窗口、图标和菜单对系 统进行操作。 目录 1需求分析 (3) 1.1 功能介绍 (3) 1.2 目的及意义 (5) 1.2.1 目的 (5) 1.2.2 意义 (6) 1.3 设计成果 (7) 2总体设计 (8) 2.1功能介绍 (8) 2.2模块关联 (9) 3详细设计 (12)

简单文件系统的实现

简单文件系统的实现 Company Document number:WUUT-WUUY-WBBGB-BWYTT-1982GT

第三章简单文件系统的实现 设计目的和内容要求 1.设计目的 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。 2.内容要求 (1)在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。在退出该文件系统的使用时,应将该虚拟文件系统以一个Windows文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。 (2)文件存储空间的分配可采用显式链接分配或其他的办法。 (3)空闲磁盘空间的管理可选择位示图或其他的办法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,那么可以将位示图合并到FAT 中。 (4)文件目录结构采用多级目录结构。为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。 (5)要求提供以下操作命令: my_format:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。

●my_mkdir:用于创建子目录。 ●my_rmdir:用于删除子目录。 ●my_ls:用于显示目录中的内容。 ●my_cd:用于更改当前目录。 ●my_create:用于创建文件。 ●my_open:用于打开文件。 ●my_close:用于关闭文件。 ●my_write:用于写文件。 ●my_read:用于读文件。 ●my_rm:用于删除文件。 ●my_exitsys:用于退出文件系统。 3.学时安排 授课2学时,上机9学时。 4.开发平台 C或C++均可。 5.思考 (1)我们的数据结构中的文件物理地址信息是使用C语言的指针类型、还是整型,为什么 (2)如果引入磁盘索引结点,上述实现过程需要作哪些修改 (3)如果设计的是一个单用户多任务文件系统,则系统需要进行哪些扩充(尤其要考虑读写指针问题)如果设计的是一个多用户文件系统,则又要进行哪些扩充

10 11 第十、十一章 文件系统习题及答案

文件系统习题及答案 一:选择题 1、文件系统最基本的目标是(1),它主要是通过(8)功能实现的,文件系统所追求的最 重要的目标是(4)。 (1)按名存取(2)文件共享(3)文件保护(4)提高对文件的存取速度(5)提高I/O速度(6)提高存储空间利用率(7)存储空间管理(8)目录管理(9)文件读写管理(10)文件安全性管理 2、按逻辑结构,文件分为(5)和(6)两类,UNIX系统中的文件系统采用(6) (1)读、写文件(2)只读文件(3)索引文件(4)链式文件(5)记录文件(6)流式文件 3、从下面的描述中,选择出一条错误的描述 (1)一个文件在同一系统中、不同的存储介质上的拷贝,应采用同一种物理结构。 (2)文件的物理结构不仅与外存的分配方式相关,还与存储介质的特性相关,通常在磁带上只适合使用顺序的存储结构。 (3)采用顺序结构的文件既适合进行顺序访问,也适合进行直接访问。 (4)虽然磁盘是随机访问的设备,但其中的文件也可使用顺序存储结构 4、从下面关于索引文件的论述中,选出两条正确的论述 (1)在索引文件中,索引表的每个表项包含有相应记录的关键字和该记录的物理地址 (2)对顺序文件进行检索时,首先从FCB中读出文件的第一个盘块号,而对索引文件进行检索时,应先从FCB中读出文件索引表的起始地址。 (3)对一个具有三级索引表的文件,存取一个记录通常需要三次访问磁盘 (4)在文件较大时,无论进行顺序存取还是随机存取,通常都以索引文件方式最快。 5、对文件空闲空间管理,MS-DOS采用的是(2),UNIX采用的是(4) (1)空闲表(2)文件分配表(3)位示图(4)成组链接法 6、文件系统中,通常利用(4)来管理文件,为了允许不通用户的文件具有相同的文件名, 通常文件系统采用(6),在目录文件中的每个目录项通常是(8),在UNIX系统中,目录项目则是(7) (1)文件控制块(2)索引结点(3)符号名表(4)目录(5)重名(6)多级目录(7)文件名和索引结点的指针(8)FCB (9)索引节点 7、在树型目录结构中,用户对某个文件的首次访问通常都采用(2),文件被打开后,对文 件的访问通常采用(4) (1)文件符号名(2)文件路径名(3)内存索引结点的指针(4)用户文件的描述符 8、从下面关于目录检索的论述中,选出一条正确的论述 (1)用于hash法具有较快的检索速度,故现代操作系统中已经开始用它来替代传统的顺序检索方法。 (2)在利用顺序检索法时,对树型目录应采用文件的路径名,且应从根目录开始逐级检索。 (3)在利用顺序检索法时,只要找到一个文件分量名未找到,便应停止查找。 (4)在顺序检索法的查找完成后,即可得到文件的物理地址。 9、在create()过程中,如果没有检索到指定文件的索引结点,此时属于(3),检索到指

操作系统原理-第八章 文件系统习题(有答案)

第六章文件系统 6.3习题 6.3.1 单项选择题 1.操作系统对文件实行统一管理,最基本的是为用户提供( )功能。 A.按名存取 B.文件共享 C.文件保护 D.提高文件的存取速度 2.按文件用途分类,编译程序是( )。 A.系统文件 B.库文件 C.用户文件 D.档案文件 3.( )是指将信息加工形成具有保留价值的文件。 A.库文件 B.档案文件 C.系统文件 D.临时文件 4.把一个文件保存在多个卷上称为( )。 A.单文件卷 B.多文件卷 C.多卷文件 D.多卷多文件 5.采取哪种文件存取方式,主要取决于( )。 A.用户的使用要求 B.存储介质的特性 C.用户的使用要求和存储介质的特性 D.文件的逻辑结构 6.文件系统的按名存取主要是通过( )实现的。 A.存储空间管理 B.目录管理 C.文件安全性管理 D.文件读写管理7.文件管理实际上是对( )的管理。 A.主存空间 B.辅助存储空间 C.逻辑地址空间 D.物理地址空间8.如果文件系统中有两个文件重名,不应采用( )结构。 A.一级目录 B.二级目录 C.树形目录 D.一级目录和二级目录9.树形目录中的主文件目录称为( )。 A.父目录 B.子目录 C.根目录 D.用户文件目录 10.绝对路径是从( )开始跟随的一条指向制定文件的路径。 A.用户文件目录 B.根目录 C.当前目录 D.父目录 11.逻辑文件可分为流式文件和( )两类。 A.索引文件 B.链接文件 C.记录式文件 D.只读文件 12.由一串信息组成,文件内信息不再划分可独立的单位,这是指( )。A.流式文件 B.记录式文件 C.连续文件 D.串联文件 13.记录式文件内可以独立存取的最小单位是由( )组成的。 A.字 B.字节 C.数据项 D.物理块 14.在随机存储方式中,用户以( )为单位对文件进行存取和检索。 A.字符串 B.数据项 C.字节 D.逻辑记录

操作系统课程设计-模拟文件系统

目录 第1章需求分析 (1) 第2章概要设计 (1) 系统的主要功能 (1) 系统模块功能结构 (1) 运行环境要求 (2) 数据结构设计 (2) 第3章详细设计 (3) 模块设计 (3) 算法流程图 (3) 第4章系统源代码 (4) 第5章系统测试及调试 (4) 运行结果及分析 (4) 系统测试结论 (5) 第6章总结与体会 (6) 第7章参考文献 (6) 附录 (7)

第1章需求分析 通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。 模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。 第2章概要设计 系统的主要功能 1) 系统运行时根据输入的用户数目创建主目录 2) 能够实现下列命令: Login 用户登录 Create 建立文件 Read 读取文件 Write 写入文件 Delete 删除文件 Mkdir 建立目录 Cd 切换目录 Logout 退出登录 系统模块功能结构

运行环境要求 操作系统windows xp ,开发工具vc++ 数据结构设计 用户结构:账号与密码结构 typedef struct users { char name[8]; char pwd[10]; }users; 本系统有8个默认的用户名,前面是用户名,后面为密码,用户登陆时只要输入正确便可进入系统,否则提示失败要求重新输入。 users usrarray[8] = { "usr1","usr1", "usr2","usr2", "usr3","usr3", "usr4","usr4",

《操作系统》习题集:第4章 文件系统

第4章文件系统-习题集 一、选择题 1.文件系统是指()。【*,联考】 A. 文件的集合 B. 文件的目录 C. 实现文件管理的一组软件 D. 文件、管理文件的软件及数据结构的总体 2.文件系统的主要目的是()。【*,★,联考】 A. 实现对文件的按名存取 B. 实现虚拟存储 C. 提高外存的读写速度 D. 用于存储系统文件 3.目录文件所存放的信息是()。【**,★,联考】 A. 某一文件存放的数据信息 B. 某一文件的文件目录 C. 该目录中所有数据文件目录 D. 该目录中所有子目录文件和数据文件的目录 4.在文件系统中,文件访问控制信息存储的合理位置是()。【**,★,09考研】 A. 文件控制块 B. 文件分配表 C. 用户口令表 D. 系统注册表 5.索引文件由逻辑文件和()组成。【**,联考】 A. 符号表 B. 索引表 C. 交叉访问表 D. 链接表 6.文件系统在创建一个文件时,为它建立一个()。【**,联考】 A. 文件目录项 B. 目录文件 C. 逻辑结构 D. 逻辑空间 7.通常对文件系统来说,文件名及属性可以集中在()中,以便查找。【**,★,联考】 A. 目录文件 B. 索引文件 C. 字典 D. 作业控制块 8.文件绝对路径名是指()。【*,★,联考】 A. 文件名和文件扩展名 B. 一系列的目录文件名和该文件的文件名 C. 从根目录到该文件所经历的路径中各符号名的集合 D. 目录文件名和文件名的集合 9.设置当前工作目录的主要目的是()。【**,★,10考研】 A. 节省外存空间 B. 节省内存空间 C. 加快文件的检索速度 D. 加快文件的读写速度 10.文件系统可以采用两级目录结构,这样可以()。【*,★,联考】 A. 缩短访问文件存储器的时间 B. 实现文件共享 C. 节省内存空间 D. 解决不同用户之间的文件名冲突问题 11.文件系统采用多级目录结构后,对于不同用户的文件,其文件名()。【*,联考】 A. 应该相同 B. 应该不同 C. 可以相同也可以不同 D. 受系统约束 12.设文件F1的当前引用计数值为1,先建立F1的符号链接(软链接)文件F2,再建立F1的硬链接文件F3,然 后删除F1。此时,F2和F3的引用计数值分别是()。【***,09考研】

操作系统简单文件系统设计及实现

简单文件系统的设计及实现 一、实验目的: 1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解 2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 二、实验内容: 1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。 3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作 4、算法与框图 ?因系统小,文件目录的检索使用了简单的线性搜索。 ?文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。 ?程序中使用的主要设计结构如下:主文件目录和用户文件目录( MFD、UFD); 打开文件目录( AFD)(即运行文件目录) 文件系统算法的流程图如下

三、工具/准备工作: 在开始本实验之前,请回顾教科书的相关内容。并做以下准备: 1) 一台运行Windows 2000 Professional或Windows 2000 Server的操作系统的计算机。 2) 计算机中需安装Visual C++ 6.0专业版或企业版 四、实验要求: (1)按照学校关于实验报告格式的要求,编写实验报告(含流程图); (2)实验时按两人一组进行分组,将本组认为效果较好的程序提交检查。

模拟实现文件系统,操作系统课程设计要点

某某大学 课程设计报告课程名称:操作系统课程设计 设计题目:模拟实现文件系统 系别:计算机系 专业:计算机科学与技术 组别: 学生姓名: 学号: 起止日期: 指导教师:

目录 目录 0 第一章需求分析 (1) 1.1 课程设计题目 (1) 1.2 课程任务及要求 (1) 1.3课程设计思想: (1) 1.4软硬件运行环境及开发工具: (2) 第二章概要设计 (3) 2.1流程图 (3) 2.2用到的原理 (3) 第三章详细设计 (4) 第四章调试与操作说明 (9) 4.1用户登陆界面 (9) 4.2创建文件界面 (9) 4.3删除文件界面 (10) 4.4退出界面 (10) 第五章课程设计总结与体会 (10) 第六章致谢 (11) 第七章参考文献 (11)

第一章需求分析 1.1 课程设计题目 课程设计题目:模拟实现文件系统 1.2 课程任务及要求 要求:实现文件的建立、打开、删除、关闭、复制、读、写、查询等功能 给出实现方案(包括数据结构和模块说明等) 画出程序的基本结构框图和流程图 分析说明每一部分程序的设计思路 实现源代码 按期提交完整的程序代码和可执行程序 根据要求完成课程设计报告 总结 1.3课程设计思想: 模拟实现文件系统问题是一个经典的关于文件的处理问题,包括:实现文件的建立、打开、删除、关闭、复制、读、写、查询等功能。设计思想如下:1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。 2.文件物理结构可采用显式链接或其他方法。 3.磁盘空闲空间的管理可选择位示图或其他方法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。4.文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。目录组织方式可以不使用索引结点的方式,但使用索引结点,则难度系数为1.2。 5.设计一个较实用的用户界面,方便用户使用。要求提供以下相关文件操作:(1)具有login (用户登录)

第六章 文件系统习题

第六章文件系统 一. 单项选择题 1.操作系统对文件实行统一管理,最基本的是为用户提供( )功能。 A.按名存取 B.文件共享 C.文件保护 D.提高文件的存取速度 2.按文件用途分类,编译程序是( )。 A.系统文件 B.库文件 C.用户文件 D.档案文件 3.( )是指将信息加工形成具有保留价值的文件。 A.库文件 B.档案文件 C.系统文件 D.临时文件 4.把一个文件保存在多个卷上称为( )。 A.单文件卷 B.多文件卷 C.多卷文件 D.多卷多文件 5.采取哪种文件存取方式,主要取决于( )。 A.用户的使用要求 B.存储介质的特性 C.用户的使用要求和存储介质的特性 D.文件的逻辑结构 6.文件系统的按名存取主要是通过( )实现的。 A.存储空间管理 B.目录管理 C.文件安全性管理 D.文件读写管理7.文件管理实际上是对( )的管理。 A.主存空间 B.辅助存储空间 C.逻辑地址空间 D.物理地址空间8.如果文件系统中有两个文件重名,不应采用( )结构。 A.一级目录 B.二级目录 C.树形目录 D.一级目录和二级目录9.树形目录中的主文件目录称为( )。 A.父目录 B.子目录 C.根目录 D.用户文件目录 10.绝对路径是从( )开始跟随的一条指向制定文件的路径。 A.用户文件目录 B.根目录 C.当前目录 D.父目录 11.逻辑文件可分为流式文件和( )两类。 A.索引文件 B.链接文件 C.记录式文件 D.只读文件 12.由一串信息组成,文件内信息不再划分可独立的单位,这是指( )。A.流式文件 B.记录式文件 C.连续文件 D.串联文件 13.记录式文件内可以独立存取的最小单位是由( )组成的。 A.字 B.字节 C.数据项 D.物理块 14.在随机存储方式中,用户以( )为单位对文件进行存取和检索。 A.字符串 B.数据项 C.字节 D.逻辑记录 15.数据库文件的逻辑结构形式是( )。 A.链接文件 B.流式文件 C.记录式文件 D.只读文件 16.文件的逻辑记录的大小是( )。

模拟文件系统

课程设计 课程名称计算机操作系统 题目名称模拟文件系统 专业班级2014级计算机科学与技术 (专升本)班 学生姓名宋欢乐、张焕、范孝礼 学号51402111042、51402111038、51402111043 指导教师邹青青 二○一四年十二月二十日

目录 1、引言 (2) 2、需求分析 (3) 3、概要设计 (4) 3.1 系统的主要功能 (4) (1) 主界面 (4) (2) Create 建立文件 (5) (3)Read 读取文件 (6) (4)Write 写入文件 (7) (5)Delete 删除文件 (9) (6)Mkdir 建立目录 (10) (7)Cd 切换目录 (11) (8)Logout 退出登录 (12) 3.2 系统模块功能结构 (12) (1)结构说明: (12) 3.3 运行环境要求 (13) 3.4 数据结构设计 (13) 3.5 数据结构说明 (14) (1)文件结构链表 (14) (2)函数介绍 (14) 4、详细设计 (15) 4.1 模块设计 (15) 4.2 算法流程图 (15) 5、系统源代码 (17) 见附录 (17) 6、系统测试及调试 (18) 6.1 运行结果及分析 (18) 6.2 系统测试结论 (22) 7、总结与体会 (23) 参考文献 (24) 附录系统的主要源代码 (25)

1、引言 计算机操作系统是计算机系统中不可缺少的基本系统软件,计算机操作系统是由硬件和软件两部分构成的。操作系统实际上是一个计算机系统中硬、软件资源的总指挥部。能有效的组织和管理计算机系统中的硬件和软件资源、合理的组织计算机工作流程,控制程序的执行、并向用户提供各种服务功能,使得用户能够合理、方便、有效的使用计算机,是整个计算机系统能高效运行的一组程序模块的集合。操作系统在计算机体系中张非常重要的地位。 在现代计算机管理中,总是把程序和数据以文件的形式存储在磁盘和磁带上,供所有的或指定的用户使用。为此,在操作系统中必须配置文件管理机构。文件管理的主要任务是对任务和系统文件进行管理,以方便用户使用,并保证文件的安全性。为此,文件管理应具有对文件存储空间的管理、目录管理、文件的读写管理,以及文件的共享与保护等功能。 从计算机诞生到现在虽然只经历了短短几十年的时间,但无论是在软件还是在硬件方面,计算机都有着飞跃式的发展。随着计算机应用不断增加,计算机上所需要存储的数据和程序也日益增多,早期的文件管理方式已经不能满足现在的需要。计算机操作系统是配置在计算机硬件上的第一层软件,是对硬件的首次扩充。他在计算机系统中占据了特别重要的地位。操作系统的主要功能是进行处理机管理功能,为了进一步了解文件管理功能,我们建立了一个文件模拟系统,要求编写程序,模拟实现文件系统中关于目录及文件的操作。

简单文件系统的实现

第三章简单文件系统的实现 3.1 设计目的和内容要求 1. 设计目的 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。 2.内容要求 (1)在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。在退出该文件系统的使用时,应将该虚拟文件系统以一个Windows 文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。 (2)文件存储空间的分配可采用显式链接分配或其他的办法。 (3)空闲磁盘空间的管理可选择位示图或其他的办法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,那么可以将位示图合并到FAT中。 (4)文件目录结构采用多级目录结构。为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。 (5)要求提供以下操作命令: my_format:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。 my_mkdir:用于创建子目录。 my_rmdir:用于删除子目录。 my_ls:用于显示目录中的内容。 my_cd:用于更改当前目录。 my_create:用于创建文件。 my_open:用于打开文件。 my_close:用于关闭文件。

my_write:用于写文件。 my_read:用于读文件。 my_rm:用于删除文件。 my_exitsys:用于退出文件系统。 3.学时安排 授课2学时,上机9学时。 4.开发平台 C或C++均可。 5.思考 (1)我们的数据结构中的文件物理地址信息是使用C语言的指针类型、还是整型,为什么? (2)如果引入磁盘索引结点,上述实现过程需要作哪些修改? (3)如果设计的是一个单用户多任务文件系统,则系统需要进行哪些扩充(尤其要考虑读写指针问题)?如果设计的是一个多用户文件系统,则又要进行哪些扩充? 3.2 预备知识 3.2.1 FAT文件系统介绍 1.概述 FAT文件系统是微软公司在其早期的操作系统MS-DOS及Windows9x中采用的文件系统,它被设计用来管理小容量的磁盘空间。FAT文件系统是以他的文件组织方式——文件分配表(file allocation table,FAT)命名的,文件分配表的每个表项中存放某文件的下一个盘块号,而该文件的起始盘块号则保存在它的文件控制块FCB中。在文件分配表中,一般用FFFF来标识文件的结束;用0000来标识某个逻辑块未被分配,即是空闲块。为了提高文件系统的可靠性,在逻辑磁盘上通常设置两张文件分配表,它们互为备份。此外,文件分配表必须存放在逻辑磁盘上的固定位置,而根目录区通常位于FAT2之后,以便操作系统在启动时能够定位所需的文件,其磁盘布局如图3-1所示: 引导块FAT1FAT2根目录区数据区

第四章文件系统习题解答

第四章文件系统 姓名:学号:网选班号: 一、选择题 ( A )1 文件系统的主要目的是() A 实现对文件的按名存储 B 实现虚拟存储 C 提高外设的读取速度D用于存储文件系统 ( ABC )2 为了对文件进行操作,应该用以下哪些系统调用()。 A 建立文件 B 打开文件 C 关闭文件 D 申请缓冲区 ( B)3文件系统与()密切相关,它们共同为用户使用文件提供方便。 A 处理器管理 B 设备管理 C 内存管理 ( B )4文件系统中文件被按照名字存取是为了() A 方便操作系统对文件的管理 B 方便用户使用 C 确定文件的存取权限 D 加强对文件内容的保密 ( C )5文件系统采用多级目录后,对于不同用户的文件,其文件名() A 应该相同 B 应该不同 C 可以相同,也可以不同 ( C )6 在文件系统中可命名的最小数据单位是() A 字符 B 记录 C 文件 D 文件系统 ( B )7 下列()物理结构不利于对文件的随机存取 A 顺序文件 B 链接文件 C 索引文件 ( B )8 管理空闲磁盘空间可以用(),它利用二进制的一位来表示一个磁盘块的使用情况 A 空闲区表 B 位示图 C 分组链接 ( C)9 文件系统利用()来管理文件. A 文件名 B 文件描述符 C 目录 ( A)10目录文件中的目录项就是() A 文件描述符 B 文件指针 C 索引表 (B)11、将文件目录分成基本文件目录和符号文件目录的作用是() A 层次分明和易于实现 B 提高检索文件速度和便于共享 C 便于文件系统的分层实现(A)12 打开文件操作是对()的操作 A 目录 B 文件 C 目录和文件 (B)13 FAT文件系统支持()结构 A 顺序文件 B 链接文件 C 索引文件 (C)14 EXT2文件系统支持()结构 A 顺序文件 B 链接文件 C 索引文件 (A)15 假设一个扇区大小为512B,1块=1扇区,FAT16可以管理的磁盘空间大小为() A 32M B B 64MB C 128MB D 512MB (C)16 linux的VFS的超级块中存放()信息 A 文件 B 目录 C 文件系统 ()17 假设1块=1扇区=512B,块地址用4B表示,ext2可以管理的最大文件的大小为(A) A 1G B 16G C 32G B 64G 二、问答题 1、使用文件系统时,通常要显示地调用OPEN、CLOSE操作,是否可以不要这种操作?这样做的好处是什么? 可以不要。 好处:无需多次读文件的文件描述符信息,减少访问磁盘次数 2、DOS硬盘的FAT表的大小最大是多少?采用FAT16管理40G的硬盘,一个块要被定义为多大才合适? DOS硬盘的FAT表的大小最大是2B*216=128KB 采用FAT16管理40G的硬盘,一块要定义为:40GB/216=640KB 3、简述DOS命令type \sub\f的执行过程。 1)读卷总信息,得\地址,读\到内存。 2)在\目录中查找sub 2.1若找到,得sub第1块块号,将第1块读入内存,查FAT,获得第2块以后的块号,逐次读入内存。 2.2若未找到,显示出错,转5) 3)在sub目录中查找f 2.1若找到,得f第1块块号,将第1块读入内存,查FAT,获得第2块以后的块号,逐次读入内存。 2.2若未找到,显示出错,转5) 4)将内存的f文件内容送显示器 5)结束 4、简述linux命令cat /sub/f的执行过程 1)依据/目录的i节点号读/的i节点到内存,获得/的索引表,依据索引表中的地址将/读入内存 2)在/中查找sub 2.1若找到,得sub的i节点号,依据i节点号,将sub的i节点读入内存,获得sub的索引表,依据索引表中的地址将sub读入内存 2.2若未找到,显示出错,转5) 3)在sub中查找f 2.1若找到,得f的i节点号,依据i节点号,将f的i节点读入内存,获得sub的索引表,依据索引表中的地址将f读入内存. 2.2若未找到,显示出错,转5) 4)将内存的f文件内容送显示器 5)结束

模拟实现单级目录、单级索引的索引文件系统

课程设计报告 课程名称操作系统课程设计 课题名称模拟实现单级目录、单级索引的索引文件系统 专业计算机科学与技术 班级 学号 姓名 指导教师周铁山 2012年1 月6日

湖南工程学院 课程设计任务书 课程名称操作系统课程设计 课题模拟实现单级目录、单级索引的索引文件系统专业班级 学生姓名 学号 指导教师周铁山 审批 任务书下达日期2013 年 1 月 2 日 任务完成日期2013年 1 月 6 日

计算机10级《操作系统课程设计》任务书 一、课程设计的性质和目的 操作系统课程设计是计算机专业的专业课程,通过课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握操作系统的基本设计方法和技巧,进一步提高分析问题、解决问题及上机操作能力,为将来从事计算机工作打下一定的专业基础。 二、设计课题 课题一:模拟实现单级目录的FAT文件系统 基本思路:用二进制文件空间模拟磁盘空间,用文件块操作模拟磁盘块操作。 基本设计要求:1、实现如下文件系统功能(过程或函数): a、挂载文件系统FILE *OPENSYS(char *filename); b、卸载文件系统int CLOSESYS(FILE *stream); c、显示目录void LISTDIR(void); d、建立文件int FCREA TE(char *filename); e、删除文件int FDELETE(char *filename); f、打开文件int FOPEN(char *filename); g、关闭文件int FCLOSE(int fileid); h、文件块读int FREAD(void *ptr, int n, int fileid); i、文件块写int FWRITE(void *ptr, int n, int fileid); j、判断文件结束int FEOF(int fileid); k、获取文件指针long FGETPOS(int fileid); l、设置文件指针int FSETPOS(int fileid, long offset); m、取得文件长度long FGETLEN(char *filename); 2、提供文件系统创建程序 3、有功能检测模块 4、为简化程序设计,假定目录区域大小固定。 文件系统空间划分: 可以使用的C语言文件操纵函数: FILE *fopen(const char *filename, const char *mode); int fclose(FILE *stream); int fseek(FILE *stream, long offset, int whence); long ftell(FILE *stream); size_t fread(void *ptr, size_t size, size_t n, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);

如何实现一个文件系统

如何实现一个文件系统 本文作者: 康华:计算机硕士,主要从事Linux操作系统内核、Linux技术标准、计算机安全、软件测试等领域的研究与开发工作,现就职于信息产业部软件与集成电路促进中心所属的MII-HP Linux软件实验室。如果需要可以联系通过kanghua151@https://www.360docs.net/doc/466832238.html,联系他。 摘要:本文目的是分析在Linux系统中如何实现新的文件系统。在介绍文件系统具体实现前先介绍文件系统的概念和作用,抽象出了文件系统概念模型。熟悉文件系统的内涵后,我们再近一步讨论Linux系统中和文件系统的特殊风格和具体文件系统在Linux中组成结构,为读者勾画出Linux中文件系统工作的全景图。最后,我们再通过Linux中最简单的Romfs 作实例分析实现文件系统的普遍步骤。(我们假定读者已经对Linux文件系统初步了解) 什么是文件系统 首先要谈的概念就是什么是文件系统,它的作用到底是什么。 文件系统的概念虽然许多人都认为是再清晰不过的了,但其实我们往往在谈论中或多或少地夸大或片缩小了它的实际概念(至少我时常混淆),或者说,有时借用了其它概念,有时说的又不够全面。 比如在操作系统中,文件系统这个术语往往既被用来描述磁盘中的物理布局,比如有时我们说磁盘中的“文件系统”是EXT2或说把磁盘格式化成FAT32格式的“文件系统”等——这时所说的“文件系统”是指磁盘数据的物理布局格式;另外,文件系统也被用来描述内核中的逻辑文件结构,比如有时说的“文件系统”的接口或内核支持Ext2等“文件系统”——这时所说的文件系统都是内存中的数据组织结构而并非磁盘物理布局。还有些时候说“文件系统”负责管理用户读写文件——这时所说的“文件系统”往往描述操作系统中的“文件管理系统”,也就是文件子系统。 虽然上面我们列举了混用文件系统的概念的几种情形,但是却也不能说上述说法就是错误的,因为文件系统概念本身就囊括众多概念,几乎可以说在操作系统中自内存管理、系统调度到I/O系统、设备驱动等各个部分都和文件系统联系密切,有些部分和文件系统甚至未必能明确划分——所以不能只知道文件系统是系统中数据的存储结构,一定要全面认识文件系统在操作系统中的角色,才能具备自己开发新文件系统的能力。 为了澄清文件系统的概念,必须先来看看文件系统在操作系统中处于何种角色,分析文件系统概念的内含外延。所以我们先抛开Linux文件系统的实例,而来看看操作系统中文件系统的普遍体系结构,从而增强对文件系统的理论认识。 下面以软件组成的结构图1[1]的方式描述文件系统所涉及的内容。 图1 :文件系统体系结构层次图 1[1]请参见OPERATION SYSTEMS INTERNALS AND DESIGN PRINCIPLES一书第12章

第5章_文件系统习题及答案

第五章文件系统习题 一、填空题 1.文件系统主要管理计算机系统的软件资源,即对于各种的管理。 【答案】文件 【解析】用户使用计算机来完成自己的某项任务时,总会碰到这样一些问题:其一,使用现有的软件资源来协助自己工作。例如,利用系统调用和利用库函数与实用程序等来减少编程的工作量,避开与硬件有关的部分。其二,编制完成的或未完成的程序存放在什么地方,需要访问的数据存放在什么地方。这实际上是怎样对软件资源进行透明的存放,并能透明地存取,文件系统也就应运而生了。 2.从用户的角度看,文件系统的功能是要实现①。为了达到这一目的,一般要建立② 【答案】①按名存取,②文件目录 【解析】文件系统的建立就是要让用户透明地对文件进行存取,这就要求文件系统要解决把每个文件的符号名与其所在的文件存储空间中的物理地址联系起来的问题,这也是文件系统最基本的功能。实现符号名与具体物理地址的转换,其主要环节是查目录。所以,文件目录的组织是文件系统研究的主要问题之一。 3.UNIX系统中,一般把文件分为①、②和③三种类型。 【答案】①普通文件、②目录文件、③特殊文件 【解析】普通文件既包括系统文件,也包括用户文件、库函数文件和实用程序文件。它主要指组织格式是无结构、无记录概念的字符流式文件。 目录文件则是由文件系统中的各个目录所形成的文件。 特殊文件(或设备文件)在UNIX系统中,每台设备都被看作为一个特殊文件。 4.串联文件是文件①组织的方式之一,其特点是用②来存放文件信息。 【答案】①物理,②非连续的物理块 【解析】串联文件结构中,每个物理块设有一个指针,指向其后续连接的另一个物理块,从而使得存放同一文件的物理块链接成一个串联队列。 5.文件存储器一般都被分成若干大小相等的①,并以它为单位进行②。 【答案】①物理块,②信息交换 【解析】文件存储空间的管理是文件系统的重要任务之一,磁盘、磁带是常见的文件存储器。 6.文件存储空间管理的基本方法有①、②。 【答案】位示图法、空闲块链接法。 【解析】文件存储空间的管理实质上是空闲块的组织和管理问题,它包括空闲块的分配与空闲块的回收等问题,这就要求对文件存储空间的空闲块进行有效的组织和管理。 7.目录文件是由①组成的,文件系统利用②完成“按名存取”和对文件信息的共享和保护。 【答案】①文件说明,②目录文件 【解析】从文件管理的角度看,一个文件包括两部分:文件说明和文件体。文件说明又称为文件控制块,它至少包括文件名和文件在文件存储器上的物理地址。这样一些文件说明就组成了目录文件。目录文件是实现按名存取的关键。 8.单级(一级)文件目录不能解决的问题。多用户系统所用的文件目录结构至少应是二级文件目录。 【答案】文件重名 【解析】因为单级文件目录表中,各文件说明项处于平等地位,只能按连续结构或顺序结构存放,因此,文件名与文件必须—一对应。如果两个不同的文件重名,则系统将把它们视为同一文件。在二级文件目录结构中,各文件的说明信息被组织成目录文件,且以用户为单位把各自的文件说明划分为不同的组,而把不同的、组名有关的存取控制信息存放在用户的主目录的目录项中。 9.大多数文件系统为了进行有效的管理,为用户提供了两种特殊操作,即在使用文件前应先①,文件使用完应②。 【答案】①打开文件,②关闭文件 【解析】打开文件就是把该文件有关的目录表复制到内存中约定的区域,使用户能实现按名存取。所谓关闭文件,就是当用户宣布这个文件当前不再使用时,系统将此文件在内存中的相应的目录表删除,因而也就断开了用户与这个文件的联系。 10.对于索引结构的文件,其索引表中主要应包含①和②两项内容。 【答案】①记录号、②该记录存放地址 【解析】索引结构的文件,其索引表中主要应包含“记录号”和“该记录存放地址”两项内容,对这种结构的文件既可按顺序访问,又可按随机方式访问。

操作系统课程设计模拟文件系统

操作系统课程设计模拟文 件系统 Newly compiled on November 23, 2020

目录第1章需求分析 (1) 第2章概要设计 (1) 系统的主要功能 (1) 系统模块功能结构 (1) 运行环境要求 (2) 数据结构设计 (2) 第3章详细设计 (3) 模块设计 (3) 算法流程图 (3) 第4章系统源代码 (4) 第5章系统测试及调试 (4) 运行结果及分析 (4) 系统测试结论 (5) 第6章总结与体会 (6) 第7章参考文献 (6) 附录 (7) 第1章需求分析 通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。

模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。 第2章概要设计 系统的主要功能 1) 系统运行时根据输入的用户数目创建主目录 2) 能够实现下列命令: Login 用户登录 Create 建立文件 Read 读取文件 Write 写入文件 Delete 删除文件 Mkdir 建立目录 Cd 切换目录 Logout 退出登录 系统模块功能结构 运行环境要求 操作系统windows xp ,开发工具vc++ 数据结构设计 用户结构:账号与密码结构 typedef struct users { char name[8]; char pwd[10]; }users;

简单文件系统的实现实验报告

操作系统课程设计报告简单文件系统的实现 专业: 班级: 姓名: 学号: 老师:

一、课程设计的目的 1. 通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。 二、课程设计要求 1. 在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。在退出该文件系统的使用时,应将该虚拟文件系统以一个Windows 文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。2文件存储空间的分配可采用显式链接分配或其他的办法。 3空闲磁盘空间的管理可选择位示图或其他的办法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,那么可以将位示图合并到FAT中。 文件目录结构采用多级目录结构。为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。 要求提供以下有关的操作命令: my_format:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。 my_mkdir:用于创建子目录。 my_rmdir:用于删除子目录。 my_ls:用于显示目录中的内容。 my_cd:用于更改当前目录。 my_create:用于创建文件。 my_open:用于打开文件。 my_close:用于关闭文件。 my_write:用于写文件。 my_read:用于读文件。 my_rm:用于删除文件。 my_exitsys:用于退出文件系统。 三、程序的设计细想和框图 1.打开文件函数fopen() (1)格式:FILE *fopen(const char *filename,const char *mode) (2)功能:按照指定打开方式打开指定文件。 (3)输入参数说明: filename:待打开的文件名,如果不存在就创建该文件。 mode:文件打开方式,常用的有: "r":为读而打开文本文件(不存在则出错)。 "w":为写而打开文本文件(若不存在则创建该文件;反之,则从文件起始位置写,原内容将被覆盖)。 "a":为在文件末尾添加数据而打开文本文件。(若不存在则创建该文件;反之,在原文件末尾追加)。 "r+":为读和写而打开文本文件。(读时,从头开始;在写数据时,新数据只覆盖所占的空间,其后不变) 。 "w+":首先建立一个新文件,进行写操作,随后可以从头开始读。(若文件存在,原内容将全部消失) 。 "a+":功能与"a"相同;只是在文件末尾添加新的数据后,可以从头开始读。 另外,上述模式字符串中都可以加一个“b”字符,如rb、wb、ab、rb+、wb+、ab+等组合,

相关文档
最新文档