操作系统课程设计文件系统汇编Word下载.docx

上传人:b****5 文档编号:19144379 上传时间:2023-01-04 格式:DOCX 页数:20 大小:209.18KB
下载 相关 举报
操作系统课程设计文件系统汇编Word下载.docx_第1页
第1页 / 共20页
操作系统课程设计文件系统汇编Word下载.docx_第2页
第2页 / 共20页
操作系统课程设计文件系统汇编Word下载.docx_第3页
第3页 / 共20页
操作系统课程设计文件系统汇编Word下载.docx_第4页
第4页 / 共20页
操作系统课程设计文件系统汇编Word下载.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

操作系统课程设计文件系统汇编Word下载.docx

《操作系统课程设计文件系统汇编Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计文件系统汇编Word下载.docx(20页珍藏版)》请在冰豆网上搜索。

操作系统课程设计文件系统汇编Word下载.docx

基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。

二、设计任务

课程设计说明书(纸质+电子版),内容包括:

设计内容、系统分析(包括可行性分析、需求分析等)及功能分析;

系统设计(要求画出系统整体功能框图、流程图、并给出相应地关键的代码且对所使用的主要数据结构进行说明等。

)、设计总结(评价/遇到的问题/体会/建议等)、使用说明等。

三、设计要求

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[

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1