
操作系统课程设计报告63861new.doc
15页操作系统课程设计班级: 计算机学院信息安全5班姓名: 王皓 学号: 200530501359 指导老师: 贺小箭 日期: 2008年2月 1. 课程设计任务及要求1.1设计任务 模拟实现Linux文件系统,模拟文件系统的前端操作shell,模拟文件系统的操作管理1.2设计要求1.2.1)实现Linux文件系统的基本操作功能在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟Linux文件系统可以实现以下功能:info 显示整个系统信息,目录名与文件名支持绝对路径与相对路径cd 改变目录dir 显示目录,Dir /s命令可显示所有子目录 md 创建目录rd 删除目录newfile 建立文件cat 打开文件copy 拷贝文件,除支持模拟Linux文件系统内部的文件拷贝外,还支持host文件系统与模拟Linux文件系统间的文件拷贝del 删除文件check 检测并恢复文件系统1.2.2) 实现命令解释器shell使用管理程序simdisk作为后台进程运行,利用本设计任务的shell操作simdisk。
实现在前端的shell进程和后端的simdisk进程之间利用共享内存进行进程间通信(IPC)1.2.3) 实现命令解释器shell实现多个进程同时对模拟文件系统进行操作设计管理程序simdisk的用户访问权限管理对模拟文件系统的操作要求做到:共享读,互斥写2 设计环境及设计思想2.1 设计环境 课程设计的环境是在Windows Xp操作系统下新建一个文件作为开辟的磁盘空间,编程工具使用的是VC++ 6.02.2 设计思想2.2.1)总体设计思想新建一个100M的文件“C:\\LinuxOs.dat”作为磁盘,通过对该文件进行操作来实现模拟Linux文件系统2.2.2)磁盘块分配将整个磁盘分为102400个小磁盘块,每个小磁盘块占用1ksuperblock(超级块)占用第一块,Inode位图占用2-5块,磁盘块位图占用6-405块,Inode区占用406-533块,剩余所有磁盘块用于文件内容的存储2.2.3)超级块struct Super_Block{ int Free_Inode; //空闲Inode数目 int Free_Block; //空闲Block数目}; superblock中记录了空闲的Inode节点数目Free_Inode与空闲的磁盘块数目Free_Block。
2.2.4)Inode位图与Block位图int Inode_Bitmap[Inode_Num]; //Inode位图int Block_Bitmap[Block_Num]; //Block位图本课程设计设计使用位图法记录空闲Inode节点与空闲Block块Inode位图Inode_Bitmap与Block位图Block_Bitmap记录了各个Inode节点与磁盘块是否为空,为1代表已被占用,为0代表未被占用2.2.5)Inode节点结构struct inode{ int decide; //判断是文件还是目录,4byte;0为目录,1为文件 char name[28]; //文件/目录名,28byte int First_Block; //所占用的第一块磁盘块地址,4byte int length; //文件内容长度,4byte int index; //在inode区中的编号,4byte int parent; //父索引节点,4byte int Child_Num; //子节点个数,4byte int child[15]; //子索引节点,15*4=60byte SYSTEMTIME ctime; //文件创建时间,16byte};每个文件与目录的相关信息使用Inode节点来进行记录。
每个文件与目录都占用一个Inode节点,Inode区共有1024个Inode节点,每个Inode节点大小为128byte,因此Inode区共占用1024*128byte=128k2.2.6)当前目录与当前目录索引int curr; //当前索引值struct inode* Curr_Inode; //当前inode索引指针char current[512]; //当前路径在刚进入文件系统时使用根目录作为当前目录,使用cd命令时改变当前目录3 程序设计流程及运行结果3.1 程序设计流程图判断该文件系统是否已创建过 是 否新建文件系统读取原文件系统信息接受并处理输入的命令 未输入exit命令关闭文件系统 exit3.2运行结果3.2.1)登陆初始界面显示命令列表,显示的当前目录为根目录。
3.2.2)info命令显示已使用的磁盘块数目,空闲磁盘块数目,目录的数目,文件数目3.2.3)cd命令可以使用绝对路径与相对路径进行cd命令,改变当前目录并显示3.2.4)dir命令显示指定目录下的子目录及文件,显示信息包括目录或文件名,类型,创建时间其中dir /s命令可显示所有子目录及文件当目录不存在时给出错提示信息3.2.5)md命令创建新目录,可以在指定目录或当前目录下创建目录,当重名时给出提示信息3.2.6)rd命令删除目录及其下所有的文件及子目录,当目录不为空时提示是否真要删除3.2.7)newfile命令创建新文件,在创建时可为文件输入内容,支持相对路径与绝对路径创建3.2.8)cat命令打开文件,显示文件内容,支持相对路径与绝对路径打开3.2.9)copy命令该命令可实现模拟系统内部文件的互相拷贝,模拟系统文件与外部文件之间的相互拷贝其中拷贝源端必须存在;拷贝目的端是内部文件时应未被创建过若使用内部文件,路径前应加上“L:”;若使用外部文件,路径前应加上该路径的根目录,例如“C:”,若是完整路径,应加上“C:\\”a) 内部文件到外部文件的拷贝其中若外部文件使用相对路径时,文件存放于本vc++6.0工程文件夹下。
b) 内部文件之间的拷贝无论使用相对路径还是绝对路径,路径前都应加上“L:”c) 外部文件到内部文件的拷贝3.2.10)del命令对指定文件进行删除,支持相对路径与绝对路径,若不存在该文件时给出出错提示3.2.11)check命令对文件系统中各文件与目录的Inode节点进行检查,若Inode节点中dicide值出现异常,将其置为空节点3.2.12)exit命令退出文件系统,并对信息进行保存,若不通过exit命令退出则不保存信息3.2.13)help命令显示出命令列表,提供帮助4 选取算法优缺点分析4.1判断文件与目录是否存在在刚开始编写代码时,我直接使用一个search函数来判断文件和目录是否存在,但在随后的编程中,我发现不少代码段都需要判断该文件的父目录是否存在比如md,newfile命令,要判断清楚到底是父目录下不存在该文件还是父目录根本不存在因此我重新写了一个Get_Parent函数来寻找父目录,再在父目录下使用search函数来判断这样虽然增加了search的复杂度,但增加了代码的可复用性,简化了后面的编程4.2目录的删除 由于删除目录不仅要删除该目录,还要删除该目录下所有的子目录和文件,可以归结到树的相关操作,我使用递归来实现目录的删除。
空目录及文件可直接删除,若目录不为空时,进入其子目录进行递归递归算法优点在于代码简明易懂,缺点在于使程序性能变差4.3 采用位图方式及连续分配使用位图方式记录空闲Inode节点及空闲块;使用连续分配方式来分配磁盘块这样做的优点在于:实现简单,只需对数组进行操作,并且在记录文件时只需记录下首磁盘块First_Block和文件的块数;读操作性能好,只需单次操作即能读出整个文件缺点在于:随着读入文件的增多,磁盘会变得零碎5 课程设计总结及心得体会本次课程设计要求模拟Linux系统文件系统,这样不仅要求编写者要有一定的编码能力,而且要清楚Linux文件系统具体实现方式,能够从复杂的实现中建立一个较为清晰简便的模型首先我温习了课本上关于文件系统的相关知识,归纳出一个简易且思路较为清晰的模型,这样大大加深了我对文件系统的掌握接着,在编码过程中,我也遇到了不少困难:在处理文件路径时字符串的操作相当繁琐,甚至出现了定义野指针的错误;考虑问题不能从全局上全面地把握,导致在编程过程中漏掉某些情况或编写功能重复的代码等等最后,我也从本次课程设计中获得一些心得:尽可能将功能分解成小的功能模块,这样可以提高代码的可复用性;尽可能使函数名及变量名意义一目了然,方便以后的使用及修改;在编码之前,需要弄清程序的流程图,以免遗漏功能或编写重复代码。
总的来说,本次课程设计使我更深地认识到了Linux文件系统的工作原理,提高了我编写代码的能力,虽然付出了比较多的精力,但是我觉得很有收获最后感谢授课老师与助教的悉心指导与帮助!。
