版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 操作系统大型试验操作系统 模拟linux文件管理系统Unix文件系统模拟实验报告一实验任务和说明这次实验是操作系统大型实验,要完成的任务是模拟unix操作系统中的文件系统功能。在终端界面上用户可以象unix的shell命令一样输入一些命令,如输入ls 显示文件目录,chmod改变文件权限,chown改变文件拥有者,chgrp改变文件所属组,chnam改变文件名,pwd显示当前目录,cd改变当前目录,mkdir创建目录,rmdir删除目录,mk创建文件 ,cp文件拷贝,rm删除文件,cat显示文件内容,login切换用户,passwd修改用户口令 等功能。在后台,要实现混合索引式文件结构,包括
2、用空闲结点号栈管理空闲结点和成组链接发管理空闲盘块。二实验需求分析、设计思路和总体方案1基本思路:用一个文件模拟一个物理硬盘, 通过对该文件的一系列操作,模拟UNIX文件系统中的文件操作。2理磁盘块的设计:卷盘块数等于100块,每个磁盘块512字节,磁盘块之间用/n隔开,总共是514字节。0#表示超块,1#-10#放索引结点,每个索引结点占64字节,共80个索引结点。初始化是存在根目录root,占用了0#结点和11#盘块。3空闲磁盘块:采用成组链接法管理。每组10块,12#-99#分为9组,每组的最后一个磁盘块里存放下一组的磁盘号信息。最后一组只有8块,加上0作为结束标志。在超块中用一个一维数
3、组作为空闲磁盘块栈。放入第一组盘块。4空闲I结点:采用混合索引式文件结构。索引结点结构中文件物理地址为六项:四个直接块号,一个一次间址,一个两次间址,其中一次间址和两次间址中一个磁盘块中存放16个磁盘号 。在超块中也用一维数组作为空闲I结点栈,与空闲磁盘块管理不同的是这里不用采用成组链接法,这一维数组中存放所有I结点编号,而且一直保持同一大小秩序。根目录占0#索引结点,于根目录不会删改,是一直占0#索引结点,所以我并未按实验指导所说,把它写在超块里,不过写进去也无所谓的。5 操作系统 模拟linux文件管理系统超块,I结点和目录结构的设计struct SUPERBLOCK/超块int fist
4、ack80;/空闲结点号栈setw(3)*80int fiptr;/空闲结点栈指针(还有多少个)setw(3)int fbstack10;/空闲盘块号栈setw(3)*10int 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 addr4;/四个直接盘块号(0 512*4=2048) setw(3)*4int addr1;/一个一次
5、间址()setw(3)int addr2;/一个两次间址()setw(3)char owner6;/文件拥有者setw(6)char group6;/文件所属组setw(6)char mode11;/ 文件类别及存储权限setw(12)char ctime9;/最近修改时间setw(10); 操作系统 模拟linux文件管理系统struct DIR/目录项(36B)char fname14;/文件名(当前目录)setw(15) (0 14)int index;/i结点号setw(3)(15 17)char parfname14;/父目录名setw(15) (18 32)int parindex
6、;/父目录i结点号setw(3)(33 35);结点结构中的文件盘块数,目录项结构中的父目录名,父目录i结点号,其实可以不要,基本是不用到或是可以不用的,但是当我意识到时,程序已编得差不多了,为了避免牵一发而动全身,只好留着!6用户,密码和组我的用户组信息是存放在另一个文件()中的。三各个主要功能模块(函数)的说明:是程序的主函数模块主函数首先会根据控制文件的头一个位来确定是否进行初始化。如果初始化,那么将只有一个根目录。因为一旦初始化后,初始化确定位就会置为0,所以系统只会在第一次进入时初始化,以后都是在前面建立的文件结构上进行操作的。如果一定要系统初始化时,可把的头一个位置为1,或者使用命
7、令“reset”。进入系统时,当前路径是根目录。然后是登陆请求。登陆后,超块读入内存,进入命令解析层,对用户的不同命令执行不同的操作。退出系统前,把内存的超块再写回。:是程序的所有全局变量、结构、函数声明的模块。也包括了所有要用到的系统库。:是定义有关超块、结点、盘块、目录项的底层操作函数的模块。1对结点的操作: 操作系统 模拟linux文件管理系统int ialloc(void);申请一个i结点 返回结点号 否则返回-1。返回的是空闲结点号栈中最小的结点号,结点用完时返回-1,申请失败。void ifree(int index);指定一个结点号,回收一个i结点。先清空结点,然后插入栈中合适位
8、置。void readinode(int index,INODE &inode);读指定的i结点( n#结点,读指针应定位到514+64*n (64B)+2*(n/8) )到INOE inode寄存于对同一结点的大量操作void writeinode(INODE inode,int index);把INODE inode写回指定的i结点2对盘块的操作;用的是成组链接法。(n#盘块 读指针应定位到514*n)int balloc(void);申请一个盘块 返回盘块号 否则返回-1void bfree(int index);指定一个盘块号,回收一个盘块3对超块的操作;void readsuper(
9、void);读超块到内存SUPERBLOCK superblock;void writesuper(void);内存SUPERBLOCK superblock;写回超块4对目录项的操作( n#目录项读指针应定位514*index+36*n )便 操作系统 模拟linux文件管理系统void readdir(INODE inode,int index,DIR &dir);读指定目录项进临时对象DIR dir;void writedir(INODE inode,DIR dir,int index);目录项对象DIR dir写到指定目录项:是定义初始化函数的模块其中包括了对用户组的初始化:定义三个用
10、户adm,cnj和jtq,其中adm,cnj的组为adm,jtq的组为guest。用户的初始密码都为123。对超块的初始化 、对根目录文件结点的初始化 、对数据盘块的初始化。:定义了两个功能函数:1登陆 bool login(void); 要求输入用户信息,并判断是否合法。2改变用户密码 void changepassword(void); 改变当前用户的密码。6. :定义了有关文件操作的四个函数1创建文件void mk(char *dirname,char *content);当前目录下创建一个数据文件(规定目录文件只占1 4个盘块)。虽然不要求这个函数,但我觉得很有必要。而且,因为我使用了
11、两个参数,前一个表示文件名,后一个表示文件内容,可以在文件拷贝里使用这个函数。2删除文件void rm(char *filename);当前目录下删除指定数据文件3文件拷贝void cp(char*string);给定一个路径,把那个文件拷贝到当前目录下。首先要使用里面根据路径找到目标的函数找到对应文件,如果是数据文件的话,记录文件内容到一缓冲区,然后在当前目录下调用创建目录的函数,就完成了。4显示文件内容void cat(char *filename);显示当前目录下指定数据文件的内容。 操作系统 模拟linux文件管理系统7. :定义两个底层函数1bool havesame(char *d
12、irname,INODE inode,int &i,int &index2)判断对象inode指向的目录文件盘块中有无该名的目录项存在着,有返回1无返回0。同时,有该目录项的话,则按引用调用的i为待删子目录目录项下标 index2为目录项中的待删子目录的结点号2bool find(char *string)根据路径找到指定文件或目录。需要注意的是,使用此函数时当前路径跟着改掉了,所以使用前必须保存当前路径。万一找不到目标的话,可以还原为当前路径。定义了有关目录操作的四个功能函数,1void mkdir(char *dirname)当前目录下创建目录(规定目录文件只占一个盘块。为了降低难度,已设
13、定目录文件只占一个盘块。2void rmdir(char *dirname,int index)当前目录下删除目录。将要删除的目录可能非空。有两种策略:一、规定只能删除空目录。二、递归地将非空目录的所有子目录删除,让后再删除自己。第一种实现较简单,我使用了第二种策略。所以参数为 (子目录名,当前结点)。如果使用第一种策略的话,参数为只要子目录名就可以了。3void ls(void)显示当前结点的所有子目录4void cd(char *string)改变当前目录。有四中处理过程: string为“.”切换到当前目录;为“.”切换到父目录 ;为“/”切换到根目录;如果为一路径的话,就调用bool
14、find(char *string) 切换到指定目录。8. :定义一个底层函数: 操作系统 模拟linux文件管理系统bool havewpower(INODE inode)判断当前用户对指定的结点有无写权限定义四个功能函数:1void chmod(char *name)改变当前目录下指定文件的文件权限2void chown(char *name)改变当前目录下指定文件的文件拥有者(如拥有者在另一个组,那么组也要改掉)3void chgrp(char *name)改变当前目录下指定文件的文件所属组4void chnam(char *name)改变当前目录下指定文件的文件名:命令解析层函数模块。
15、接受用户命令,执行不同的操作。四命令格式及运行结果一开始为登陆请求。可选用户为:adm cnj jtq 密码都是123登陆后在根目录1pwd显示当前目录2mksome创建bin dev等 操作系统 模拟linux文件管理系统个目录这是我自己为方便添加的功能,2ls显示当前目录下所有子目录3mkdirdirname创建目录4mkfilename创建数据文件5rmdirdirname删除目录6cd .切换当前目录基本没用处cd .切换到父目录cd子目录名 操作系统 模拟linux文件管理系统切换到子目录cd /切换到根目录cd绝对路径切换到指定目录6cp路径把路径指定的文件拷贝到当前目录下7cat
16、 filename显示当前目录下指定数据文件的内容chmodname改变当前目录下指定文件或目录的权限模式chownname改变当前目录下指定文件或目录的拥有者chgrpname改变当前目录下指定文件或目录的所属组个人认为没用。可能是还不理解其用途。chnamname改变当前目录下指定文件或目录的名字 操作系统 模拟linux文件管理系统12rmfilename删除当前目录下指定文件13login当前用户注销新用户登陆14reset系统重置既是把初始化函数执行一下15exit安全退出系统。如果不是安全退出的话,超块不会写回内存。下次进入必须要系统重置五心得体会这次实验是有生以来写的最长的代码。多达1700行。至少花了本人一个半星期的时间。其中还包括两次通宵,n次夜班。写完后,自己都不敢相信自己写了那么多。很有成就感。嘎嘎其实,上课认真听了的话,从理论上理解UNIX文件系统并不难,最多是多
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论