操作系统课程设计文件系统汇编Word下载.docx
《操作系统课程设计文件系统汇编Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计文件系统汇编Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。
二、设计任务
课程设计说明书(纸质+电子版),内容包括:
设计内容、系统分析(包括可行性分析、需求分析等)及功能分析;
系统设计(要求画出系统整体功能框图、流程图、并给出相应地关键的代码且对所使用的主要数据结构进行说明等。
)、设计总结(评价/遇到的问题/体会/建议等)、使用说明等。
三、设计要求
1.按功能要求开发系统,能正确运行。
程序代码书写规范,有充足的注释。
2.课程设计所使用的编程语言任选,但建议使用C或C++;
3.绿色软件:
程序运行不需安装,避免写系统和注册表;
进
度
安
排
起止日期
工作内容
课程设计前一周
召开动员大会,学生选题;
2013-12-9~2013-12-10
系统分析和设计;
2013-12-11~2013-11-13
熟悉软件开发工具、编码系统、系统测试以及中期答辩;
2013-12-14~2013-12-15
撰写并提交课程设计说明书(含电子文档)、源程序等。
主
要
参
考
资
料
[1]罗宇、邹鹏、邓胜兰等著.《操作系统》[M].北京:
电子工业出版社,2011
[2]AndrewS.Tanenbaum著.陈向群等译.《现代操作系统》[M].北京:
机械工业出版社,2007
[3]邓胜兰编著.《操作系统基础》[M].北京:
机械工业出版社,2009
[4]DaveProbert著,陈向群等译《Windows操作系统原理》[M].北京:
机械工业出版,2006
[5]罗宇褚瑞等等著.《操作系统课程设计》[M].北京:
机械工业出版,2004
指导教师(签字):
年月日
系(教研室)主任(签字):
年月日
课程名称:
计算机操作系统
文件系统演示
专业:
网络工程班级:
学生姓名:
学号:
指导教师:
左新娥
2013年4月日
一课程设计简介
1.1课程设计的目的
课程设计目的使同学们熟悉文件管理系统的设计方法;
加深对所学各种文件操作的了解及其操作方法的特点。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
1.2课程设计内容
课程设计内容设计一个简单的多用户文件系统。
③实现这个文件系统。
④能实际演示这个文件系统。
二课程设计实现过程
在本段落中,将从程序功能需求分析,程序流程设计,程序实现来完成本章的描述。
2.1程序功能需求分析
本次课程设计内容是设计一个简单的多用户文件系统,对软件的功能需求如下:
在linux系统中用一个文件来模拟一个磁盘;
可以对这个模拟磁盘进行的操作为:
使用编程语言实现这个文件管理系统,能实际演示这个文件系统。
基本上是进入一个程序主界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。
2.2程序功能模块分析
2.2.1format格式化
只写打开模拟文件,初始化超级快,初始化dinode位图block位图,初始化主目录,初始化etc目录,初始化管理员admin目录,初始化用户xiao目录,初始化用户passwd文件,写入模拟硬盘文件。
2.2.2install安装
读写打开模拟文件,读取dinode位图block位图,读取主目录,读取etc目录,读取管理员admin目录,读取用户xiao目录,读取用户passwd文件。
2.2.3login登陆
用户输入用户名和密码,在passwd文件中查找是否有此用户,核对密码。
正确则登陆成功,当前目录设定到当前用户文件夹下。
2.2.4create创建文本文件
查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以‘###’结束。
申请inode空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。
将文件内容写入inode空间和block空间。
修改当前目录的结构,修改超级快,修改inode位图,block位图,写入模拟硬盘。
2.2.5cd–进入子目录或者上级目录
查找当前目录是否有该子目录,没有则退出,调用access()判断当前用户是否有权限,无则退出,有则读取该子目录的inode,将当前目录指向该目录。
2.2.6del删除文件或目录
查找当前目录是否有该文件名,没有则退出,有则调用access()判断是否有权限,有则判断是否为系统文件,是则无法删除,不是则判断是否是文件,是文件则直接删除,不是则判断是否文件夹,是文件夹则判断该文件夹下是否有文件,有文件则无法删除。
提示用户是否删除,确认则删除文件,修改当前文件夹inode,block结构,修改该文件占有的inode和block位图为0,修改超级块,写入模拟硬盘。
2.2.7help显示帮助
在命令模式在输入help可以显示本程序所有的的命令和对应的解释,在输入help时候,列出系统中可以用的函数对应的命令名称。
2.2.8exit退出系统
在文件模拟系统中输入exit可以退出程序,当从键盘处接受到字符时候,判断为exit时候,则推出程序,并且关闭文件流。
2.3程序实现过程
2.3.1相关结构体描述
一.Inode节点结构
/*————————————————————————
Inode结构体
————————————————————————*/
/*structinode{
//___int1616a;
structinode*i_forw;
//
structinode*i_back;
__int16uf_id;
//该节点在user.f_ofile中的下标
__int8i_flag;
//chardi_name[DIRSIZ];
//unsigned__int16i_count;
//计数
unsigned__int16di_ino;
//磁盘i节点标识
unsigned__int16di_number;
//关联文件数,当为0时表示删除文件
unsigned__int16di_mode;
//存取权限
unsigned__int16di_uid;
//磁盘i节点用户id
unsigned__int16di_gid;
//磁盘i节点组id
unsigned__int32di_size;
//文件大小
unsigned__int32di_ctime;
//Creationtime
unsigned__int32di_mtime;
//Modificationtime
unsigned__int16di_block[P_N_BLOCKS];
/*一组block指针
};
*/
二.Block组描述
/**********
ext2block组描述结构体
*******/
structgroup_desc{
unsigned__int16bg_block_bitmap;
//block指针指向blockbitmap
unsigned__int16bg_inode_bitmap;
//block指针指向inodebitmap
unsigned__int16bg_inode_table;
//block指针指向inodestable
unsigned__int16bg_free_blocks_count;
//空闲的blocks计数
unsigned__int16bg_free_inodes_count;
//空闲的inodes计数
unsigned__int16bg_used_dirs_count;
//目录计数
};
三.超级块描述部分
超级快数据结构的描述
structsuper_block{
unsignedints_inodes_count;
/*inodes计数*/
unsignedints_blocks_count;
/*blocks计数*/
unsignedints_r_blocks_count;
/*保留的blocks计数*/
unsignedints_free_blocks_count;
unsignedints_free_inodes_count;
/*空闲的inodes计数*/
unsignedints_free_blocks_group[GROUPNUM];
//新增一个数组来记录每个数据块组中的空闲数据块计数
unsignedints_first_data_block;
/*第一个数据block*/
unsignedints_log_block_size;
/*block的大小*/
unsignedints_blocks_per_group;
/*每blockgroup的block数量*/
unsignedints_inodes_per_group;
/*每blockgroup的inode数量*/
};
四.用户账号密码
用户账号密码的数据结构描述
structpwd{
unsignedintp_uid;
unsignedintp_gid;
charusername[UNAMSIZ];
/*用户名新加的*/
charpassword[UPWDSIZ];
五.磁盘中i结点结构
磁盘i结点结构,
structinode{
unsignedintdi_ino;
/*磁盘i节点标识*/
unsignedintdi_number;
/*关联文件数,当为0时表示删除文件*/
unsignedintdi_mode;
/*存取权限*/
unsignedintdi_uid;
/*磁盘i节点用户id*/
unsignedintdi_gid;
/*磁盘i节点权限组id*/
unsignedintdi_size;
/*文件大小*/
unsignedintdi_ctime;
/*Creationtime*/
unsignedintdi_mtime;
/*Modificationtime*/
unsignedintdi_block[P_N_BLOCKS];
/*一组block指针*/
2.3.2相关全局变量
全局变量
//unsignedshortintdi_bitmap[DINODENUM];
//硬盘inode节点位图1表示已使用0表示未使用
//unsignedshortintbk_bitmap[DATABLKNUM];
//数据块block位图
chardi_bitmap[DINODENUM];
charbk_bitmap[DATABLKNUM];
//数据块block位图
structsuper_blockfilsys;
//超级块
structpwdpwd[PWDNUM];
//structuseruser[USERNUM];
//intusernum;
FILE*fd;
//文件指针
structinode*cur_inode;
//内存i节点当前目录指针
//structdinode*dinodef;
//全局硬盘节点指针
structinode*inodetemp;
//内存i节点指针
//structinode*inodetemp2;
constcharfsystemname[20]="
Linux.EXT2"
;
//模拟硬盘的文件名
structdirectdir_buf[BLOCKSIZ/sizeof(structdirect)];
//目录数组
charcmdhead[20];
//cmd的头表示所在哪个文件夹、
charcurdir[20];
inti_lock=0;
//inode位图锁可能会多线程
intb_lock=0;
//block位图锁
structpwd*cur_user;
externintFormat();
//格式化磁盘
externintInstall();
//启动,安装文件系统
structinode*read_inode(int);
//install里面读取文件dinode
structdirect*read_dir_data(int);
//读取存储文件夹的物理块
externvoidshowdir();
//命令dir
intEnterdir(char[]);
//进入某个文件夹命令--cd文件名
intFd_dirfile(char[]);
//查找当前目录里的文件没找到返回-1找到返回inode号
intIscmd(char[]);
//判断是否两个字符串的命令
voidtwo_cmd(char[],char[]);
//两个字符串的命令
intcreat(char[]);
//创建文件
voidchangeinode();
//交换指针
char*ReadFile(char[]);
//读取文件
intmkdir(char[]);
//创建文件夹
voidshowbitmap();
//显示位图
intdeletefd(char[]);
//删除文件
inteditfile(char[]);
//编辑文件
intrenam(char[]);
//重命名
voidshowhelp();
//命令帮助
voidlogin();
intaccess();
/*磁盘i节点的分配与释放(当一个新文件被建立的时候,在给该文件分配磁盘存储区之前,应为该文件分配存放该文件说明信息的磁盘i节点,当从文件系统中删除某个文件时,应首先删除它的磁盘i节点项。
)*/
intialloc();
/*开辟一个空闲的i节点,返回i节点*/
//磁盘块分配与释放函数
intballoc(int);
//申请硬盘空间
2.3.2主要功能函数代码
一.Format函数实现代码
intFormat()//这个函数在进入程序开始时候调用,并且开始初始化虚拟磁盘
{
structpwdpasswd[BLOCKSIZ/PWDSIZ];
inti;
/*creatthefilesystemfile*/
fd=fopen(fsystemname,"
wb"
);
/*读写创建一个二进制文件*/
if(fd==NULL)
{
printf("
filecreatedefeat!
\n"
return0;
}
//超级块
filsys.s_inodes_count=DINODENUM;
filsys.s_blocks_count=DATABLKNUM;
filsys.s_r_blocks_count=0;
filsys.s_free_blocks_count=DATABLKNUM-3;
/*空闲的blocks计数*/
filsys.s_free_blocks_group[0]=50-3;
//第一个blockgroup已经被用了3个
for(i=1;
i<
GROUPNUM-1;
i++)
filsys.s_free_blocks_group[i]=50;
//后面的group全部空闲
//printf("
blockgroup%d空闲个数为%d\n"
i,filsys.s_free_blocks_group[i]);
filsys.s_free_blocks_group[GROUPNUM-1]=12;
//最后一个block组只有12个block
filsys.s_free_inodes_count=DINODENUM-3;
filsys.s_first_data_block=DATASTARTNO;
/*第一个数据block也就是*/
filsys.s_log_block_size=BLOCKSIZ;
filsys.s_blocks_per_group=BLKGRUPNUM;
filsys.s_inodes_per_group=0;
//每blockgroup的inode数量暂未使用
fseek(fd,BLOCKSIZ,SEEK_SET);
fwrite(&
filsys,BLOCKSIZ,1,fd);
//初始化dinode位图block位图
di_bitmap[0]=1;
di_bitmap[1]=1;
di_bitmap[2]=1;
//前三个inode分别被rootetc用户passwd文件占用
bk_bitmap[0]=1;
bk_bitmap[1]=1;
bk_bitmap[2]=1;
for(i=3;
DINODENUM;
di_bitmap[i]=0;
bk_bitmap[i]=0;
for(;
DATABLKNUM;
fseek(fd,BLOCKSIZ*2,SEEK_SET);
fwrite(di_bitmap,BLOCKSIZ,1,fd);
fseek(fd,BLOCKSIZ*3,SEEK_SET);
fwrite(bk_bitmap,BLOCKSIZ,1,fd);
//初始化主目录
structinode*ininode;
ininode=(structinode*)malloc(sizeof(structinode));
if(!
ininode)
ininodememdefeat!
"
//strcpy(dinodef->
di_name,"
/"
ininode->
di_ino=0;
//i节点标志
di_number=3;
//关联3个文件夹
di_mode=DIMODE_DIR;
//0为目录
di_uid=1;
//用户id第一个用户
di_gid=1;
//组id管理员组
di_size=0;
di_ctime=0;
di_mtime=0;
di_block[0]=0;
//所占物理块号后3块分别是一级指针,二级指针,3级指针
fseek(fd,DINODESTART,SEEK_SET);
fwrite(ininode,sizeof(structinode),1,fd);
strcpy(dir_buf[0].d_name,"
."
dir_buf[0].d_ino=0;
//当前目录的dinode号
strcpy(dir_buf[1].d_name,"
.."
dir_buf[1].d_ino=0;
//主目录的上级目录还是自己
strcpy(dir_buf[2].d_name,"
etc"
dir_buf[2].d_ino=1;
//etc目录
fseek(fd,DATASTART,SEEK_SET);
fwrite(dir_buf,BLOCKSIZ,1,fd);
//etc目录
di_ino=1;
di_block[