当前位置:文档之家› 第七章 文件系统实验

第七章 文件系统实验

第七章 文件系统实验
【实验目的】
1.理解重要数据结构的意义。
2.掌握文件系统的工作机理。
3.学习较为复杂的linux下的编程。
【准备知识】
这是相对来说有一定难度的实验,它含盖了一个简单的二级文件系统的设计以及相关的接口命令编写的内容,也鉴于此把它放在了最后一个实验。"一分耕耘,一分收获",在完整的完成本实验,你将获得的收益是:对文件系统工作的机理,特别是linux的ext2文件系统工作机理了如指掌;linux下较强的编程能力。好了,从此开始:
一.外存管理
其实很早人们设计操作系统的时候就意识到一个问题:所有的程序和数据不可能都放在内存当中。所以为了腾出宝贵的内存空间,也为了方便用户管理外存上的文件,文件系统应运而生。文件系统是一个含有大量的文件及其属性,对文件进行操作、管理的软件,以及向用户提供使用文件的接口的一个集合。在逻辑上它的层次结构是这样的:

文件系统接口 对对象的操作和管理的软件集合 逻辑文件系统 基本I/O管理程序(文件组织模块) 基本文件系统(物理I/O层) I/O控制层(设备驱动程序) 对象及其属性说明
作为产品的操作系统目前种类已经很多了,一般来势它们有各自的文件系统。比如MS的WINDOWS系列使用的是FAT16、FAT32或NTFS的文件系统、LINUX使用的是EXT2、EXT3文件系统等等。
二.linux的EXT2文件系统
linux使用一个叫虚拟文件系统的技术从而可以支持多达几十种的不同文件系统,而EXT2是linux自己的文件系统。它有几个重要的数据结构,一个是超级块,用来描述目录和文件在磁盘上的物理位置、文件大小和结构等信息。inode也是一个重要的数据结构。文件系统中的每个目录和文件均由一个inode描述。它包含:文件模式(类型和存取权限)、数据块位置等信息。如果希望详细学习EXT2文件系统可以参看linux内核代码include/linux/ext2_fs.h、include/linux/ext2_fs_sb.h等文件。
一个文件系统除了重要的数据结构之外,还必须为用户提供有效的接口操作。比如EXT2提供的OPEN/CLOSE接口操作。
三.可能用到的编程技术
1.fopen,打开文件
格式:FILE *fopen(const char *filename,const char *mode)
需要头文件stdio.h
filename:待打开的文件名,如果不存在就创建改文件。
mode:打开方式,常用的有
"w"写方式打开,文件不存在就被创建,否则清除原来内容;
"r"读方式打开,文件必须存在;
"a"添加方式打开;
"w+"读写方式打开,有清楚功能;
"r+"读写方式打开,文件必须存在;

 "a+"
"t"TEXT方式打开;
"b"二进制方式打开
2.fwhite和fread,读写文件
size_t fwite(const void *buffer,size_t size,size_t count,FILE *stream);
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
buffer:待读写的内容;
size:一次读写的量;
count:需读写buffer的次数;
stream:打开的文件指针
3.fseek,定位文件
int fseek( FILE *stream, long offset, int origin );
stream:文件指针;
offset:偏移量;
origin:初始位置,有三个常量,SEEK_CUR是当前位置,SEEK_SET文件开头,SEEK_END文件尾。
四.用内存来模拟外存
真正的文件系统对外存进行管理,涉及到许多硬件、设备管理方面的底层技术,一方面这些技术不属于操作系统核心内容,一方面过多的内容不免造成实验者顾此失彼,所以这里推荐一种使用内存来模拟外存的方式,可以跳过这些硬件技术而直接把精力放在数据结构设计和操作算法设计上面。
假定pInode是一个指向inode结构的指针,而且它已经放入的需要放入的数值了,现在需要将其写入到特定位置。可用如下代码:
......
fd=fopen("filesystem","w+b"); //fd是FILE指针类型,w便是写方式,b表示二进制
fseek(fd, specific_area,SEEK_SET);// fd是文件指针;specific_area为整形,
// 为需要入pInode的位置
fwrite(pInode,1,sizeof(inode),fd); // 写入pInode信息
......
【实验内容】
1.根据前面的提示设计一个一级(单用户)文件系统程序,要求实现功能:
1)提供文件创建/删除接口命令create/delete、目录创建/删除接口命令midair/rmdir、显示目录内容命令ls
2)创建的文件不要求格式和内容。
2.在1基础上设计一个二级的文件系统,要求实现功能:
1)提供用户登录
2)文件、目录要有权限
【实验指导】
一.文件系统的数据结构
1)数据结构
struct inode
 {
struct inode *i_forw;
struct inode *i_back;
char i_flag;
unsigned int i_ino;
unsigned int i_count;
unsigned int di_addr[NADDR];
unsigned short di_number;
unsigned short di_mode;
unsigned short di_uid;
unsigned short di_gid;
unsigned short di_size;
};
 2)超级块
struct filsys
{
unsigned short s_isize;
unsigned long s_fsize;

unsigned int s_nfree;
unsigned short s_pfree;
unsigned int s_free[NICFREE];

unsigned int s_ninode;
unsigned short s_pinode;
unsigned int s_inode[NICINOD];
unsigned int s_rinode;

char s_fmod;
 };

在目录fs/下面有一个完整的二级文件系统的程序,可以加以借鉴。
基于Linux的

操作系统实验系统 第 1 页




相关主题
文本预览
相关文档 最新文档