简单多用户文件系统2.doc_第1页
简单多用户文件系统2.doc_第2页
简单多用户文件系统2.doc_第3页
简单多用户文件系统2.doc_第4页
简单多用户文件系统2.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第 18 页 共 18 页_U8 bfree(_U32 BlkID)回收数据块BlkID为指定的数据块编号_U8 _dir()列表显示当前目录下内容int namei(const char * name)由文件名在当前目录下寻找文件Name为文件名_U8 mkdir(const char *name)在当前目录下创建目录项Name为文件名int _chdir(const char *name)更改目录Name为文件名int format()格式化磁盘int shell()用户界面void halt()退出程序_U8 ifree(_U32 InodeID)回收索引节点InodeID为索引节点编号struct ext2_inode_info * iget(_U32 InodeID)读取磁盘索引节点到内存InodeID为索引节点编号struct ext2_inode_info *ialloc()分配索引节点int iput(struct ext2_inode_info *PInode)释放内存索引节点PInode为要写回的内存索引节点int install()文件系统初始化void main()文件系统主程序int login()用户登陆void logout()用户退出4.5 算法流程图Iget函数Ialloc函数Balloc函数_dir函数Namei函数Mkdir函数五、数据分析5.1 输入数据连续输入命令:mkdir ketianmkdir cfmkdir zhongmkdir renmingmkdir usamkdir cqitmkdir caofangmkdir tian5.2 输出数据分析在连续输入以上命令之后,使用ls命令查看当前目录内的内容,下图是显示界面:列表显示的第1列是文件名,第2列是相应文件的索引节点,第3和第6列是文件类型,第5列显示了文件使用的磁盘块编号。我们可以看到磁盘块的编号先是从517到518,然后跳过519到520。其实519是被密码文档占用了,如果我们使用cd home命令就可以看到在它下面有一个名为pas的文档,它所使用的磁盘块就是519。下面磁盘块从520到524分别被文件ketian、cf、zhong、renming和usa占用了,然后磁盘块跳过了525到了526。但除home下有一个文件之外其它的没有,按照常理应该会有525盘块。但实际上没有,这是为什么呢?在前面我们说过目录采用直接指针方式。其实每个磁盘块只能容纳8个目录项,在usa目录之后,在该目录下已经有了8个目录项,当再次创建目录时,程序会再次为当前目录分配一个磁盘块来容纳多出的目录项。六、使用说明6.1欢迎界面6.2 用户登陆界面6.3 系统使用界面6.4 创建目录及显示目录界面七、课程设计总结7.1 与给定文件系统的对比分析l 灵活,自动。在我们写的文件系统中增加了磁盘读写函数,可以灵活的读取磁盘内容,省去了每次都要计算地址和调用fseek函数的操作。l 目录优化。在给定的文件系统中它有个结构体struct direct来表示目录。这样做虽然使得程序的编写较为简单,但只能把目录写在一个磁盘块内不符合实际。我们的程序采用直接指针方式,可把目录项写在连续或不连续的磁盘块内。l 磁盘容量。我们采用了EXT2的磁盘组织方式,在理论上它可组织小于4TB的磁盘容量;但给定的文件系统有个容量限制。有这个限制的原因是,其文件系统只有一个块位图,所以其大小就限制在该块位图所能表示的磁盘块内了。7.2 未完成部分及改进方法由于时间原因,我们没有完成该文件系统的所有功能,包括:创建文件、删除文件、打开文件、关闭文件、读文件和写文件。但我们已经写出了所用到的底层函数,只有增加相应的函数来调用这些底层函数,即可完成文件操作功能。7.2 课程设计总结对一个实际使用中的操作系统而言,文件系统和进程管理是最为重要的两个部分。实际分析一个操作系统的源代码,对我们的编程、分析和综合能力都是大有裨益的。除此之外研究文件系统的原理将有助于我们深入理解Linux内核结构及其设计思想。在分析Linux Kernel 2.4.13文件系统源代码的基础上,提出了关于Linux文件系统的基本概念、虚拟文件系统原理及Linux标准根文件系统EXT2的结构和数据存取原理,同时实际变成模拟了它的这些功能,锻炼了自己的编程能力。八、参考文献1 蒋静 徐志伟.操作系统原理技术与编程M.北京:机械工业出版社,20042 汤子瀛 哲凤屏 汤小丹.计算机操作系统M.西安:西安电子科技大学出版社,20013 尤晋元等. UNIX环境高级编程M. 北京:机械工业出版社,2002.4 陈莉君 冯锐 牛欣源.深入理解LINUX内核M.北京:中国电力出版社,20045 包怀忠. EXT2 文件系统分析J. 计算机工程与设计,2005(4):1022-10246 郭学理 韦智 潘松.Linux的Ext2文件系统J。计算机应用研究,2001(5):128-1307 毛德操 胡希明. Linux内核源代码情景分析M.浙江:浙江大学出版社,20018 史芳丽 周亚莉. Linux 系统中虚拟文件系统内核机制研究J.陕西师范大学学报(自然科学版),2005(1):29-32九、程序源代码及注解Types.h/*Athor: CaoFang*Time: Thu Nov 17 18:31:07 2005*Action: 该头文件中定义了在程序中使用的主要数据类型*/#ifndef _I386_TYPES_H#define _I386_TYPES_H#define VARTYPE 1 /1为在vc下编译#if VARTYPE=1typedef unsigned int _U32; typedef unsigned short _U16;typedef unsigned char _U8;typedef int _S32; typedef short _S16;typedef char _S8;#elsetypedef unsigned long _U32;typedef unsigned int _U16;typedef unsigned char _U8;typedef long _S32;typedef int _S16;typedef char _S8;#endif#endifFiletype.h#ifndef _FILETYPE_#define _FILETYPE_#define UKN0x0000/0 未知#define REG0x0001/1 普通文件#define DIR0x0002/2 目录文件#define CHR0x0003/3 字符设备#define BLK0x0004/4 块设备#define FIFO0x0005/5 命名管道#define SOCK0x0006/6 套接字#define LNK0x0007/7 符号链接#defineS_IREG(flag)(flag=0x01)?REG:0/1 判断普通文件#defineS_IDIR(flag)(flag=0x02)?DIR:0/2 判断目录文件#defineS_ICHR(flag)(flag=0x03)?CHR:0/3 判断字符设备#defineS_IBLK(flag)(flag=0x04)?BLK:0/4 判断块设备#defineS_IFIFO(flag)(flag=0x05)?FIFO:0/5 判断命名管道#defineS_ISOCK(flag)(flag=0x06)?SOCK:0/6 判断套接字#defineS_ILNK(flag)(flag=0x07)?LNK:0/7 判断符号链接#endifBitmap.c#include sys.hextern FILE *disk;extern struct ext2_super_block *CurSb;extern _U8 MapTbl8; extern _U8 IbitmapBLOCKSIZE_BT+2; /索引节点位图extern _U8 BbitmapBLOCKSIZE_BT+2; /数据块位图 extern struct ext2_inode_info * HashTblHASHSIZE; /内存索引接点的hash表extern struct file * FileHashHASHSIZE;extern struct fs_struct * cfs;_U8 PutBbitmap()_U32 Offset;Offset=2+GROUPDESCNUM_BK+BbitmapBLOCKSIZE_BT*GROUPSIZE_BK;WriteBlk(Offset,Bbitmap,sizeof(char),BLOCKSIZE_BT);return SUCESS_EXT;_U8 ReadBbitmap(_U32 GroupID)_U32 Offset;Offset=2+GROUPDESCNUM_BK+GroupID*GROUPSIZE_BK;ReadBlk(Offset,Bbitmap,sizeof(char),BLOCKSIZE_BT);BbitmapBLOCKSIZE_BT=GroupID;return SUCESS_EXT;_U8 PutIbitmap()_U32 Offset;Offset=3+GROUPDESCNUM_BK+BbitmapBLOCKSIZE_BT*GROUPSIZE_BK;WriteBlk(Offset,Ibitmap,sizeof(char),BLOCKSIZE_BT);return SUCESS_EXT;_U8 ReadIbitmap(_U32 GroupID)_U32 Offset;Offset=3+GROUPDESCNUM_BK+GroupID*GROUPSIZE_BK;ReadBlk(Offset,Ibitmap,sizeof(char),BLOCKSIZE_BT);IbitmapBLOCKSIZE_BT=GroupID;return SUCESS_EXT;Block.c#include sys.hvoid ReadBlk(_U32 BlkID,void * DataType,_U32 TypeSize,_U32 TypeNum)/成功fseek(disk,BlkID*BLOCKSIZE_BT,SEEK_SET);fread(DataType,TypeSize,TypeNum,disk);void WriteBlk(_U32 BlkID,void * DataType,_U32 TypeSize,_U32 TypeNum)/成功fseek(disk,BlkID*BLOCKSIZE_BT,SEEK_SET);fwrite(DataType,TypeSize,TypeNum,disk);struct ext2_group_desc * Gdget(_U32 GdID) /从组0中读取struct ext2_group_desc *gd;_U32 Add=2*BLOCKSIZE_BT+GdID*GROUP_DESC_LEN;if(GdID=GROUPNUM_FS)printf(W:GdID=%dn,GROUPNUM_FS);exit(1);gd=(struct ext2_group_desc *)malloc(GROUP_DESC_LEN);fseek(disk,Add,SEEK_SET);fread(gd,GROUP_DESC_LEN,1,disk);return gd;_U8 Gdput(struct ext2_group_desc * gd) /要把它分别放在不同的组中_U32 i;_U32 Add;for(i=0;ibg_id*GROUP_DESC_LEN+2*BLOCKSIZE_BT+i*GROUPSIZE_BT;fseek(disk,Add,SEEK_SET);fwrite(gd,GROUP_DESC_LEN,1,disk);return SUCESS_EXT;struct ext2_super_block * GetSb() /成功struct ext2_super_block *ReSb;ReSb=(struct ext2_super_block *)malloc(SUPER_BLOCK_LEN);ReadBlk(1,ReSb,SUPER_BLOCK_LEN,1);return ReSb;int PutSb(struct ext2_super_block * Sb) /成功_U32 BlkID,i;for(i=0;is_free_blocks_count=0)printf(ERROR!);return 0;for(i=0;ibg_free_blocks_count!=0)GroupID=i;break;PutBbitmap();ReadBbitmap(GroupID);for(i=0;iMAPINDEX;i+)if(Bbitmapi0xFF)for(j=0;jbg_free_blocks_count-;CurSb-s_free_blocks_count-;Gdput(gd);return BlkID;_U8 bfree(_U32 BlkID) /成功_U32 i,index;_U32 GroupID=BlkID/GROUPSIZE_BK;struct ext2_group_desc *gd;gd=Gdget(GroupID);gd-bg_free_blocks_count+;Gdput(gd);CurSb-s_free_blocks_count+;if(BbitmapBLOCKSIZE_BT!=GroupID)PutBbitmap();ReadBbitmap(GroupID); /读出数据快位图for(i=0;iMAPINDEX;i+)printf(i :%d %d ,i,Bbitmapi);i=(BlkID%GROUPSIZE_BK)/8;index=BlkID%8;Bbitmapi&=(MapTblindex);printf(i: %d index: %d b:%dn,i,index,Bbitmapi);return SUCESS_EXT;Dir.c#define _DEF_FORMAT_#include sys.hchar stack10EXT2_NAME_LEN;int curs=0;_U8 _dir()int i,j=0,k,num,CurCount,over=0,count=0;_U32 blkid;struct ext2_dir_entry temp;struct ext2_inode_info *Inode;for(i=01;id_pwd);CurCount=cfs-pwd-i_size/DIR_ENTRY_LEN; /目录项的个数for(i=0;ipwd-i_datai;for(k=0;ki_data0);if(S_IREG(temp.file_type)printf(%4s,);else if(S_IDIR(temp.file_type)printf(%4s,);else if(S_ICHR(temp.file_type)printf(%4s,);else if(S_IBLK(temp.file_type)printf(%4s,);else if(S_IFIFO(temp.file_type)printf(%4s,);else if(S_ISOCK(temp.file_type)printf(%4s,);else if(S_ILNK(temp.file_type)printf(%4s,);else printf(%4s,);printf(n);iput(Inode);count+;if(count=CurCount)over=1;break;if(over) break;return SUCESS_EXT;int namei(const char * name)struct ext2_dir_entry dir ;int i,j,over=0;_U32 BlkID,InodeID,CurCount,Count=0;CurCount=cfs-pwd-i_size/DIR_ENTRY_LEN;for(i=0;ipwd-i_datai;for(j=0;j=CurCount)over=1;break;if(over) break;return -1;_U8 mkdir(const char *name)_U32 ExistID,BlkID,CurCount,flag=0,SCount=0,Add;int i,j=0;struct ext2_inode_info *Inode;struct ext2_dir_entry temp,dir2;ExistID=namei(name);if(ExistID!=-1|ExistID=cfs-pwd-i_inode)printf(This a same file or dir!Can notn);return 0;if(cfs-pwd-i_size=cfs-pwd-i_blocks*BLOCKSIZE_BT)BlkID=balloc();cfs-pwd-i_datacfs-pwd-i_blocks=BlkID;cfs-pwd-i_blocks+;Add=BlkID*BLOCKSIZE_BT;elseCurCount=cfs-pwd-i_size/DIR_ENTRY_LEN;for(i=0;ipwd-i_datai;for(j=0;j=CurCount) flag=2;break;if(flag) break;if(flag=1)Add=j*DIR_ENTRY_LEN+BlkID*BLOCKSIZE_BT;elseAdd=ftell(disk);Inode=ialloc();BlkID=balloc();/在父目录里的目录项strcpy(,name);temp.inode=Inode-i_inode;temp.rec_len=strlen(name);temp.file_type=2;fseek(disk,Add,SEEK_SET);fwrite(&temp,DIR_ENTRY_LEN,1,disk);printf(kk1%dn,Inode-i_inode);/在索引节点表中添加一个time(&Inode-i_mtime);time(&Inode-i_atime);time(&Inode-i_ctime);Inode-i_blocks=1;Inode-i_data0=BlkID;Inode-i_links_count=1;Inode-i_count=1;Inode-i_mode=2;Inode-i_size=2*DIR_ENTRY_LEN;dir0.file_type=2;dir0.inode=cfs-pwd-i_inode;dir0.rec_len=strlen(.);strcpy(,.);dir1.file_type=2;dir1.inode=Inode-i_inode;dir1.rec_len=strlen(.);strcpy(,.);WriteBlk(BlkID,dir,DIR_ENTRY_LEN,2);cfs-pwd-i_size+=DIR_ENTRY_LEN;iput(Inode);return SUCESS_EXT;int _chdir(const char *name)_U32 InodeID;struct ext2_inode_info *Inode;strcpy(stack0,/);InodeID=namei(name);if(InodeID=-1)printf(error file name:%sn,name);return 1;if(InodeID=cfs-pwd-i_inode)return 1;Inode=iget(InodeID);iput(cfs-pwd);cfs-pwd=Inode;if(strcmp(name,.)!=0)/进入底层目录strcpy(stackcurs+,cfs-d_root);strcpy(cfs-d_root,cfs-d_pwd);strcpy(cfs-d_pwd,name);printf(stack:%sn,stackcurs-1);else /返回目录strcpy(cfs-d_pwd,cfs-d_root);strcpy(cfs-d_root,stackcurs-);if(curs0) curs=0;_dir();return 1; Format.c#define _DEF_FORMAT_#include sys.hint format()struct ext2_super_block supblk;struct ext2_group_desc gd;struct ext2_dir_entry dir_temp3;struct ext2_inode temp;int i,j;_U32 BlkID;struct user_struct user4=1000,1000,ketian,1111,home,1001,1000,cf,2222,home,2000,2000,tian,3333,home,2001,2000,cao,4444,home;if(disk=fopen(disk.disk,wb+)=NULL)printf(OPEN DISK ERROR !);exit(1); fseek(disk,RDISKSIZE_BT*sizeof(char)-1,SEEK_SET);fputc(12,disk);supblk.s_blocks_count=BLOCKNUM_FS; /* 磁盘总的逻辑块数 */supblk.s_blocks_count=BLOCKNUM_FS; /* 磁盘总的逻辑块数 */supblk.s_free_blocks_count=FREEBLKNUM_PGUP; /* 空闲块计数器 Free blocks count */supblk.s_blocks_per_group=GROUPSIZE_BK; /* 每组逻辑块数 */supblk.s_free_inodes_count=DINODENUM_FS; /weidingyhisupblk.s_inode_size=INODE_LEN; /* 磁盘上索引节点结构的大小 size of inode structure */supblk.s_inodes_count=DINODENUM_FS; /* 磁盘总的索引节点数 */supblk.s_inodes_per_group=DINODENUM_PGUP; /* 每组中的节点数 Inodes per group */supblk.s_log_block_size =BLOCKSIZE_BT; /* 块的大小 Block size */supblk.s_magic=EXT2_SUPER_MAGIC;time(&supblk.s_mtime);time(&supblk.s_wtime); PutSb(&supblk);CurSb=GetSb();/*初始化组描述符*/for(j=0;jGROUPNUM_FS;j+)for(i=0;iGROUPNUM_FS;i+)gd.bg_id=i;gd.bg_block_bitmap=2+GROUPDESCNUM_BK+i*GROUPSIZE_BK; /* 块位图的块号 Blocks bitmap block */gd.bg_inode_bitmap=gd.bg_block_bitmap+1; /* 索引节点位图的块号 Inodes bitmap block */gd.bg_inode_table=gd.bg_inode_bitmap+1; /* 第一个索引节点表块的块号 Inodes table block */gd.bg_free_blocks_count=GROUPSIZE_BK-(4+GROUPDESCNUM_BK+DINODETBL_PGUP); /* 组中空闲块的个数 Free blocks count */ gd.bg_free_inodes_count=DINODENUM_PGUP; /* 组中空闲索引节点的个数 Free inodes count */bg_used_dirs_count; /* 组中目录的个数 Directories count */fseek(disk,i*GROUP_DESC_LEN+2*BLOCKSIZE_BT+j*GROUPSIZE_BT,SEEK_SET);fwrite(&gd,GROUP_DESC_LEN,1,disk); /*初始化位图部分 */for(i=0;iMAPINDEX;i+)Bbitmapi=0;Ibitmapi=0;for(i=0;i(FRISTDATA-1)/8;i+)Bbitmapi=0xFF;if(FRISTDATA-1)%8)for(j=0;j=(FRISTDATA-1)%8;j+)Bbitmapi|=MapTblj; /* 初始化数据块位图*/for(i=0;ii_next)if(ReInode-i_inode=InodeID)ReInode-i_count+;return ReInode;Add=(4+GROUPDESCNUM_BK+GroupID*GROUPSIZE_BK)*BLOCKSIZE_BT+(InodeID%DINODENUM_PGUP)*INODE_LEN;fseek(disk,Add,SEEK_SET);fread(Inode,INODE_LEN,1,disk); /向内存索引节点赋值ReInode=(struct ex

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论