模拟文件系统的设计与实现
- 格式:doc
- 大小:167.50 KB
- 文档页数:21
中北大学
操作系统课程设计
说明书
学院、系:软件学院
专业:软件工程
学生姓名:xxx 学号:xxx
设计题目:模拟文件系统的设计与实现
起迄日期: 2015年12月28日- 2016年1月8日指导教师:xxx
2016 年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 //最大写入文字长度128KB
struct 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 if(!strcmp(cur_dir->directitem[j].name,name)) break; } if(j return(-4); for(i=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 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';