操作系统课程设计-文件系统的模拟设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统课程设计报告题目:文件系统的模拟设计

一、设计目的

本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。

二、设计内容

(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函数),申请失败则结束。将文件内容写入inode空间和block空间。修改当前目录的结构,修改inode位图,block位图,写入模拟硬盘。详细过程如流程图1.2所示:

③、打开文件函数

对文件进行关闭操作,若此时文件不存在或处于读状态或写状态,则返回关闭失败信息;若此时文件处于空闲状态,则调用Close函数进行关闭操作。流程图如图1.3所示:

④、关闭文件系统函数

对文件进行打开操作,若此时文件不存在或已处于打开状态或读状态或写状态,则返回打开失败信息;若此时文件处于空闲状态,则调用Open函数进行打开操作。流程图如图1.4所示:

(4)运行结果分析

程序结果如图1.5-1.7所示

图1.5

图1.6

图1.7

(5)设计小结

操作系统课程设计是本课程重要的实践教学环节。课程设计的目的,一方面使学生更透彻地理解操作系统的基本概念和原理,使之由抽象到具体;另一方面,通过课程设计加强学生的实验手段与实践技能,培养学生独立分析问题、解决问题、应用知识的能力和创新精神。与本课程的实验教学相比,课程设计独立设课,具有更多的学时,给学生更多自行设计、自主实验的机会,充分放手让学生真正培养学生的实践动手能力,全面提高学生的综合素质。

对于本次操作系统课程设,由于Linux比较陌生,刚起步阶段花了很大时间去查阅各种资料。当完成设计时,感觉掌握了以前学到的知识,并且还对操作系统应用有了更深入的认识。对二级文件系统也有了很好的了解,熟练C语言布局的使用,如何解决实现里面功能的各种问题。

(6)参考文献

[1]计算机操作系统(第3版),汤小丹,西安电子科技大学出版社,2007年7月

[2]C语言程序设计,孟庆昌,人民邮电出版社,2006年4月

[3]计算机操作系统教程(第3版)习题解答与实验指导,张尧学,清华大学出版社,2006年11月

(7)附源代码

12、显示列表函数dir( )和目录创建函数mkdir( )等(文件名dir.c)

#include "stdio.h"

#include "string.h"

#include "filesys.h"

_dir( ) /*dir*/

{ unsigned int di_mode;

int i,j,one;

struct inode *temp_inode;

printf("\nCURRENT DIRECTORY:\n");

for(i=0;i

{if(!(strcmp(dir.direct[i].d_name,""))&&(dir.direct[i].d_ino==0)) { dir.size = i;break; }}

for(i=0;i

{if (dir.direct[i].d_ino!=DIEMPTY)

{ printf("%14s ,dir.direct[%d].d_ino = %d, 属

性:",dir.direct[i].d_name,i,dir.direct[i].d_ino);

temp_inode=iget(dir.direct[i].d_ino);

di_mode=temp_inode->di_mode;

for(j=0;j<12;j++)

{ one=di_mode%2;

di_mode=di_mode/2;

if (one)

printf("x");

else

printf("-");}

if(temp_inode->di_mode & DIFILE)

{ printf(" %d bytes\n",temp_inode->di_size);

printf("block chain of the file:");

for(j=0;jdi_size/BLOCKSIZ+1;j++)

printf("%d--",temp_inode->di_addr[j]);

printf("end\n"); }

else

相关文档
最新文档