操作系统 模拟linux文件管理系统
Unix文件系统模拟实验报告
一.实验任务和说明
这次实验是操作系统大型实验,要完成的任务是
模拟unix操作系统中的文件系统功能。在终端界面上用户可以象unix的shell命令一样输入一些命令,如输入ls 显示文件目录,chmod改变文件权限,chown改变文件拥有者,chgrp改变文件所属组,chnam改变文件名,pwd显示当前目录,cd改变当前目录,mkdir创建目录,rmdir删除目录,mk创建文件 ,cp文件拷贝,rm删除文件,cat显示文件内容,login切换用户,passwd修改用户口令 等功能。在后台,要实现混合索引式文件结构,包括用空闲结点号栈管理空闲结点和成组链接发管理空闲盘块。
二.实验需求分析、设计思路和总体方案
1
.基本思路:
用一个文件(disk.txt)模拟一个物理硬盘, 通过对该文件的一系列操作,模拟UNIX文件系统中的文件操作。
2
.理磁盘块的设计
:
卷盘块数等于100块,每个磁盘块512字节,磁盘块之间用/n隔开,总共是514字节。0#表示超块,1#--10#放索引结点,每个索引结点占64字节,共80个索引结点。初始化是存在根目录root,占用了0#结点和11#盘块。
3
.空闲磁盘块:
采用成组链接法管理。每组10块,12#--99#分为9组,每组的最后一个磁盘块里存放下一组的磁盘号信息。最后一组只有8块,加上0作为结束标志。在超块中用一个一维数组(10个元素)作为空闲磁盘块栈。放入第一组盘块。
4
.空闲
I
结点:
采用混合索引式文件结构。索引结点结构中文件物理地址为六项:四个直接块号,一个一次间址,一个两次间址,其中一次间址和两次间址中一个磁盘块中存放16个磁盘号 。在超块中也用一维数组(80个元素)作为空闲I结点栈,与空闲磁盘块管理不同的是这里不用采用成组链接法,这一维数组中存放所有I结点编号,而且一直保持同一大小秩序。根目录占0#索引结点,由于根目录不会删改,是一直占0#索引结点,所以我并未按实验指导所说,把它写在超块里,不过写进去也无所谓的。
5
操作系统 模拟linux文件管理系统
.超块,
I
结点和目录结构的设计
struct SUPERBLOCK//超块
{
int fistack[80];//空闲结点号栈 setw(3)*80
int fiptr;//空闲结点栈指针(还有多少个) setw(3)
int fbstack[10];//空闲盘块号栈 setw(3)*10
int fbptr;//空闲盘块号指针 setw(3)
int inum;//空闲i结点总数 setw(3)
int bnum;//空闲盘块总数 setw(3)
};
struct INODE//i结点(64B) 已保证了每两个数据之间有空格隔开
{
int fsize;//文件大小 setw(6)
int fbnum;//文件盘块数 setw(6)
int addr[4];//四个直接盘块号(0 ~ 512*4==2048) setw(3)*4
int addr1;//一个一次间址() setw(3)
int addr2;//一个两次间址() setw(3)
char owner[6];//文件拥有者 setw(6)
char group[6];//文件所属组 setw(6)
char mode[11];// 文件类别及存储权限 setw(12)
char ctime[9];//最近修改时间 setw(10)
};
操作系统 模拟linux文件管理系统
struct DIR//目录项(36B)
{
char fname[14];//文件名(当前目录) setw(15) (0 ~ 14)
int index;//i结点号 setw(3) (15 ~ 17)
char parfname[14];//父目录名 setw(15) (18 ~ 32)
int parindex;//父目录i结点号 setw(3) (33 ~ 35)
};
结点结构中的文件盘块数,目录项结构中的父目录名,父目录i结点号,其实可以不要,基本是不用到或是可以不用的,但是当我意识到时,程序已编得差不多了,为了避免牵一发而动全身,只好留着!
6
.用户,密码和组
我的用户组信息是存放在另一个文件
(user.txt)
中的。
三.各个主要功能模块(函数)的说明
1.main.cpp:
是程序的主函数模块
主函数首先会根据控制文件control.txt的头一个位(初始化确定位)来确定是否进行初始化。如果初始化,那么将只有一个根目录。因为一旦初始化后,初始化确定位就会置为0,所以系统只会在第一次进入时初始化,以后都是在前面建立的文件结构上进行操作的。如果一定要系统初始化时,可把control.txt的头一个位置为1,或者使用命令“reset”。
进入系统时,当前路径是根目录。然后是登陆请求。登陆后,超块读入内存(由一个结构对象superblock模拟),进入命令解析层,对用户的不同命令执行不同的操作。退出系统前,把内存的超块再写回disk.txt。
2.head.h:
是程序的所有全局变量、结构、函数声明的模块。也包括了所有要用到的系统库。
3.superblock.h:
是定义有关超块、结点、盘块、目录项的底层操作函数的模块。
1.对结点的操作:
操作系统 模拟linux文件管理系统
int ialloc(void);
申请一个i结点 返回结点号 否则返回-1。
返回的是空闲结点号栈中最小的结点号,结点用完时返回-1,申请失败。
void ifree(int index);
指定一个结点号,回收一个i结点。
先清空结点,然后插入栈中合适位置(必须保持结点号的有序性)。
void readinode(int index,INODE &inode);
读指定的i结点( n#结点,读指针应定位到514+64*n (64B)+2*(n/8) )到INOE inode寄存于对同一结点的大量操作
void writeinode(INODE inode,int index);
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说医药卫生操作系统大型试验在线全文阅读。
相关推荐: