操作系统课程设计--基于Linux的模拟文件系统的设计与实现
操作系统课程设计linux下的二级文件系统方案

学生课程设计报告实验课名称:操作系统实验项目名称:文件系统设计专业名称:计算机科学与技术班级:-----------学号:-----------学生姓名:-----------教师姓名:-----------2014 年 6 月 30 日一、课程设计的目的..........................二、课程设计的内容及要求................... 内容.......................................... 要求..........................................三、实现原理.................................四、关键算法实现流程图 ..................... 流程图........................................ 关键算法......................................五、软件运行环境及限制 ..................... 六.结果输出及分析.......................... 七.心得体会.................................一.课程设计的目的本课程设计是学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让我更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强了我的动手能力。
二.课程设计的内容及要求1.实验内容通过一个简单的二级文件系统设计,加深对文件系统的内部功能以及内部实现的理解。
要求模拟采用二级目录结构的磁盘文件系统的文件操作,能实现以下几条命令,用输入命令来模拟用户程序中调用的文件操作:Login 用户登录Dir 列文件目录(列出文件名、物理地址、保护码和文件长度)Create 创建文件Delete 删除文件Open 打开文件Close 关闭文件Read 读文件Write 写文件源文件可以进行读写保护2.实验要求文件系统管理中用到的数据结构有:①首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
操作系统课程设计实验报告(以Linux为例)

目录目录 0一、实验环境 (1)二、实验报告总体要求 (1)实验一编译L INUX内核 (2)实验二观察L INUX行为 (6)实验三进程间通信 (13)一、实验环境Linux平台◆硬件平台:普通PC机硬件环境。
◆操作系统:Linux环境,例如,红旗Linux或Red Hat Linux;启动管理器使用GRUB。
◆编译环境:伴随着操作系统的默认gcc环境。
◆工作源码环境:一个调试的内核源码,版本不低于2.4.20。
二、实验报告总体要求在2013年11月25日前提交实验报告。
实验报告至少要求包含以下内容:1.引言:概述本次实验所讨论的问题,工作步骤,结果,以及发现的意义。
2.问题提出:叙述本篇报告要解决什么问题。
注意不可以抄写实验要求中的表述,要用自己的话重新组织我们这里所提出的问题。
3.解决方案:叙述如何解决自己上面提出的问题,可以用小标题 3.1,3.2…等分开。
这是实验报告的关键部分,请尽量展开来写。
注意,这部分是最终课程设计的基本分的部分。
这部分不完成,本课程设计不会及格。
4.实验结果:按照自己的解决方案,有哪些结果。
结果有异常吗?能解释一下这些结果吗?同别人的结果比较过吗?注意,这部分是实验报告出彩的地方。
本课程设计要得高分,应该在这部分下功夫。
5.结束语:小结并叙述本次课程设计的经验、教训、体会、难点、收获、为解决的问题、新的疑惑等。
6.附录:加了注释的程序清单,注释行数目至少同源程序行数目比1:2,即10行源程序,至少要给出5行注释。
操作系统课程设计实验报告实验一编译Linux内核实验时间6小时实验目的认识Linux内核的组成,掌握配置、编译、安装Linux内核的步骤。
实验目标下载2.6.19或更新的Linux内核,配置该内核使其支持NTFS,并在新的内核中修改其版本为Linux NameTestKernel x.x.x,其中,Name是你的名字(汉语拼音);x.x.x是新内核的版本号,最后在你的机器上编译安装这个新内核。
操作系统课程设计通过模拟文件系统的实现

目录一、课程设计题目和目的 (1)二、课程设计要求 (1)三、程序设计思想 (1)四、文件系统的实现 (1)1.数据结构设计 (1)2.程序功能图 (2)3.实体关系图 (3)4.数据流图.................................................. 错误!未定义书签。
5.程序流程图 (3)(1) .建立文件:create(文件名,记录长度) (4)(2) .写文件:write(文件名,开始位置,字符串) (5)(3) .读文件:read(文件名,开始位置,长度) (6)(4) .显示文件所有内容 type(文件名) ....................... 错误!未定义书签。
(5) .删除文件delete(文件名) .............................. 错误!未定义书签。
(6) .重命名文件ren(文件名,新文件名) ..................... 错误!未定义书签。
(7) .查询文件属性ask(文件名) ............................. 错误!未定义书签。
(8) .关闭文件close(文件名) ............................... 错误!未定义书签。
五、程序运行结果及分析 (8)六、课程设计总结 (10)七、参考文献 (11)八、附录 (12)一、课程设计题目和目的通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
二、课程设计要求通过组长分工,我主要完成了如下几个功能的操作:1.创建文件:从命令中得到文件名,得到该文件的文件长度,建立文件。
修改目录表。
4.读文件:read [文件名] [显示开始字节] [显示的字节数] ,直接显示所需要的字节数。
基于Linux的模拟文件系统的设计与实现

中北大学操作系统课程设计说明书学院、系:软件学院专业:软件工程学生姓名:任彬学号:0921010132 设计题目:基于Linux的模拟文件系统的设计与实现起迄日期: 2011年12月22日- 2012年1月7日指导教师:康珺2012 年 1月 7 日1.需求分析本次课程设计题目为“基于Linux的模拟文件系统的设计与实现”,要求在linux开源环境下,通过使用系统库函数以及操作命令,模拟实现典型文件系统,实现文件的各项基本操作,以此加深对所学文件操作的了解以及操作方法的特点。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深教材中的重要算法的理解,同时通过编程实现这些算法,更好地掌握操作系统的远离及实现方法,提高综合运用各专业课知识的能力。
根据实验要求可将系统功能简述如下:(1)设计一个10个用户的文件系统。
每个用户最多可以保存10个文件,一次运行用户可打开多个文件。
(2)程序采用二级文件目录。
(即设置主目录(MFD)和用户文件目录(UFD))。
另外,可打开文件设置指针。
(3)为了方便实现,对文件的读写作了简化。
在执行读写命令时,只需改读写指针。
并不进行实际的读写操作。
(4)实现目录的相关操作:改变目录(CD),创建目录(MD),显示目录(DIR),删除目录(RD)。
(5)实现文件的相关操作:打开文件(open),关闭文件(close),创建一个新文件(create),删除一个文件(delete),写文件(write),读文件(read)。
(6)考虑特殊情况如:目录不存在时,给出错误信息;不能用cd进入文件;命令之中不能有空格(如ex it,给出错误提示);新建目录或文件时的问题、重名问题、目录或文件的名字长度限制、目录或文件的名字中包含不合法字符(注意空格)、删除目录或文件时的问题、删除不存在的文件或目录给出错误提示、删除目录时目录不为空(如果该目录为空,则可删除,否则给出是否做删除提示,删除操作将该目录下的全部文件和子目录都删除)、进入到某个目录下,却要删除本目录或上级目录、不能用delete删除目录、不能用RD删除文件等。
操作系统课程设计--为linux系统设计一个简单的二级文件系统

操作系统课程设计报告题目: 为Linux系统设计一个简单的二级文件系统指导老师:时间:2021.8.30一课程设计的目的课程设计目的使学生熟悉文件管理系统的设计方法;加深对所学各种文件操作的了解及其操作方法的特点。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
二课程设计的要求1.可以实现下列几条命令:login用户登录dir 列目录create创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件可以进行读写保护三算法设计本次二级文件系统主要分为五大模块,分别是用户登录模块、新建目录模块、新建文件模块、删除文件模块和读取文件模块。
用户登录成功后才可以进行其他模块的操作。
1 用户登录模块用户登录模块要求用户输入用户,当输入正确后才能进行其他模块操作,否则提示用户名不存在并询问用户是否用此名进行注册。
若用户名未满,则提示注册成功,否则提示用现有注册用户,进行登录,并返回到登录界面。
用户登录模块流程图如图1所示。
图1 用户登录模块流程图2新建文件模块新建文件模块是在用户出入create 指令后进行的,进入后会要求用户输入文件名,并判断文件名是否存在,若没有则在要求用户输入文件读写权限,否则重新输入新的文件名。
新建文件模块流程图如图2所示。
图2 新建文件流程图3 删除文件模块删除文件模块是根据用户鼠标右击时选择到的节点来确定要删除节点的名字与路径,然后判断该节点是目录还是文件。
若是文件则直接删除文件,若是目录则进入该目录再删除其全部文件。
删除文件模块流程图如图4所示。
图4 删除文件模块流程图4读取文件模块读取文件模块,要求用户要在文件打开的前提下,将磁盘中的内容读取到内存中。
模拟文件系统的设计与实现

中北大学操作系统课程设计说明书学院、系:软件学院专业:软件工程学生姓名:xxx 学号:xxx设计题目:模拟文件系统的设计与实现起迄日期: 2015年12月28日- 2016年1月8日指导教师:xxx2016 年1月8日1需求分析通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力;掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,并了解操作系统的发展动向和趋势。
模拟二级文件管理系统的课程设计目的是通过研究Linux的文件系统结构,模拟设计一个简单的二级文件系统,第一级为主目录文件,第二级为用户文件。
2总体设计结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。
文件的创建: create 文件关闭:close 文件的打开:open文件的读:read 文件的写:write 文件关闭:close删除文件:delete 创建子目录:mkdir 删除子目录:rmdir列出文件目录:dir 退出:exit系统执行流程图3.详细设计 主要数据结构:#define MEM_D_SIZE 1024*1024 //总磁盘空间为1M #define DISKSIZE 1024 //磁盘块的大小1K #define DISK_NUM 1024//磁盘块数目1K#define FATSIZE DISK_NUM*sizeof(struct fatitem) //FAT 表大小 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1//根目录起始盘块号 #define ROOT_DISK_SIZE sizeof(struct direct)//根目录大小#define DIR_MAXSIZE 1024 //路径最大长度为1KB #define MSD 5 //最大子目录数5 #define MOFN 5//最大文件深度为5 #define MAX_WRITE 1024*128 //最大写入文字长度128KBstruct fatitem /* size 8*/ { int item; /*存放文件下一个磁盘的指针*/ char em_disk; /*磁盘块是否空闲标志位 0 空闲*/};struct direct { /*-----文件控制快信息-----*/ struct FCB { char name[9]; /*文件/目录名 8位*/char property; /*属性 1位目录 0位普通文件*/int size; /*文件/目录字节数、盘块数)*/int firstdisk; /*文件/目录起始盘块号*/int next; /*子目录起始盘块号*/int sign; /*1是根目录 0不是根目录*/}directitem[MSD+2];};struct opentable{struct openttableitem{char name[9]; /*文件名*/int firstdisk; /*起始盘块号*/int size; /*文件的大小*/}openitem[MOFN];int cur_size; /*当前打文件的数目*/};管理文件的主要代码:int create(char *name){int i,j;if(strlen(name)>8) /*文件名大于 8位*/return(-1);for(j=2;j<MSD+2;j++) /*检查创建文件是否与已存在的文件重名*/ {if(!strcmp(cur_dir->directitem[j].name,name))break;}if(j<MSD+2) /*文件已经存在*/return(-4);for(i=2;i<MSD+2;i++) /*找到第一个空闲子目录*/{if(cur_dir->directitem[i].firstdisk==-1)break;}if(i>=MSD+2) /*无空目录项*/return(-2);if(u_opentable.cur_size>=MOFN) /*打开文件太多*/return(-3);for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++) /*找到空闲盘块 j 后退出*/ {if(fat[j].em_disk=='0')break;}if(j>=DISK_NUM)return(-5);fat[j].em_disk = '1'; /*将空闲块置为已经分配*//*-----------填写目录项-----------------*/strcpy(cur_dir->directitem[i].name,name);cur_dir->directitem[i].firstdisk = j;cur_dir->directitem[i].size = 0;cur_dir->directitem[i].next = j;cur_dir->directitem[i].property = '0';/*---------------------------------*/fd = open(name);return 0;}int open(char *name){int i, j;for(i=2;i<MSD+2;i++) /*文件是否存在*/{if(!strcmp(cur_dir->directitem[i].name,name))break;}if(i>=MSD+2)return(-1);/*--------是文件还是目录-----------------------*/if(cur_dir->directitem[i].property=='1')return(-4);/*--------文件是否打开-----------------------*/ for(j=0;j<MOFN;j++){if(!strcmp(u_opentable.openitem[j].name,name))break;}if(j<MOFN) /*文件已经打开*/return(-2);if(u_opentable.cur_size>=MOFN) /*文件打开太多*/return(-3);/*--------查找一个空闲用户打开表项-----------------------*/for(j=0;j<MOFN;j++){if(u_opentable.openitem[j].firstdisk==-1)break;}/*--------------填写表项的相关信息------------------------*/u_opentable.openitem[j].firstdisk = cur_dir->directitem[i].firstdisk; strcpy(u_opentable.openitem[j].name,name);u_opentable.openitem[j].size = cur_dir->directitem[i].size;u_opentable.cur_size++;/*----------返回用户打开表表项的序号--------------------------*/return(j);}int close(char *name){int i;for(i=0;i<MOFN;i++){if(!strcmp(u_opentable.openitem[i].name,name))break;}if(i>=MOFN)return(-1);/*-----------清空该文件的用户打开表项的内容---------------------*/strcpy(u_opentable.openitem[i].name,"");u_opentable.openitem[i].firstdisk = -1;u_opentable.openitem[i].size = 0;u_opentable.cur_size--;return 0;}int write(int fd, char *buf, int len){char *first;int item, i, j, k;int ilen1, ilen2, modlen, temp;/*----------用 $ 字符作为空格 # 字符作为换行符-----------------------*/ char Space = 32;char Endter= '\n';for(i=0;i<len;i++){if(buf[i] == '$')buf[i] = Space;else if(buf[i] == '#')buf[i] = Endter;}/*----------读取用户打开表对应表项第一个盘块号-----------------------*/ item = u_opentable.openitem[fd].firstdisk;/*-------------找到当前目录所对应表项的序号-------------------------*/ for(i=2;i<MSD+2;i++){if(cur_dir->directitem[i].firstdisk==item)break;}temp = i; /*-存放当前目录项的下标-*//*------找到的item 是该文件的最后一块磁盘块-------------------*/while(fat[item].item!=-1){item =fat[item].item; /*-查找该文件的下一盘块--*/}/*-----计算出该文件的最末地址-------*/first = fdisk+item*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE;/*-----如果最后磁盘块剩余的大小大于要写入的文件的大小-------*/if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len){strcpy(first,buf);u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len; }else{for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++){/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/first[i] = buf [i];}/*-----计算分配完最后一块磁盘的剩余空间(字节) 还剩下多少字节未存储-------*/ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);ilen2 = ilen1/DISKSIZE;modlen = ilen1%DISKSIZE;if(modlen>0)ilen2 = ilen2+1; /*--还需要多少块磁盘块-*/for(j=0;j<ilen2;j++){for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)/*寻找空闲磁盘块*/{if(fat[i].em_disk=='0')break;}if(i>=DISK_NUM) /*--如果磁盘块已经分配完了-*/return(-1);first = fdisk+i*DISKSIZE; /*--找到的那块空闲磁盘块的起始地址-*/if(j==ilen2-1) /*--如果是最后要分配的一块-*/{for(k=0;k<len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE)-j*DISKSIZE; k++)first[k] = buf[k];}else/*-如果不是要最后分配的一块--*/{for(k=0;k<DISKSIZE;k++)first[k] =buf[k];}fat[item].item = i; /*--找到一块后将它的序号存放在上一块的指针中-*/fat[i].em_disk = '1'; /*--置找到的磁盘快的空闲标志位为已分配-*/fat[i].item = -1; /*--它的指针为 -1 (即没有下一块)-*/}/*--修改长度-*/u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len;cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len;}return 0;}int read(int fd, char *buf){int len = u_opentable.openitem[fd].size;char *first;int i, j, item;int ilen1, modlen;item = u_opentable.openitem[fd].firstdisk;ilen1 = len/DISKSIZE;modlen = len%DISKSIZE;if(modlen!=0)ilen1 = ilen1+1; /*--计算文件所占磁盘的块数-*/first = fdisk+item*DISKSIZE; /*--计算文件的起始位置-*/for(i=0;i<ilen1;i++)if(i==ilen1-1) /*--如果在最后一个磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j] = first[j];}else /*--不在最后一块磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j] = first[j];item = fat[item].item; /*-查找下一盘块-*/first = fdisk+item*DISKSIZE;}}return 0;}int del(char *name){int i,cur_item,item,temp;for(i=2;i<MSD+2;i++) /*--查找要删除文件是否在当前目录中-*/ {if(!strcmp(cur_dir->directitem[i].name,name))break;}cur_item = i; /*--用来保存目录项的序号,供释放目录中-*/if(i>=MSD+2) /*--如果不在当前目录中-*/return(-1);if(cur_dir->directitem[cur_item].property!='0') /*--如果删除的(不)是目录-*/ return(-3);for(i=0;i<MOFN;i++) /*--如果文件打开,则不能删除,退出-*/{if(!strcmp(u_opentable.openitem[i].name,name))return(-2);}item = cur_dir->directitem[cur_item].firstdisk;/*--该文件的起始盘块号-*/ while(item!=-1) /*--释放空间,将FAT表对应项进行修改-*/{temp = fat[item].item;fat[item].item = -1;fat[item].em_disk = '0';item = temp;}/*-----------------释放目录项-----------------------*/cur_dir->directitem[cur_item].sign = 0;cur_dir->directitem[cur_item].firstdisk = -1;strcpy(u_opentable.openitem[cur_item].name,"");cur_dir->directitem[cur_item].next = -1;cur_dir->directitem[cur_item].property = '0';cur_dir->directitem[cur_item].size = 0;return 0;}主函数:int main(){FILE *fp;char ch;char a[100];char code[11][10];char name[10];int i,flag,r_size;char *contect;contect = (char *)malloc(MAX_WRITE*sizeof(char));if((fp=fopen("disk.dat","rb"))==NULL){printf("You have not format,Do you want format?(y/n)");scanf("%c",&ch);if(ch=='y'){initfile();printf("Successfully format! \n");}else{return 0;}}enter();print();show();strcpy(code[0],"exit");strcpy(code[1],"create"); strcpy(code[2],"open");strcpy(code[3],"close"); strcpy(code[4],"write"); strcpy(code[5],"read");strcpy(code[6],"del");strcpy(code[7],"mkdir"); strcpy(code[8],"rmdir"); strcpy(code[9],"dir");strcpy(code[10],"cd");while(1){scanf("%s",a);for(i=0;i<11;i++){if(!strcmp(code[i],a))break;}switch(i){case 0: //退出文件系统free(contect);halt();return 0;case 1: //创建文件scanf("%s",name);flag = create(name);if(flag==-1){printf("Error: \n The length is too long !\n");}else if(flag==-2){printf("Error: \n The direct item is already full !\n");}else if(flag==-3){printf("Error: \n The number of openfile is too much !\n");}else if(flag==-4){printf("Error: \n The name is already in the direct !\n");}else if(flag==-5){printf("Error: \n The disk space is full!\n");}else{printf("Successfully create a file! \n");}show();break;case 2://打开文件scanf("%s",name);fd = open(name);if(fd == -1){printf("Error: \n The open file not exit! \n");}else if(fd == -2){printf("Error: \n The file have already opened! \n");}else if(fd == -3){printf("Error: \n The number of open file is too much! \n");}else if(fd == -4){printf("Error: \n It is a direct,can not open for read or write! \n");}else{printf("Successfully opened! \n");}show();break;case 3://关闭文件scanf("%s",name);flag = close(name);if(flag == -1){printf("Error:\n The file is not opened ! \n");}else{printf("Successfully closed! \n");}show();break;case 4://写文件if(fd ==-1){printf("Error:\n The file is not opened ! \n");}else{printf("Please input the file contect:");scanf("%s",contect);flag=write(fd,contect,strlen(contect));if(flag == 0){printf("Successfully write! \n");}else{printf("Error:\n The disk size is not enough! \n");}}show();break;case 5://读文件if(fd ==-1){printf("Error:\n The file is not opened ! \n");}else{flag = read(fd,contect);if(flag == 0){for(i=0;i<u_opentable.openitem[fd].size;i++){printf("%c",contect[i]);}printf("\t\n");}}show();break;case 6://删除文件scanf("%s",name);flag = del(name);if(flag == -1){printf("Error:\n The file not exit! \n");}else if(flag == -2){printf("Error:\n The file is opened,please first close it ! \n");}else if(flag == -3){printf("Error:\n The delete is not file ! \n");}else{printf("Successfully delete! \n");}show();break;}}}程序运行截图:.4.心得体会在设计的过程中,我查询了不少相关资料,不断地发现问题、提出问题、解决问题。
操作系统课程设计--基于Linux的模拟文件系统的设计与实现

简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。
这个系统是由世界各地的成千上万的程序员设计和实现的。
其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。
Linux不仅为用户提供了强大的操作系统功能,而且还提供了丰富的应用软件。
用户不但可以从Internet上下载Linux及其源代码,而且还可以从Internet上下载许多Linux的应用程序。
可以说,Linux本身包含的应用程序以及移植到Linux上的应用程序包罗万象,任何一位用户都能从有关Linux的网站上找到适合自己特殊需要的应用程序及其源代码,这样,用户就可以根据自己的需要下载源代码,以便修改和扩充操作系统或应用程序的功能。
这对Windows NT、Windows98、MS-DOS或OS/2等商品化操作系统来说是无法做到的。
Linux具有:稳定、可靠、安全的优点,并且有强大的网络功能。
其中有对读、写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。
在相关软件的支持下,可实现WWW、FTP、DNS、DHCP、E-mail等服务,还可作为路由器使用,利用IPCHAINS/IPTABLE网络治理工具可构建NAT及功能全面的防火墙。
Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。
Linux 操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。
它还包括带有多个窗口管理器的X-Windows图形用户界面,如同我们使用Windows NT一样,允许我们使用窗口、图标和菜单对系统进行操作。
1需求分析 (2)1.1 功能介绍 (2)1.2 目的及意义 (4)1.2.1 目的 (4)1.2.2 意义 (5)1.3 设计成果 (6)2总体设计 (7)2.1功能介绍 (7)2.2模块关联 (8)3详细设计 (11)3.1用户结构 (11)3.2数据结构说明 (11)3.3主要功能的关键代码 (12)4测试及运行结果 (17)4.1 测试定义 (17)4.2 测试目的 (17)4.3 测试结果 (18)4.3.1 文件测试 (18)5心得 (40)1需求分析1.1 功能介绍基于Linux的模拟文件系统的设计与实现完成以下功能:(1)创建用户:手动的创建10个用户,都在界面上完成,输入用户名;每个用户最多可以保存10个文件。
操作系统课程设计-文件系统的模拟设计

操作系统课程设计报告题目:文件系统的模拟设计一、设计目的本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
二、设计内容(1)概述为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:1.可以实现下列几条命令:login 用户登录dir 列目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件cd 进出目录2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件可以进行读写保护(2)设计原理和系统总体功能框架图1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。
2、文件物理结构可采用显式链接或其他方法。
3、磁盘空闲空间的管理可选择位示图或其他方法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。
4、文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
5、对文件或目录的操作采用windows系统的API函数来实现。
6、设计一个较实用的用户界面,方便用户使用。
要求提供以下相关文件操作:用户登录、创建目录、删除目录、创建文件、删除文件、读文件、写文件、复制文件、移动文件、返回根目录、退出。
功能结构图如图1.0所示:(3)详细设计及少数重要编码的说明这次课程设计中,我负责4个板块,分别是显示列表函数和目录、创建函数文件创建函数、打开文件函数和关闭文件系统函数。
①、显示列表函数和目录流程图如图1.1所示②、文件创建函数算法:查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以‘###’结束。
申请inode空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。
操作系统课程设计Linux

操作系统课程设计Linux一、教学目标本课程的教学目标是使学生掌握Linux操作系统的核心概念、原理和应用技能。
通过本课程的学习,学生将能够:1.理解操作系统的基本原理,包括进程管理、内存管理、文件系统和输入/输出系统。
2.掌握Linux操作系统的安装、配置和管理方法。
3.熟练使用Linux命令行界面,进行日常操作和系统管理。
4.掌握Linux常用命令、 shell脚本编写和系统监控工具的使用。
5.了解Linux操作系统在服务器、嵌入式设备和云计算等领域的应用。
二、教学内容本课程的教学内容分为五个部分:1.操作系统概述:介绍操作系统的定义、功能和分类,以及Linux操作系统的历史和发展。
2.进程管理:讲解进程的基本概念、进程控制、进程同步和互斥、死锁及其解决方法。
3.内存管理:介绍内存分配与回收策略、内存保护、虚拟内存和分页分段机制。
4.文件系统:讲解文件和目录结构、文件访问控制、文件系统性能优化和磁盘空间分配策略。
5.输入/输出系统:介绍I/O设备管理、中断和DMA机制、设备驱动程序和I/O调度策略。
三、教学方法本课程采用多种教学方法相结合的方式,以提高学生的学习兴趣和主动性:1.讲授法:教师讲解操作系统的核心概念和原理,引导学生掌握基本知识。
2.讨论法:学生针对实际案例和问题进行讨论,培养学生的思考和分析能力。
3.案例分析法:分析Linux操作系统的实际应用案例,使学生了解操作系统的应用场景。
4.实验法:安排实验室课时,让学生亲自动手进行系统安装、配置和调试,提高学生的实践能力。
四、教学资源本课程的教学资源包括:1.教材:选用权威、实用的Linux操作系统教材,如《Linux操作系统原理与应用》。
2.参考书:提供相关的学术论文、技术博客和在线文档,供学生拓展阅读。
3.多媒体资料:制作课件、教学视频和演示文稿,辅助学生理解和记忆。
4.实验设备:提供Linux服务器、虚拟机和实验室环境,让学生进行实际操作。
基于Linux的模拟文件系统的设计实现

中北大学操作系统课程设计说明书学院、系:软件学院专业:软件工程学生姓名:戴国鹏学号:1121011532 设计题目:基于Linux的模拟文件系统的设计与实现起迄日期: 2013年11月22日- 2013年12月6日指导教师:李玉蓉2013年 12月 6 日1.需求分析(1)设计目的:文件管理是操作系统的重要功能之一。
用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而加深学生对文件系统内部功能和内部实现的理解和认识。
(2)基本功能:主要包括:改变目录(CD),创建目录(MD),显示目录(DIR),删除目录(RD),打开全部文件(openall),打开单个文件(open),建立一个文件(create),删除一个文件(delete),写文件(write),读文件(read),改文件的保护码(change),退出(exit)等。
(3)设计要求:①设计一个10个用户的文件系统。
每个用户最多可以保存10个文件,一次运行用户可打开多个文件。
②程序采用二级文件目录。
(即设置主目录(MFD)和用户文件目录(UFD))。
另外,可打开文件设置指针。
③为了方便实现,对文件的读写作了简化。
在执行读写命令时,只需改读写指针。
并不进行实际的读写操作。
2.总体设计2.1数据结构struck file{char name[10];int code;//保护码int size;char pwrite;//读写指针};struct user{char name[10];struct file *list;//目录指针};2.2主要函数声明void running();void delet();void write();;void open();void close();void bye();void read();void create();void input();2.3模块结构图3.详细设计3.1 模块及功能说明3.1.1 input()模块功能:进入文件系统。
操作系统课程设计报告Linux二级文件系统设计

操作系统课程设计报告Linux二级文件系统设计操作系统课程设计报告专业:计算机科学与技术学号:********姓名:***提交日期:2021-3-8操作系统课程设计报告【设计目的】(1)本实验的目的就是通过一个直观多用户文件系统的设计,增进认知文件系统的内部功能和内部同时实现。
(2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。
(3)通过分后对实际问题的分析、设计、编程同时实现,提升学生实际应用领域、编程的能力【设计内容】二级文件系统设计【实验环境】c++/vc++【相关知识综述】1.背景知识(1)外存管理文件系统就是一个所含大量的文件及其属性,对文件展开操作方式、管理的软件,以及向用户提供更多采用文件的USB的一个子集。
在逻辑上它的层次结构就是这样的:文件系统USB对对象的操作方式和管理的软件子集逻辑文件系统基本i/o管理程序(文件组织模块)基本文件系统(物理i/o层)i/o掌控层(设备驱动程序)对象及其属性表明做为产品的操作系统存有各自的文件系统。
比如说ms的windows系列采用的就是fat16、fat32或ntfs的文件系统、linux采用的就是ext2、ext3文件系统等等。
(2)linux的ext2文件系统linux使用一个叫虚拟文件系统的技术从而可以支持多达几十种的不同文件系统,而ext2是linux自己的文件系统。
它有几个重要的数据结构,一个是超级块,用来描述目录和文件在磁盘上的物理位置、文件大小和结构等信息。
inode也是一个重要的数据结构。
文件系统中的每个目录和文件均由一个inode描述。
它包含:文件模式(类型和存取权限)、数据块位置等信息。
一个文件系统除了重要的数据结构之外,还必须为用户提供有效的接口操作。
比如ext2提供的open/close接口操作。
(3)用内存来模拟外存真正的文件系统对外存有展开管理,牵涉至许多硬件、设备管理方面的底层技术,一方面这些技术不属于操作系统核心内容,一方面过多的内容不免导致实验者顾此失彼,所以这里所推荐一种采用内存去演示外存的方式,可以UX21LI2677E这些硬件技术而轻易把精力放到数据结构设计和操作方式算法设计上面。
操作系统课程设计Linux二级文件系统设计

资料范本本资料为word版本,可以直接编辑和打印,感谢您的下载操作系统课程设计Linux二级文件系统设计地点:__________________时间:__________________说明:本资料适用于约定双方经过谈判,协商而共同承认,共同遵守的责任与义务,仅供参考,文档可直接下载或修改,不需要的部分可直接删除,使用时请详细阅读内容操作系统课程设计报告专业:软件工程学号:姓名:马提交日期:2017/1/10【设计目的】通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统3、通过对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力【设计内容】为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:1.可以实现下列几条命令:login 用户登录dir 列目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件cd 进出目录2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件可以进行读写保护【实验环境】C++DevCpp【设计思路】本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。
另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。
首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
用户创建的文件,可以编号存储于磁盘上。
如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
结构体:typedef struct /*the structure of OSFILE*/{int fpaddr; /*file physical address*/int flength; /*file length*/int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write; 3-Protect;*/char fname[MAXNAME]; /*file name*/} OSFILE; //存放重要信息typedef struct /*the structure of OSUFD*/{char ufdname[MAXNAME]; /*ufd name*/OSFILE ufdfile[MAXCHILD]; /*ufd own file*/}OSUFD; //用户下面的文件typedef struct /*the structure of OSUFD'LOGIN*/{char ufdname[MAXNAME]; /*ufd name*/char ufdpword[8]; /*ufd password*/} OSUFD_LOGIN;typedef struct /*file open mode*/{int ifopen; /*ifopen:0-close,1-open*/int openmode; /*0-read only,1-write only,2-read and write,3-initial*/}OSUFD_OPENMODE;主要的函数说明:void LoginF(); /*LOGIN FileSystem用户登录*/void DirF(); /*Dir FileSystem列目录*/void CdF(); /*Change Dir改变目录*/void CreateF(); /*Create File创建文件*/void DeleteF(); /*Delete File删除文件*/void ModifyFM(); /*Modify FileMode修改*/void OpenF(); /*Open File打开文件*/void CloseF(); /*Close File关闭文件*/void ReadF(); /*Read File读文件*/void WriteF(); /*Write File写文件*/void QuitF(); /*Quit FileSystem离开文件系统*/void help();其他重要函数:void clrscr() //清屏int ExistD(char *dirname) /*Whether DirName Exist,Exist-i,Not Exist-0*/int ExistF(char *filename) /*Whether FileName Exist,Exist-i,Not Exist-0*/int FindPANo() /*find out physical address num*/void SetPANo(int RorW) /*Set physical address num,0-read,1-write*/void InputPW(char *password) /*input password,use '*' replace*/ char *ltrim(char *str) /*remove the heading blanks.去除左空白*/ char *rtrim(char *str) /*remove the trailing blanks.去除右空白*/ int WriteF1() /*write file相当于置换文件*/程序流程说明:整体流程:开始Login(Name/Pw/Cpw)创建文件打开文件删除文件写文件更改目录修改文件属性读文件关闭文件退出系统清屏添加覆盖结束各部分功能流程:Open:开始Open获取文件名文件是否存在?(file>0)文件名不存在获取文件置为打开状态并获取文件模式打开文件成功结束N N YDelete:开始Delete主目录是否为空?Y确认删除文件在用户目录下!N用户是否在用户目录下?N只能修改用户目录下的文件!Y接收删除文件名获取文件文件被打开或被保护?Y打开或被保护状态不可删除N获取物理块号文件向前移动删除文件,文件数减一删除文件成功!结束Write:开始Write用户是否在目录下?N文件不存在!Y获取文件确认该文件被打开文件权限为只写或读写N文件为只读和保护,不允许写!Y获取路径0—追加,1—覆盖?1覆盖追加文件写入成功!结束Close:开始CloseN用户是否在目录下?请确认要关闭的文件是在用户目录下!Y罗列已经打开的文件获取文件名获取物理地址文件是否处于关闭状态?Y该文件已被关闭N关闭文件文件成功关闭结束【源程序清单】Open:void OpenF() /*Open File*/{printf("\n\nC:\\%s>",strupr(dirname)); //显示当前路径int fcoun, i; //定义两个整形变量char fname[MAXNAME], fmode[25]; //定义两个字符串变量int fmod; //文件模式printf("\nPlease input FileName:");gets(fname); //接收打开文件的文件名ltrim(rtrim(fname)); //去除左右空白if(ExistF(fname)<0) //判断文件是否存在{ //不存在printf("\nError.文件名 \'%s\'不存在\n", fname);wgetchar=1;} else {//存在i=ExistD(username); //获取用户物理信息for(int a=0; a < fcount[i]; a++) //遍历用户文件{if(strcmp(fname, ufd[i]->ufdfile[a].fname)==0) //找到文件{fcoun=a;break;}}ifopen[i][fcoun].ifopen=1; //将文件状态置为打开状态printf("Please input OpenMode(0-Read Only, 1-Write Only, 2-Readand Write, 3-Protect):");//打开文件模式gets(fmode); //获取模式fmod=atoi(fmode); //将字符串转换为整型ifopen[i][fcoun].openmode=fmod; //将文件的模式置为OpenModeprintf("\nOpen Successed");wgetchar=1;}}Delete:void DeleteF() /*Delete File*/{printf("\n\nC:\\%s>",strupr(dirname)); //显示路径char fname[MAXNAME], str[50], str1[50]; //定义三个字符串变量int i, k, j;int fpaddrno1; //记录文件物理地址块号if(strcmp(strupr(ltrim(rtrim(dirname))), "")==0){ //判断主目录是否为空printf("\nError.请确认您要删除的是否在用户目录下!\n");wgetchar=1;}if(strcmp(strupr(dirname), strupr(username))!=0){ //判断用户是否在用户目录下printf("\nError.您只能删除修改自己用户目录下的文件哦!\n");wgetchar=1;} else {printf("\nPlease input FileName:");gets(fname); //接收删除的文件名ltrim(rtrim(fname)); //去除文件名的左右空白i=ExistF(fname); //用户文件位置if(i>=0){k=ExistD(username); //获取用户所在存储位置if(ifopen[k][i].ifopen==1){//文件状态处于打开状态,不许删除printf("\n Error.\'%s\' 处于打开状态!请先关闭哟!\n", fname);wgetchar=1;} else {if(ufd[k]->ufdfile[i].fmode==3){ //保护文件,不可删除printf("\nError.\'%s\'处于被保护状态!请先关闭哟!\n", fname);wgetchar=1;} else {fpaddrno1=ufd[k]->ufdfile[i].fpaddr; //获取文件的物理地址块号fpaddrno[fpaddrno1]=0; //回收物理地址块号for(j=i; j<fcount[k]; j++) //将文件都向前移动{ufd[k]->ufdfile[j]=ufd[k]->ufdfile[j+1]; //将j+1位置为j}strcpy(str , "c:\\osfile\\file\\");itoa(fpaddrno1, str1, 10); //将整数转化为字符串strcat(str, str1);strcat(str, ".txt"); //连接remove(str); //删除物理文件fcount[k--]; //文件个数减一printf("\n\'%s\'is deleted successfully.\n", fname);wgetchar=1;}}} else {printf("\nError.\'%s\'文件不存在!\n", fname); //文件不存在wgetchar=1;}}}Write:void WriteF() /*Write File*/{printf("\n\nC:\\%s>",strupr(dirname));//显示用户路径int i, k, m=0;//定义整形变量int length;//定义长度整形变量char fname[MAXNAME]; //定义文件名字符串char str[255], str1[255];//定义两个字符串变量if(strcmp(strupr(dirname), strupr(username))!=0) { //判断用户是否在用户目录下printf("\nError!请确认您要写的在用户目录下!\n");wgetchar=1;return;}printf("\n请先打开文件!\n");printf("Opened File(s) List:\n");k=ExistD(dirname);//获取用户文件信息for(i=0; i<fcount[k]; i++)//遍历用户下的文件{if(ifopen[k][i].ifopen==1) { //文件处于打开状态printf("%15s", ufd[k]->ufdfile[i].fname);m++;}if(m%4 == 0 && m!=0) //每创建4个文件换一行printf("\n");}printf("\n%d 文件已经打开啦!\n", m);if(m == 0)wgetchar=1;if(m!=0) //创建文件{printf("\nPlease input FileName:");gets(fname);//接收文件名ltrim(rtrim(fname)); //去除左右空白i=ExistF(fname); //获取文件物理地址if(i>=0) {//文件存在if(ifopen[k][i].ifopen==1) { //文件处于打开状态if(ifopen[k][i].openmode==1 || ifopen[k][i].openmode==2) {//文件权限是只写或读写itoa(ufd[k]->ufdfile[i].fpaddr, str, 10); //获取文件路径strcpy(str1, "file");strcat(str1, str);strcpy(str, "c:\\osfile\\file\\");strcat(str, str1);strcat(str, ".txt"); //文件路径char str2[3];int choice=3;strcpy(str2,"ab");printf("You can choise [0-Covered W] [1-Additonal W]:");//选择追加还是覆盖scanf(" %d", &choice);if(choice == 0) //0-覆盖strcpy(str2, "wb");fp_file=fopen(str, str2); //打开文件length=WriteF1();ufd[k]->ufdfile[i].flength=ufd[k]->ufdfile[i].flength+length;//修改文件长度if(choice == 0)ufd[k]->ufdfile[i].flength=length;printf("\n\nYou have write file successfully!!!");fclose(fp_file); //关闭文件wgetchar=0;} else if(ifopen[k][i].openmode==0) {//文件处于只读状态,不允许写printf("\nError.\'%s\' 文件以只读状态打开,不允许写!\n", fname); wgetchar=1;} else {printf("\nError.\'%s\' 文件处于关闭状态,请先打开!\n", fname);wgetchar=1;}}} else {printf("\nError.\'%s\' 文件不存在!\n", fname); //文件不存在wgetchar=1;}}}Close:void CloseF() /*Close File*/{printf("\n\nC:\\%s>",strupr(dirname)); //显示路径char fname[MAXNAME]; //定义字符串变量int i, k, n=0;if(strcmp(strupr(dirname), strupr(username))!=0) //关闭用户文件需在用户目录下{printf("\nError!请确认您要关闭的是在用户目录下!\n");} else {printf("\n\nOpened File(s) List:\n"); //罗列已处于打开的文件k=ExistD(dirname);for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1) //文件处于开启状态if ((ifopen[k][i].openmode==0) ||(ifopen[k][i].openmode==2))//只读或者读写状态{printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");}printf("\n%d 文件已被打开!\n",n);if (n==0) wgetchar=1;printf("\nPlease input FileName:");gets(fname); //接收关闭文件的文件名ltrim(rtrim(fname)); //除去首尾空格i=ExistF(fname); //获取文件物理地址if(i >= 0){k=ExistD(username); //获取用户文件信息if(ifopen[k][i].ifopen==0) //文件处于关闭状态{printf("\nError!\'%s\'文件已经被关闭!\n", fname);} else { //将文件关闭ifopen[k][i].ifopen=0;ifopen[k][i].openmode=4;printf("\'%s\' has been closed successfully!", fname);}} else {printf("\nError.\'%s\'文件不存在\n", fname);}}}【测试结果】(此部分请同学们自己动手操作)Login:Help:Create:Open:Read:Write:1—additional添加后变为:0—covered覆盖后变为:Close:Attrib:Delete:Dir:Cls:(清屏)Exit:【设计总结】首先通过这次的操作系统课程设计,让我认识到了实际的编程操作并不难,难的是对过程的设计,功能的定义以及最后的程序流程图的设计。
操作系统课程设计报告5——模拟文件系统

操作系统课程设计报告——模拟文件系统1实现功能实现了符合要求的文件系统。
实现了要求的文件系统接口。
2文件系统的实现2.1目录项结构体dirEntry文件系统中,使用dirEntry结构体表示一个目录项。
该结构体长64字节,其中记录了该项的FAT表入口位置start,文件名name(最长50字节)和长9字节的未用项unused(可用于扩展文件系统的功能,记录其他信息)。
系统中的目录实际上就是仅由dirEntry项构成的目录文件。
2.2文件描述符分配表项结构体filpEntry使用filpEntry结构体来表示一个已经打开的文件。
它长8个字节,记录的信息包括该文件的FAT表入口位置start,以及文件指针位置position。
fdPool数组提供了100个可用的filpEntry指针;minNotUsedFd变量储存当前最小未用的文件描述符。
每当打开一个文件时,要调用get_fd函数,它为文件分配一个描述符,增加一个filpEntry项,并调整minNotUsedFd的值。
当关闭文件时,需要调用free_fd函数,来释放一个文件描述符和对应的filpEntry。
2.3文件分配表FAT文件系统中,需要记录文件存储的块号的数据结构。
除了可以使用inode以外,还可以使用FAT。
FAT在使用过程中需要将整张表读入内存,而使用inode时,只需要将使用中的inode读入内存即可;故inode占用内存较少。
但inode数据结构复杂;尤其是当文件尺寸巨大,需要使用二级甚至三级间接表时,inode在磁盘和内存之间的读写过程会变得相当繁琐。
本项目中,选择使用方便的FAT。
当磁盘空间为250MB,块大小为1KB时,将有256000块;每块的号码需要使用一个int来表达。
故FAT表需要256000项,每项4字节,共1024000字节,即1000KB。
由于超级块已经占用块0,文件分配表将占用硬盘块1~1000。
FAT的每个表项的类型都是int。
操作系统课程设计模拟文件系统

操作系统课程设计模拟文件系统学院: 计算机科学技术专业: 计算机科学与技术(工)班级: 计10- 1班**: ***学号: ****************: ***2013年07月16日《操作系统原理》课程设计任务书(计算机科学与技术专业10-1)一、课程设计题目(任选一个题目)1.模拟进程管理2.模拟处理机调度3.模拟存储器管理4.模拟文件系统5.模拟磁盘调度二、设计目的和要求1.设计目的《操作系统原理》课程设计是网络工程专业实践性环节之一, 是学习完《操作系统原理》课程后进行的一次较全面的综合练习。
其目的在于加深对操作系统的理论、方法和基础知识的理解, 掌握操作系统结构、实现机理和各种典型算法, 系统地了解操作系统的设计和实现思路, 培养学生的系统设计能力, 并了解操作系统的发展动向和趋势。
2.基本要求:(1)选择课程设计题目中的一个课题, 独立完成。
(2)良好的沟通和合作能力(3)充分运用前序课所学的软件工程、程序设计、数据结构等相关知识(4)充分运用调试和排错技术(5)简单测试驱动模块和桩模块的编写(6)查阅相关资料, 自学具体课题中涉及到的新知识。
(7)课题完成后必须按要求提交课程设计报告, 格式规范, 内容详实。
三、设计内容及步骤1.根据设计题目的要求, 充分地分析和理解问题, 明确问题要求做什么。
2.根据实现的功能, 划分出合理的模块, 明确模块间的关系。
3.编程实现所设计的模块。
4.程序调试与测试。
采用自底向上, 分模块进行, 即先调试低层函数。
能够熟练掌握调试工具的各种功能, 设计测试数据确定疑点, 通过修改程序来证实它或绕过它。
调试正确后, 认真整理源程序及其注释, 形成格式和风格良好的源程序清单和结果;5.结果分析。
程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。
目录1.课程设计的目的 (1)2.课程设计的要求 (1)3.需求分析 (1)3.1问题描述 (1)3.2数据结构 (2)3.2.1 类 (2)3.2.2 结构 (2)3.2.3 函数 (2)3.3系统运行环境 (3)4.概要设计 (3)4.1创建文件操作 (3)4.2删除文件操作 (4)4.3查看文件块号 (4)5 详细设计 (4)5.1创建文件 (4)5.2删除文件 (7)5.3查看文件块号 (10)6.总结 (12)参考文献 (13)附录 (15)1.课程设计的目的掌握模拟文件系统的设计方法, 具备初步的独立分析和设计能力。
操作系统课程设计为LINUX设计一个简单的二级文件系统

操作系统课程设计为LINUX设计一个简单的二级文件系统一.项目概述本课程设计旨在通过设计一个简单的多用户文件系统,加深学生对文件系统内部功能及内部实现的理解,并提高学生的程序设计能力、算法设计质量与程序设计素质。
二.设计题目为LINUX设计一个简单的二级文件系统,要求实现以下命令:Login用户登录、Dir列文件目录、Create创建文件、Delete删除文件、Open打开文件、Close关闭文件、Read读文件、Write写文件。
列目录时需包括文件名、物理地址、保护码和文件长度。
源文件需进行读写保护。
三.开发语言及实现平台或实验环境本课程设计的开发语言为C语言,实现平台为Linux操作系统。
学生需要在规定时间内完成程序的编写和调试,并书写课程设计报告。
四.时间安排1月17日布置课程设计任务,学生需要自行查阅资料并准备程序。
1月18日至1月20日,学生需要在机房上机调试程序,并书写课程设计报告。
1月21日上午,学生需要提交课程设计报告及相关文档。
每位学生应独立完成各自的任务,每天至少在设计室工作半天。
五.具体要求1.课程设计报告应按统一通用格式书写,具体格式要求请在网络上查阅。
2.指导教师和教研室主任(或责任教师)需要在规定时间内签署相应的文件。
设计目的:本设计旨在开发一款能够实现某种功能的程序,为用户提供便利。
设计内容:5.1.该程序将包括两个主要功能:A和B。
A功能将执行某种操作,而B功能将提供用户界面,使其能够轻松地使用A功能。
5.2.此外,该程序还将包括其他辅助功能,例如C和D。
这些功能将提高程序的可用性和实用性。
任务:该程序的主要任务是为用户提供一种方便、高效的解决方案,使其能够更轻松地实现某种目标。
主程序流程图:程序的主要流程将包括以下步骤:用户打开程序,选择所需的功能,程序执行相应的操作,最终将结果返回给用户。
程序设计:6.1.在程序设计方面,我们将采用一种灵活、可扩展的架构,以便能够轻松地添加新的功能和模块。
操作系统 文件系统课程设计

操作系统文件系统课程设计
操作系统文件系统课程设计主要涉及以下几个方面:
1. 实现基于模块的文件系统:
- 修改ext3或ext4的源代码
- 动态加载和卸载新的文件系统
- 修改文件系统的名称,优化文件写操作
2. 新增Linux驱动程序:
- 增加一个驱动程序(使用内存模拟设备)
- 动态加载和卸载新的驱动
- 通过程序或命令行使用该驱动
- 保存和读取数据
3. 统计Linux系统缺页的次数:
- 在内核中实现缺页次数统计
- 编译并安装新内核
- 建立内核模块,通过/proc实现用户态查看缺页次数
4. 模拟磁盘文件系统实现:
- 设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区
- 支持多级目录结构,支持文件的绝对读路径
- 实现建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件、关闭文件、改变文件属性等命令建议根据以上概述,结合实际需求和兴趣,选择相应的题目进行课程设计。
操作系统课程设计-模拟文件系统

目录第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","usr5","usr5","usr6","usr6","usr7","usr7","usr8","usr8",};(3)数据结构说明a)文件结构链表struct fnode{char filename[FILENAME_LENGTH];int isdir;int isopen;char content[255];fnode *parent;fnode *child;fnode *prev;fnode *next;};b)函数介绍fnode *initfile(char filename[],intisdir);模拟二级文件系统主界面用户登录建立文件删除文件写入文件读取文件切换目录建立目录退出登录del"<<endl;i++;}if(temp->child==NULL){cout<<"Total: "<<" directors" <<i<<" files"<< j <<endl;return 1;}temp=temp->child;while(temp){if(temp->isdir){cout<<"<DIR>\ "<<temp->filename<<endl;i++;}else{cout<<"<FILE> "<<temp->filename<<endl;j++;}temp=temp->next;}cout<<"Total: "<<" directors" <<i<<"files"<< j <<endl;}int read(){char filename[FILENAME_LENGTH];cin>>filename;if(recent->child==NULL){cout<<"文件不存在!"<<endl;return 1;}if(strcmp(recent->child->filename,filename)==0) {cout<<recent->child->content<<endl;return 1;}else{temp=recent->child;while(temp->next){if(strcmp(temp->next->filename,filename)==0) {cout<<temp->next->content<<endl;return 1;}}cout<<"文件不存在!"<<endl;}}int write(){char filename[FILENAME_LENGTH];cin>>filename;if(recent->child==NULL){cout<<"文件不存在!"<<endl;return 1;}if(strcmp(recent->child->filename,filename)==0) {recent->child->isopen=1;")==0){int i;while(recent->prev)recent=recent->prev;if(recent->parent){recent=recent->parent;}i=strlen(para);while(para[i]!='/' && i>0) i--;if(i!=0)para[i]='\0';elsepara[i+1]='\0';}else{findpara(topara);}return 1;}int findpara(char *topara){int i=0;int sign=1;if(strcmp(topara,"/")==0){recent=root;strcpy(para,"/");return 1;}temp=recent;strcpy(temppara,para);if(topara[0]=='/'){recent=root->child;i++;strcpy(para,"/");}else{if(recent!=NULL && recent!=root) strcat(para,"/");if(recent && recent->child){if(recent->isdir)recent=recent->child;else{printf("路径错误!\n");}}}while(i<=strlen(topara) && recent){int j=0;if(topara[i]=='/' && recent->child){i++;if(recent->isdir)recent=recent->child;else{printf("路径错误\n");return 0;}strcat(para,"/");}while(topara[i]!='/' && i<=strlen(topara)){recentpara[j]=topara[i];i++;j++;}recentpara[j]='\0';while((strcmp(recent->filename,recentpara)!=0 || (recent->isdir!=1)) && recent->next!=NULL){recent=recent->next;}if(strcmp(recent->filename,recentpara)==0){if(recent->isdir==0){strcpy(para,temppara);recent=temp;printf("是文件不是目录。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。
这个系统是由世界各地的成千上万的程序员设计和实现的。
其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。
Linux不仅为用户提供了强大的操作系统功能,而且还提供了丰富的应用软件。
用户不但可以从Internet上下载Linux及其源代码,而且还可以从Internet上下载许多Linux的应用程序。
可以说,Linux本身包含的应用程序以及移植到Linux上的应用程序包罗万象,任何一位用户都能从有关Linux的网站上找到适合自己特殊需要的应用程序及其源代码,这样,用户就可以根据自己的需要下载源代码,以便修改和扩充操作系统或应用程序的功能。
这对Windows NT、Windows98、MS-DOS或OS/2等商品化操作系统来说是无法做到的。
Linux具有:稳定、可靠、安全的优点,并且有强大的网络功能。
其中有对读、写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。
在相关软件的支持下,可实现WWW、FTP、DNS、DHCP、E-mail等服务,还可作为路由器使用,利用IPCHAINS/IPTABLE网络治理工具可构建NAT及功能全面的防火墙。
Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。
Linux 操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。
它还包括带有多个窗口管理器的X-Windows图形用户界面,如同我们使用Windows NT一样,允许我们使用窗口、图标和菜单对系统进行操作。
1需求分析 (2)1.1 功能介绍 (2)1.2 目的及意义 (4)1.2.1 目的 (4)1.2.2 意义 (5)1.3 设计成果 (6)2总体设计 (7)2.1功能介绍 (7)2.2模块关联 (8)3详细设计 (11)3.1用户结构 (11)3.2数据结构说明 (11)3.3主要功能的关键代码 (12)4测试及运行结果 (17)4.1 测试定义 (17)4.2 测试目的 (17)4.3 测试结果 (18)4.3.1 文件测试 (18)5心得 (40)1需求分析1.1 功能介绍基于Linux的模拟文件系统的设计与实现完成以下功能:(1)创建用户:手动的创建10个用户,都在界面上完成,输入用户名;每个用户最多可以保存10个文件。
(2)用户登录:手动的登录已经创建的用户,正确输入用户名即可成功登录。
(3)显示所有用户:首先会创建很多用户,为了清晰、便捷的查看用户,所以在界面上可以显示所有的用户,这一功能的实现,主要是针对忘记自己用户名的用户,可以通过查看全部用户来查找自己的用户名。
(4)创建二级文件目录(MD):手动的输入目录名称,(即设置主目录(MFD)和用户文件目录(UFD))。
(5)显示目录:将用户创建的目录显示在界面上。
(6)删除目录:手动输入目录的名称即可删除已经创建的目录。
(7)进入目录:进入目录内部,可以进行文件的各种操作。
(8)修改目录:在用户登录后,输入要修改的目录名称,对其进行修改,输入新的目录名并保存。
(9)建立一个文件(create):在目录中手动输入文件名,可以创建新的文件,在创建的同时输入文件的保护码,对文件内容进行保护,防止信息泄露。
(10)打开全部文件(openall):将已经创建的文件夹全部显示在界面上。
(11)删除一个文件(delete):手动输入已经创建的文件的名称,即可删除此文件。
(12)写文件(write):手动的在文件中写入内容。
(13)读文件(read):查看文件中的已经写入的内容。
(14)移动文件:用户可以将某个目录下的文件移动到其它的目录中,只为了整理文件,便于查询,使用。
(15)改文件的保护码(change):手动修改文件的密码(保护码)。
基于以上的功能,可以使用户选择操作,模拟文件系统的设计与实现;此类功能都是在页面上手动操作完成。
1.2 目的及意义1.2.1 目的通过课程设计,加深对操作系统各资源管理模块的理解,掌握操作系统的基本原理及功能,具有初步分析实际操作系统、设计、构造和开发现代操作系统的基本能力。
基于Linux 的模拟文件系统的设计与实现,熟悉基本的网络命令以及他们的使用方法,体会Linux多用户的特点,熟悉网络配置文件的配置方法。
本系统是基于linux平台运行在终端上的虚拟二级文件管理系统。
模拟真正的文件管理系统,并采用用户登录机制对文件和目录进行创建,增加内容,修改,删除的操作。
对于目录而言,可以进行创建删除新添文件的操作;对于文件而言,可以创建,修改,删除。
删除目录时,同时删除相应目录下的文件以及文件中的内容。
采用用户登录使得用户管理文件更方便,并形成了二级的文件管理模式。
操作系统(OS)是重要的计算机系统软件,同时也是最活跃的学科之一,其发展极为迅速。
它是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充。
它在计算机系统中占据了特别重要的地位;而其它的诸如汇编程序、编译程序、数据库管理系统等系统软件,以及大量的应用软件,都将依赖于操作系统的支持,取得它的服务。
操作系统已成为现代计算机系统、多处理机系统、计算机网络、多媒体系统以及嵌入式系统中都必须配置的、最重要的系统软件。
课程设计是学习的总结,通过课程设计温习我们已经学到的知识并加以运用,还可以了解到其它的知识,来充实自己,充分掌握操作系统的基本原理及各方面知识。
1.2.2 意义基于其低廉成本与高度可设定性,Linux常常被应用于嵌入式系统,例如机顶盒、移动电话及行动装置等。
在移动电话上,Linux已经成为与Symbian OS、Windows Mobile系统并列的三大智能手机操作系统之一;而在移动装置上,则成为Windows CE与Palm OS 外之另一个选择。
目前流行的TiVo数位摄影机使用了经过定制化后的Linux。
此外,有不少硬件式的网络防火墙及路由器,例如部份LinkSys的产品,其内部都是使用Linux来驱动、并采用了操作系统提供的防火墙及路由功能。
Linux以它的高效性和灵活性著称。
它能够在PC计算机上实现全部的Unix特性,具有多任务、多用户的能力。
Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。
Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。
它还包括带有多个窗口管理器的X-Window图形用户界面,如同我们使用Windows NT一样,允许我们使用窗口、图标和菜单对系统进行操作。
Linux之所以受到广大计算机爱好者的喜爱,主要原因有两个,一是它属于自由软件,用户不用支付任何费用就可以获得它和它的源代码,并且可以根据自己的需要对它进行必要的修改,无偿对它使用,无约束地继续传播。
另一个原因是,它具有Unix的全部功能,任何使用Unix操作系统或想要学习Unix操作系统的人都可以从Linux中获益。
在Linux操作系统中实现文件的各种操作,即创建、删除、修改、写入、读取等。
通过课程设计让我们进一步了解操作系统,学习操作系统的各方面知识,加深对操作系统的认识,温习课上学过的知识,明确操作系统的作用。
可以在不同的角度来观察操作系统的作用。
从一般客户的观点,可把操作系统看做是用户与计算机硬件系统之间的接口;从资源管理的观点看,则可把操作系统视为计算机系统资源的管理者。
另外,操作系统实现了对计算机资源的抽象,隐藏了对硬件操作的细节,使用户能更方便地使用机器。
1.3 设计成果基于Linux的模拟文件系统的设计与实现,实现了采用用户登录机制,可以查看文件信息,管理文件及文件夹。
在界面中用户可以手动的进行操作,每一步都有操作成功或失败的提示,清晰的展示每一步的操作过程,用户可以方便的实现对文件的操作,例如:创建、修改、删除等。
经过几天的努力完成了基于Linux的模拟文件系统的设计与实现这一课题,按照具体的要求,将每个功能实现并附上温馨提示,主要的功能有:展示了添加用户、用户登录、创建二级目录、修改目录名、删除目录、显示全部目录、创建文件、修改文件名、删除文件、写入文件、读取文件、修改文件保护码等功能。
2总体设计2.1功能介绍本系统包括用户管理、目录管理、文件管理共3个模块。
在用户管理模块中,包括创建用户,输入用户名;用户登录等功能。
在目录管理模块中,包括创建二级文件目录,输入文件的目录名称;显示目录,输入文件目录的名字,显示出对应的目;删除目录;进入目录主要是为了操作目录内部的文件。
文件管理模块,包括文件的创建,在进入目录后可以按照提示输入文件的名称,输入密码,创建新的文件并添加文件的保护码;打开一个文件,在目录中按照提示输入文件的名称,便可以打开目录中对应的文件;打开全部文件,进入目录后,按照提示输入相应的操作,即可打开本目录下所有的文件;删除一个文件,进入目录按照提示选择相应的操作,输入文件名称,即可删除此文件;写入文件,在目录中打开一个文件,写入内容;读取文件,在目录中打开文件,查看文件的内容。
修改保护码,进入目录输入文件的名称,按照提示修改文件的保护码。
形象展示见下图2.1图2.12.2模块关联在系统中各个模块之间有着一定的联系,系统中创建10个用户,每一个用户可以创建多个目录,在目录中最多创建10个文件。
用户与目录之间存在一对多的关系,目录与文件之间也存在一对多的关系,用户与文件之间也存在一对多的关系。
具体描述见下图:图2.2图2.3打开文件读文件图2.4删除目录创建目录图2.53详细设计3.1用户结构typedef struct user{char name[10];Content *con;struct user *next;}User;本系统可以创建10个用户,用户登陆时只要输入正确便可进入系统,否则提示失败要求重新输入。
do{printf("输入新用户名:\n");scanf("%s",name);exist=0;head=user->next;while(head!=NULL){if(strcmp(head->name,name)==0){exist=1;break;}head=head->next;}if(exist==1) printf("用户名已存在!\n请重新输入:");}while(exist==1);3.2数据结构说明a)文件结构链表struct fnode {char filename[FILENAME_LENGTH];int isdir;int isopen;char content[255];fnode *parent;fnode *child;fnode *prev;fnode *next;};b)函数介绍void zengjiayonghu();//增加新用户void newfile(Content *con);//创建新文件int display_files(Content *con);//展示所有文件void dufile(Content *con);//读取文件void writefile(Content *con);//写入文件void shanchufile(Content *con);删除文件void yidongfile(User *u,Content *con);//移动文件int zhankaiallconcent(User *u);//展示所有文件void newcontentname(Content *c,char name[]);//更改目录名称void newconcent(User *u);//增加新目录void shanchuconcent(User *u);//删除目录void xiugaiconcentname(User *u);//修改目录名称void change_filepassword(Content *con);//修改文件保护码int readall_files(Content *con);//读取所有文件3.3主要功能的关键代码a)创建文件在用户成功的创建目录后,就可以创建文件了,创建新的文件时首先判断文件名是否已经存在,如果存在则提示重新输入,否则提示“请输入文件保护码!”,在输入文件保护码后,将创建新的文件成功。