基于C语言的操作系统虚拟文件系统模拟

Jasmine

发布日期: 2019-03-30 10:15:11 浏览量: 527
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

1、课程设计的目的

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

2、课程设计的内容及要求

了解EXT2文件系统,设计一个类EXT2型文件系统,所设计的文件系统要具备文件系统格式化、用户登录、用户注销、显示目录内容、文件创建、文件删除、目录创建和目录删除等功能,创建的文件不要求格式和内容,但要有相应的权限控制。

可以用一个文件或在内存中开辟一个虚拟磁盘空间来模拟文件系统的磁盘空间,要注意目录结构的设计和磁盘空间的分配与回收。程序能够在Linux环境运行并验证结果。

3、设计原理

根据对EXT2文件系统的原理,再结合Linux操作系统的命令格式的模拟,实现了对EXT2文件系统的虚拟实现。

4、设计说明

4.1 流程图

4.2 功能设计

  • 判断用户命令,按照固定的格式(仿照Linux系统中的命令输入格式)输入,通过对字符串的分割,获取相应的命令,每个命令对应着一个函数,执行命令函数,从而达到用户目的

  • 每个文件都对应着一个inode和一个block,并且inode指向block,如果是目录文件,那么inode指向的block中存放的是一个info链表,info链表存放的是该目录下的文件名和对应的inode号,如果是文件,那么inode指向的block中就是虚拟的文件的内容,默认创建文件是2个block。删除、创建、初始化都是对结构体进行操作

4.3 说明作用

Block结构体是存放的数据,inode结构体是存放的该文件的信息,info是存放的目录下的文件名和文件对应的inode号。然后定义了大小为200的block和inode结构体数组用来模拟磁盘空间。还有一个用户user结构体,里面存放的是用户信息。

5、具体实现

创建普通文件

  1. void createCatalog(char myName[])
  2. {
  3. int emptyInode,emptyBlock;
  4. struct info *n=(struct info *)malloc(sizeof(struct info));
  5. struct info *m;
  6. emptyInode=findEmptyInode(); system("cls");
  7. emptyBlock=findEmptyBlock();
  8. //printf("\n\n%d\n\n\n%d",emptyInode,nowBlock);
  9. m_inode[emptyInode].model=1;
  10. m_inode[emptyInode].nb=1;
  11. m_inode[emptyInode].block[0]=emptyBlock;
  12. m=m_block[nowBlock].p;
  13. if(m==NULL)
  14. {
  15. m_block[nowBlock].p=(struct info *)malloc(sizeof(struct info));
  16. m_block[nowBlock].p->next=NULL;
  17. m=m_block[nowBlock].p;
  18. }
  19. else
  20. {
  21. while(m->next)
  22. m=m->next;
  23. }
  24. strcpy(n->name,myName);
  25. n->toInode=emptyInode;
  26. n->next=NULL;
  27. m->next=n;
  28. }

创建目录文件

  1. void createFile(char myName[])
  2. {
  3. int size,emptyInode,i;
  4. struct info *n=(struct info *)malloc(sizeof(struct info));
  5. struct info *m;
  6. //printf("请输入文件大小!!!");
  7. //scanf("%d",&size);
  8. size=2;//默认文件大小为2个block
  9. emptyInode=findEmptyInode(m_inode);
  10. //printf("\n\n%d\n\n\n%d",emptyInode,nowBlock);
  11. m_inode[emptyInode].model=0;
  12. m_inode[emptyInode].size=size;
  13. m_inode[emptyInode].nb=2;
  14. for(i=0;i<m_inode[emptyInode].nb;i++)
  15. {
  16. m_inode[emptyInode].block[i]=findEmptyBlock(m_block);
  17. }
  18. m=m_block[nowBlock].p;
  19. if(m==NULL)
  20. {
  21. m_block[nowBlock].p=(struct info *)malloc(sizeof(struct info));
  22. m_block[nowBlock].p->next=NULL;
  23. m=m_block[nowBlock].p;
  24. }
  25. else
  26. {
  27. while(m->next)
  28. m=m->next;
  29. }
  30. strcpy(n->name,myName);
  31. n->toInode=emptyInode;
  32. n->next=NULL;
  33. m->next=n;
  34. }

显示目录中的内容

  1. void printCatalog(int i)

查找

  1. int find(char n[],int *tempBlock,char tempAccess[])

创建命令

  1. void createOrder(char contents[],int flag)

删除命令

  1. void rmOrder(char contents[])

显示命令

  1. void lsOrder(char contents[])

6、软件运行环境及限制

  • VC

  • win7

7、结果输出及分析

8、心得体会

通过这次综合课程设计,我学到了很多,首先最大的收获就是了解了EXT2文件系统的一些原理,也只能说理解,因为毕竟是模拟还有很多具体的细节都还是有些不懂,同时还巩固了C语言字符串的处理,课程设计中还是遇到很多问题,也解决了很多问题,总之通过这次课程设计还是提高了自我的能力。

上传的附件 cloud_download 基于C语言的操作系统虚拟文件系统模拟.7z ( 80.04kb, 9次下载 )
error_outline 下载需要8点积分

发送私信

当你成功时,谁还在乎你的过去

11
文章数
13
评论数
最近文章
eject