搜档网
当前位置:搜档网 › UNIX操作系统课程设计

UNIX操作系统课程设计

UNIX操作系统课程设计
UNIX操作系统课程设计

操作系统课程设计

模拟UNIX文件系统的设计及实现

院系:国际教育学院

班级:计07 – 4班

姓名:符龙

指导教师:孙昌立

2011 年5 月18 日

操作系统课程设计任务书

一、题目:银行家算法

二、设计要求

(1)小组成员分工协作完成。要求每个成员有自己相对独立的模块,同时要了解其他组员完成的内容。

(2)查阅相关资料,自学具体课题中涉及到的新知识。

(3)采用结构化、模块化程序设计方法设计,功能要完善,界面美观。

(4)所设计的系统应有菜单、动画和音乐。

(5)按要求写出课程设计报告,并于设计结束后1周内提交。其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件总体设计、详细设计、软件的调试、总结、谢启、附录:带中文注释的程序清单、参考文献。报告一律用A4纸打印,中文字体为宋体,西文字体用Time New Roma,一律用小四号字,行距采用“固定值”18磅,首行缩进2字符。总体设计应配合软件总体模块结构图来说明软件应具有的功能。详细设计应用传统或N-S流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如何解决的。

三、课程设计工作量

由于是设计小组团结协作完成设计任务,一般每人的程序量在200行有效程序行左右,不得抄袭。

四、课程设计工作计划

2011年5月10日,指导教师讲课,学生根据题目准备资料;

2011年5月12日,设计小组进行总体方案设计和任务分工;

2011年5月13日~2009年6月23日,每人完成自己承担的程序模块并通过独立编译;

2011年5月14日~2009年6月29日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;

2011年5月16日,验收、撰写报告;

2011年5月18日,验收或总结。

指导教师签章

教研室主任签章

操作系统课程设计指导教师评语与成绩

指导教师评语:

课程设计表现成绩:

课程设计验收成绩:

课程设计报告成绩:

课程设计总成绩:

指导教师签章

2009年7月日

目录

1.概述 (1)

2.总体设计 (2)

3.详细设计 (3)

4.代码调试 (9)

5.总结 (11)

6.附录 (12)

7. 参考文献 (30)

一.概述

【课设原理】

UNIX 采用树型目录结构,每个目录表称为一个目录文件。

一个目录文件是由目录项组成的。每个目录项包含16B ,一个辅存磁盘块(512B)包含32个目录项。在目录项中,第1、2字节为相应文件的外存i 节点号,是该文件的内部标识;后14B 为文件名,是该文件的外部标识。所以,文件目录项记录了文件内、外部标识的对照关系。根据文件名可以找到辅存i 节点号,由此便得到该文件的所有者、存取权、文件数据的地址健在等信息。UNIX 的存储介质以512B 为单位划分为块,从0开始直到最大容量并顺序加以编号就成了一个文件卷,也叫文件系统。UNIX 中的文件系统磁盘存储区分配图如下: 0# 1#

2#

K # K+1# K+2# K+3#

… n #

本次课程设计是要实现一个简单的模拟UNIX 文件系统。我们在磁盘中申请一个二进制文件模拟UNIX 内存,依次初始化建立位示图区,I 节点区,数据块区。并给已打开的文件建立文件打开表。

【课设内容】

1.设计任务

多用户、多级目录结构文件系统的设计与实现。可以实现下列几条命令

login 用户登录 logout 退出当前用户 dir 列文件目录 creat 创建文件

delet 删除文件及目录树 open 打开文件 close 关闭文件 read 读文件 write 写文件 mkdir 创建目录 cd 改变文件目录 format 格式化文件系统 quit 退出文件系统

2.文件系统应具有的基本功能

i 节点区 文件存储区

引导区

管理区

(1)多用户:usr1,usr2,usr3,……,usr8 (1-8个用户)

(2)多级目录:可有多级子目录;

(3)具有login (用户登录)

(4)系统初始化(建文件卷、提供登录模块)

(5)文件的创建: create

(6)文件的打开:open

(7)文件的读:read

(8)文件的写:write

(9)文件关闭:close

(10)删除文件或目录:delet

(11)创建目录(建立子目录):mkdir

(12)改变当前目录:cd

(13)列出文件目录:dir

(14)退出:logout

二.总体设计

【算法思想】

先建立512个块,每个块对应512个字节,在建立一个有512个元素的字符数组,每个元素对应相应的块号,不管是文件或是目录都有I节点,建立自己设定数目元素的I节点表,并依次把位图区,I节点表,数据块区每个元素映射到一个二进制文件上。在每一次的操作中如果相应元素有变动,则对应在文件中更新输出相应数据,以便下一次启动程序的时候可以快速导入上一次的数据。

【系统总体框架图】

【系统总体流程图】

三.详细设计

【各模块功能说明】

1.format 模块 功能:

格式化文件系统,即初始化文件系统,相当于硬盘的格式化。将其中原

有的用户及用户下的文件系统全部还原初始状态,即没有任何用户和目录、文件,也就是按设计的文件系统格式重建新的文件系统。

2. get_blknum 和release_blk 模块 功能:

get_blknum 找到一个空闲数据块,并修改对应位图号元素为1。 release_blk 修改对应的位图元素,并把文件系统中对应的数据块清零。

开始

文件系统是否建立? 在内存中申请内存空间 将磁盘上的文件读入内存

Y

N

用户登录模块,输入用户名和密码,可以 在程序中设定,不用保存在文件系统中 用户名、密码对吗? 执行init(),进行初始化 操作,进入用户子目录

执行command(),对用户输入的命令进行解析和 执行。若数据被修改或新建立,则保存主存i 节 点和数据块的内容到内存的文件系统,并写回磁 盘,保存修改。若输入错误命令则显示出错信息。 退出用户(logout)吗?

用户输入quit 吗?

结束

执行format(), 建立文件系统

N

N

N

Y

Y

Y

3. init()模块

功能:读入文件系统

4.quit()模块

功能:退出系统

5 .creat()模块

功能:

创建文件,分配一空目录项,分配磁盘块。可用位示图。填写该空目录项。如文件长度(0),文件名,类型等。

6. open()模块

功能:

打开文件,并判断文件类型和打开方式。如果文件没有在文件打开表中就在文件打开表中建立该文件项。

7. close()模块

功能:

关闭文件,删除该文件的用户打开文件表目。

8. write()模块

功能:

写文件,需要先打开文件。并判断文件权限。写完后修改文件系统中的对应数据区。

9. read()模块

功能:读文件。需先打开文件。读入相应数据块的内容到缓冲区,然后输出。

10.delet()模块

功能:

如果参数是文件则删除文件,如果是目录则删除该目录下的所有文件和目录。

11.mkdir()

功能:建立新的目录,先在I节点表中找到一个未使用的,并初始化该I节点,并在文件系统中对应更新输出。

12.cd()

功能:将当前目录切换到当前目录的一个子目录下或当前目录的父目录。

程序流程图

各功能模块流程图

否 否

遍历i 节点区

argv[1]=”..” 目录是否存在

找到的目录i 节点号送当前目录inum_cur

当前目录的父i 节点号送当前目录inum_cur

开始

结束

改变当前目录cd()

读入位示图信息到内存

读入i 节点信息到内存

当前目录为根目录

初始化打开文件表 结束

开始

初始化函数init()

提示输入用户名和密码

用户名是否存在

创建新用户 读入用户信息到内存

开始

密码是否正确

结束

用户登陆login()

是 是

遍历i 节点区

i 节点的父节点是否为当前目录

i 节点区是否遍历完

输出文件名或目录名

开始 结束

显示目录dir()

遍历i 节点区

要创建的目录是否存在

是否有空的i 节点

遍历i 节点区 分配一个目录i 节点

开始 结束

创建目录mkdir()

否 是

遍历i 节点区

要打开的文件是否存在

提示输入打开模式

将打开文件信息写入打开文件信息表file_array[]

遍历打开文件表file_array[]

文件是否已经打开

提示输入开始位置和读字节数 调用读块操作,读出块内字符

模式是否为可读 开始 结束

开始

结束 打开文件open()

读文件read()

否 遍历i 节点区

要创建的文件是否存在

是否有空的i 节点

遍历i 节点区

分配一个文件i 节点

开始 结束

创建文件creat()

遍历打开文件表file_array[]

文件是否已经打开

提示输入写入字节数 调用写块操作,写入块内字符

模式是否为可写

遍历打开文件

表file_array[]

文件是否已经打开

将打开文件表项标志位置-1 file_array[i].inum = -1

开始

结束 写文件write()

开始

结束

关闭文件close()

四.代码调试

1.初始化和登陆文件系统

第一次运行程序

2.建立新目录,显示当前目录下的文件和目录,并转到新目录下

遍历i 节点区

要删除的文件是否存在 释放文件对应的i 节点区inode_array[i].inum = -1

释放两个磁盘块

文件是否大于的一块

释放一个磁盘块

开始

结束

删除文件delet()

3.建立新的文件,打开,写,读。

4.clear清屏后,dir查看当前目录下文件信息

5.返回根目录下,并删除根目录下所有子目录和文件

6.logout退出登录或quit退出程序。

五. 总结

开始第一天构思,不断的筛选证明模拟UNIX下的内存方法,并在网络上查找相应的UNIX环境资料。接下来几天开始实践动手,从整体框架开始构思,到各个细节端口的实现。

操作系统是计算机科学与技术专业中的一门重要基础课,目的是让我们了解操作系统的基本概念,理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。通过课程设计,可以进一步理解在计算机系统上运行的其它各类操作系统,并懂得在操作系统的支持下建立自己的应用系统。操作系统课程设计,对于训练我们掌握程序设计、熟悉上机操作和程序调试技术都有重要作用。重点培养我们的思维能力、创新能力和排错能力。

通过课程设计,进一步融会贯通教材内容,掌握程序各功能模块的工作原理,相互联系和来龙去脉,完整地建立系统的概念。激发我的学习热情和主动性,培养我的独立工作能力,在实践活动中,将所学知识综合运用,增长才干,并积累经验。对编程语言又有了更深一层次的认识,并对编程能力有所加强,但还是很多的不足有待改进,对于编程来说还需要大量的实践,才能在发现问题和解决问题中前进与提高。

六.附录

源代码:

// head.h文件

#include

#include

#include

#include

#include

using namespace std;

#define BLKSIZE 512 // 数据块的大小

#define BLKNUM 512 // 数据块的块数

#define INODESIZE 32 // i节点的大小

#define INODENUM 32 // i节点的数目

#define FILENUM 8 // 打开文件表的数目

//用户

typedef struct

{

char user_name[10]; // 用户名

char password[10]; // 密码

} User;

//i节点

typedef struct

{

short inum; // 文件i节点号

char file_name[10]; // 文件名

char type; // 文件类型

char user_name[10]; // 文件所有者

short iparent; // 父目录的i节点号

short length; // 文件长度

short address[2]; // 存放文件的地址

} Inode;

//打开文件表

typedef struct

{

short inum; // i节点号

char file_name[10]; // 文件名

short mode; // 读写模式(1:read, 2:write,

// 3:read and write) } File_table;

// 申明函数

void login(void);

void init(void);

int analyse(char *);

void save_inode(int);

int get_blknum(void);

void read_blk(int);

void write_blk(int);

void release_blk(int);

void pathset();

void del(int);

// 用户命令处理函数

void help(void);

void cd(void);

void dir(void);

void mkdir(void);

void creat(void);

void open(void);

void read(void);

void write(void);

void close(void);

void delet(void);

void logout(void);

void command(void);

void quit();

//main.cpp文件

#include "head.h"

//定义全局变量

char c hoice;

int argc; // 用户命令的参数个数

char *argv[5]; // 用户命令的参数

int inum_cur; // 当前目录

char t emp[2*BLKSIZE]; // 缓冲区

User user; // 当前的用户

char b itmap[BLKNUM]; // 位图数组

Inode inode_array[INODENUM]; // i节点数组

File_table file_array[FILENUM]; // 打开文件表数组

char i mage_name[10] = "data.dat"; // 文件系统名称

FILE *fp; // 打开文件指针

//创建映像hd,并将所有用户和文件清除

void format(void)

{

int i;

Inode inode;

printf("Will be to format filesystem...\n");

printf("WARNING:ALL DATA ON THIS FILESYSTEM WILL BE LOST!\n");

printf("Proceed with Format(Y/N)?");

scanf("%c", &choice);

getchar();

if((choice == 'y') || (choice == 'Y'))

{

if((fp=fopen(image_name, "w+b")) == NULL)

{

printf("Can't create file %s\n", image_name);

exit(-1);

}

for(i = 0; i < BLKSIZE; i++)

fputc('0', fp);

inode.inum = 0;

strcpy(inode.file_name, "/");

inode.type = 'd';

strcpy(https://www.sodocs.net/doc/789589453.html,er_name, "/");

inode.iparent = 0;

inode.length = 0;

inode.address[0] = -1;

inode.address[1] = -1;

fwrite(&inode, sizeof(Inode), 1, fp);

inode.inum = -1;

for(i = 0; i < 31; i++)

fwrite(&inode, sizeof(Inode), 1, fp);

for(i = 0; i < BLKNUM*BLKSIZE; i++)

fputc('\0', fp);

fclose(fp);

// 打开文件user.txt

if((fp=fopen("user.txt", "w+")) == NULL)

{

printf("Can't create file %s\n", "user.txt");

exit(-1);

}

fclose(fp);

printf("Filesystem created successful.Please first login!\n");

}

return ;

}

// 功能: 用户登陆,如果是新用户则创建用户

void login(void)

{

char *p;

int flag;

char user_name[10];

char password[10];

char file_name[10] = "user.txt";

do

{

printf("login:");

gets(user_name);

printf("password:");

p=password;

while(*p=getch())

{

if(*p == 0x0d)

{

*p='\0'; //将输入的回车键转换成空格

break;

}

printf("*"); //将输入的密码以"*"号显示

p++;

}

flag = 0;

if((fp = fopen(file_name, "r+")) == NULL)

{

printf("\nCan't open file %s.\n", file_name);

printf("This filesystem not exist, it will be create!\n");

format();

login();

}

while(!feof(fp))

{

fread(&user, sizeof(User), 1, fp);

// 已经存在的用户, 且密码正确

if(!strcmp(https://www.sodocs.net/doc/789589453.html,er_name, user_name) &&

!strcmp(user.password, password))

{

fclose(fp);

printf("\n");

return ;

}

// 已经存在的用户, 但密码错误

else if(!strcmp(https://www.sodocs.net/doc/789589453.html,er_name, user_name))

{

printf("\nThis user is exist, but password is incorrect.\n");

flag = 1;

fclose(fp);

break;

}

}

if(flag == 0) break;

}while(flag);

// 创建新用户

if(flag == 0)

{

printf("\nDo you want to creat a new user?(y/n):");

scanf("%c", &choice);

gets(temp);

if((choice == 'y') || (choice == 'Y'))

{

strcpy(https://www.sodocs.net/doc/789589453.html,er_name, user_name);

strcpy(user.password, password);

fwrite(&user, sizeof(User), 1, fp);

fclose(fp);

return ;

}

if((choice == 'n') || (choice == 'N'))

login();

}

}

// 功能: 将所有i节点读入内存

void init(void)

{

int i;

if((fp = fopen(image_name, "r+b")) == NULL)

{

printf("Can't open file %s.\n", image_name);

exit(-1);

}

// 读入位图

for(i = 0; i < BLKNUM; i++)

bitmap[i] = fgetc(fp);

// 显示位图

// 读入i节点信息

for(i = 0; i < INODENUM; i++)

fread(&inode_array[i], sizeof(Inode), 1, fp);

// 显示i节点

// 当前目录为根目录

inum_cur = 0;

// 初始化打开文件表

for(i = 0; i < FILENUM; i++)

file_array[i].inum = -1;

相关主题