操作系统实验文件系统设计2.docx

上传人:b****7 文档编号:10008777 上传时间:2023-02-07 格式:DOCX 页数:53 大小:28.94KB
下载 相关 举报
操作系统实验文件系统设计2.docx_第1页
第1页 / 共53页
操作系统实验文件系统设计2.docx_第2页
第2页 / 共53页
操作系统实验文件系统设计2.docx_第3页
第3页 / 共53页
操作系统实验文件系统设计2.docx_第4页
第4页 / 共53页
操作系统实验文件系统设计2.docx_第5页
第5页 / 共53页
点击查看更多>>
下载资源
资源描述

操作系统实验文件系统设计2.docx

《操作系统实验文件系统设计2.docx》由会员分享,可在线阅读,更多相关《操作系统实验文件系统设计2.docx(53页珍藏版)》请在冰豆网上搜索。

操作系统实验文件系统设计2.docx

操作系统实验文件系统设计2

实验5

实验内容及要求

实验内容:

为Linux系统设计一个简单的二级文件系统。

要求做到以下几点:

(1)可以实现下列几条命令(至少4条);

login用户登录

dir列文件目录

create创建文件

delete删除文件

open打开文件

close关闭文件

read读文件

write写文件

(2)列目录时要列出文件名、物理地址、保护码和文件长度;

(3)源文件可以进行读写保护。

要求:

实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。

要求认真读懂程序,分析程序,并根据执行结果,分析原因。

用户要按通常实验要认真书写实验报告。

实验提示:

(1)首先应确定文件系统的数据结构:

主目录、子目录及活动文件等。

主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。

(2>用户创建的文件,可以编号存储于磁盘上。

如file0,file1,file2...并以编号作为物理地址,在目录中进行登记。

实验过程

1.设计思想

本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户账号下的文件。

另外,为了简单本文件系统未考虑文件共享、文件系统安全以及管道文件与设备文件等特殊内容。

对这些内容感兴趣的读者,可以在本系统的程序基础上进行扩充。

2.主要数据结构

(1)i节点

structinode{

structinode*i_forw;

structinode*i_back;

chari_flag;

unsignedintI_tmp//磁盘i节点标号

unsignedintI_count;//引用计数

unsignedshortdi_number;//关联文件数,当为0时,则删除该文件

unsignedshortdi_mode;//存取权限

unsignedshortdi_uid;//磁盘i节点用户id

unsignedshortdi_gid;//磁盘i节忠组id

unsignedintdi_addr[NADDR];//物理块号

}

(2)磁盘i节点

//关联文件数

structdinode{

unsignedshortdi_number;//关联文件数

unsignedshortdi_mode;//存取权限椅

unsignedshortdi_uid;

unsignedshortdi_gid;

unsignedlongdi_size;//文件大小

unsignedintdi_addr[NADDR];//物理块号

}

(3)目录项结构

structdirect{

chard_name[DIRSIZ];//目录名

unsignedintd_ino;//目录号

}

(4)超级块

structfilsys{

unsignedshorts_isize;//i节,点块块数

unsignedlongs_fsize;//数据块块数

unsignedints_nfree;//空闲块块数

unsignedshorts_pfree;//空闲块指针

unsignedints_free[NICFREE];//空闲块堆栈

unsignedints_ninode;//空闲i节点数

unsignedshorts_pinode;//空闲i节点指针

unsignedints_inode[NICINOD];//空闲i节点数组

unsignedints_rinodepr;//铭记i节点

chars_fmod;//超级块修改标志

}

(5)用户密码

structpwd{

unsignedshortp_uid;

unsignedshortp_gid;

charpassward[PW0SIZ];

}

(6)目录

structdir{

structdirectdirect[DIRNUM];

intsize;

}

(7)查找内存i节点的hash表

structhinode{

structinode*i_forw;

}

(8)系统打开表

structfile{

charf_flag;//文件操作标志

unsignedintf_count;//引用计数

structinode*f_inode;//指向内存i节点

unsignedlongf_off$;//读/写指针

}

(9)用户打开表

structuser{

unsignedshortu_default_mode;

unsignedshortu_uidid;//用户标志

unsignedshortu_gid;//用户组标志

unsignedshortu_ofile[NOFILE];//用户打开文件表

}

3.主要函数

(1)i节点内容获取函数iget()(详细描述略)。

(2)i节点内容释放函数iput()(详细描述略)。

(3)目录创建函数mkdir()(详细描述略)。

(4)目录搜索函数namei()(详细描述略)。

(5)磁盘块分配函数balloc()(详细描述略)。

(6)磁盘块释放函数bfree()(详细描述略)。

(7)分配i节点区函数ialloc()(详细描述略)。

(8)释放i节点区函数ifree()(详细描述略)。

(9)搜索当前目录下文件的函数iname()(详细描述略)

(10)访问控制函数access()(详细描述略)。

(11)显示目录和文件用函数dir()(详细描述略)。

(12)改变当前目录用函数chdir()(详细描述略)。

(13)打开文件函数open()(详细描述略)。

(14)创建文件函数create()(详细描述略)。

(15)读文件用函数read()(详细描述略)。

(16)写文件用函数write()(详细描述略)。

(17)用户登录函数login()(详细描述略)。

(18)用户退出函数logout()(详细描述略)。

(19)文件系统格式化函数format()(详细描述略)。

(20)进入文件系统函数install()(详细描述略)。

(21)关闭文件函数close()(详细描述略)。

(22)退出文件系统函数halt()(详细描述略)。

(23)文件删除函数delete()(详细描述略)。

4.主程序说明

Begin

Step1对磁盘进行格式化

Step2调用install(),进入文件系统

Step3调用dir(),显示当前目录

Step4调用login(),用户注册

Step5调用mkdir()和chdir()创建目录

Step6调用create(),创建文件

Step7分配缓冲区

Step8写文件

Step9关闭文件0和释放缓冲

Step10调用mkdir()和chdir()创建子目录

Step11调用create(),创建文件1

Step12分配缓冲区

Step13写文件1

Step14关闭文件l和释放缓冲

Step15调用chdir将当前目录移到上一级

Step16调用creat(),创建文件2

Step17分配缓冲区

Step18调用write(),写文件2

Step19关闭文件2和释放缓冲

Step20调用delete(),删除文件。

Step21调用create(),创建文件3

Step22为文件3分配缓冲区

Step23调用write(),写文件3

Step24关闭文件3并释放缓冲区

Step25调用open(),打开文件2

Step26为文件2分配缓冲

Step27写文件3后关闭文件3

Step28释放缓冲

Step29用户退出(logout)

Step30关闭(halt)

end

由上述描述过程可知,该文件系统实际是为用户提供一个解释执行相关命令的环境。

主程序中的大部分语句都被用来执行相应的命令。

下面,我们给出每个过程的相关C语言程序。

读者也可以使用这些子过程,编写出一个shell控制的文件系统界面。

<程序>

1.编程管理文件makefile

本文件系统程序用makefile编程管理工具进行管理。

其内容如下。

###makefile###

filesys:

main.oigetput.oiallfre.oballfre.oname.oaccess.olog.oclose.ocreat.odelete.odir.oopen.ordwt.oformat.oinstall.ohalt.o

cc-ofilsysmain.oigetput.oiallfre.oballfre.oname.oaccess.olog.oclose.ocreat.odelete.odir.oopen.ordwt.oformat.oinstall.ohalt.o

main.o:

main.cfilesys.h

cc-cmain.c

igetput.o:

igetput.cfilesys.h

cc-cigetput.c

iallfre.o:

iallfre.cfilesys.h

cc-ciallfre.c

ballfre.o:

ballfre.cfilesys.h

cc-cballfre.c

name.o:

name.cfilesys.h

cc-cname.c

access.o:

access.cfilesys.h;

cc-caccess.c

log.o:

log.cfilesys.h

cc-clog.c

close.o:

close.cfilesys.h

cc-cclose.c

creat.o:

creat.cfilesys.h

cc-ccreat.c

delete.o:

delete.cfilesys.h

cc-cdelete.c

dir.o:

dir.cfilesys.h

cc-cdir.c

dirlt.o:

dirlt.cfilesys.h

cc-cdirlt.c

open.o:

open.cfilesys.h

cc-copen.c

rdwt.o:

rdwt.cfilesys.h

cc-crdwt.c

format.o:

format.cfilesys.h

cc-cformat.c

install.o:

install.cfilesys.h

cc-cinstall.c

halt.o:

halt.c

cc-chalt.c

2.头文件filesys.h

头文件fiiesp.h用来定义本文件系统中所使用的各种数据结构和常数符号。

//filesys.h定义本文件系统中的数据结构和常数

//filesys.h定义本文件系统中的数据结构和常数

#defineBLOCKSIZ512

#defineSYSOPENFILE40

#defineDIRNUM128

#defineDIRSIZ14

#definePWDSIZ12

#definePWDNUM32

#defineNOFILE20

#defineNADDR10

#defineNHINO128

#defineUSERNUM10

#defineDINODESIZ32

//filsys

#defineDINODEBLK32

#defineFILEBLK512

#defineNICFREE50

#defineNICINOD50

#defineDINODESTART2*BLOCKSIZ

#defineDATASTART(2+DINODEBLK)*BLOCKSIZ

//di_mode

#defineDIEMPTY0000

#defineDIFILE01000

#defineDIDIR02000

#defineUDIREAD00001//user

#defineUDIWRITE00002

#defineUDIEXICUTE00004

#defineGDIREAD00010//group

#defineGDIWRITE00020

#defineGDIEXICUTE00040

#defineODIREAD00100//other

#defineODIWRITE00200

#defineODIEXECUTE00400

#defineREAD1

#defineWRITE2

#defineEXECUTE4

#defineDEFAULTMODE00777

//I_flag

#defineIUPDATE00002

//s_fmod

#defineSUPDATE00001

//f_flag

#defineFREAD00001

#defineFWRITE00002

#defineFAPPEND00004

//error

#defineDISKFULL65535

//fseekorigin

#defineSEEK_SET0

//文件系统数据结构

structinode{

structinode*i_forw;

structinode*i_back;

chari_flag;

unsignedinti_ino;//磁盘i节点标志

unsignedinti_count;//引用计数

unsignedshortdi_number;//关联文件数,当为0

unsignedshortdi_mode;//存取权限

unsignedshortdi_uid;

unsignedshortdi_gid;

unsignedintdi_size;//文件大小

unsignedintdi_addr[NADDR];//物理块号

};

structdinode{

unsignedshortdi_number;//善关联文件数铃/

unsignedshortdi_mode;//存取权限祷/

unsignedshortdi_uid;

unsignedshortdi_gidp;

unsignedlongdi_size;//文件大小

unsignedintdi_addr[NADDR];//祷物理块号费/

};

structdirect{

chard_name[DIRSIZ];

unsignedintd_ino;

};

structfilsys{

unsignedshorts_isize;//i节点块块数

unsignedlongs_fsize;//数据块块数

unsignedints_nfree;//空闲块块数

unsignedshorts_pfree;//空闲块指针

unsignedints_free[NICFREE];//空闲块堆钱

unsignedints_ninode;//空闲i节点数

unsignedshorts_pinode;//空闲i节点指针

unsignedints_inode[NICINOD];//空闲i节点数组

unsignedints_rinode;//铭记i节点

chars_fmod;//超级块修改标志

};

structpwd{

unsignedshortp_uid;

unsignedshortp_gid;

charpassword[PWDSIZ];

};

structdir{

structdirectdirect[DIRNUM];

intsize;//当前目录大小

};

structhinode{

structinode*i_forw;//hash表指针

};

structfile{

charf_flag;//文件操作标志

unsignedintf_count;//引用计数

structinode*f_inode;//指向内存i节点

unsignedlongf_off;//读/写指针

};

structuser{

unsignedshortu_default_mode;

unsignedshortu_uid;

unsignedshortu_gid;

unsignedshortu_ofile[NOFILE];//用户打开文件表

};

//下为全局变量

externstructhinodehinode[NHINO];

externstructdirdir;//当前目录(在内存中全部读入)

externstructfilesys_ofile[SYSOPENFILE];

externstructfilsysfilsys;//内存中的超级块

externstructpwdpwd[PWDNUM];

externstructuseruser[USERNUM];

externFILE*fd;//thefilesystemcolumnofallthesystem

externstructinode*cur_path_inode;

externintuser_id,file_block;

//proptypeofthesubroutionusedinthefilesystem

externstructinode*iget();

externiput();

externunsignedintballoc();

externbfree();

externstructinode*ialloc();

externifree();

externunsignedintnamei();

externunsignedintiname();

externunsignedintaccess();

extern_dir();

externmkdir();

externchdir();

externdirlt();

externunsignedshortopen();

externcreate();

externunsignedintread();

externunsignedwrite();

externintlogin();

externlogout();

externinstall();

externformat();

externclose();

externhalt();

3.主程序main()(文件名main.c)

主程序main.c用来测试文件系统的各种设计功能主要功能描述如程序设计的第4部分。

程序:

#include

#include

#include"filesys.h"

structhinodehinode[NHINO];

structdirdir;

structfilesys_ofile[SYSOPENFILE];

structfilsysfilsys;

structpwdpwd[PWDNUM];

structuseruser[USERNUM];

FILE*fd;

structinode*cur_path_inode;

intuser_id,file_block;

main()

{

unsignedshortab_fd1,ab_fd2,ab_fd3,ab_fd4;

unsignedshortbhy_fd1;

char*buf;

printf("\nDoyouwanttoformatthedisk\n");

if(getchar()=='y'){

printf("Formatwilleraseallcontextonthedisk.Areyousure?

\n");

getchar();

}

elsereturn;

if(getchar()=='y')format();

elsereturn;

install();

_dir();

login(2118,"abcd");

user_id=0;

mkdir("a2118");

chdir("a2118");

ab_fd1=create(user_id,"file0.c",01777);

file_block=BLOCKSIZ*6+5;

buf=(char*)malloc(BLOCKSIZ*6+5);

write(ab_fd1,buf,BLOCKSIZ*6+5);

close(user_id,ab_fd1);

free(buf);

mkdir("subdir");

chdir("subdir");

ab_fd2=create(user_id,"file1.c",01777);

file_block=BLOCKSIZ*4+20;

buf=(char*)malloc(BLOCKSIZ*4+20);

write(ab_fd2,buf,BLOCKSIZ*4+20);

close(user_id,ab_fd2);

free(buf);

chdir("..");

ab_fd3=create(user_id,"file2.c",01777);

file_block=BLOCKSIZ*3+255;

buf=(char*)malloc(BLOCKSIZ*3+255);

write(ab_fd3,buf,BLOCKSIZ*3+255);

close(user_id,ab_fd3);

free(buf);

_dir();

delete("ab_file0.c");

ab_fd4=creat(user_id,"file3.c",01777);

file_block=BLOCKSIZ*8+300;

buf=(char*)malloc(BLOCKSIZ*8+300);

write(ab_fd4,buf,BLOCKSIZ*8+300);

close(user_id,ab_fd4);

free(buf);

_dir();

ab_fd3=open(user_id,"file2.c",FAPPEND);

file_bloc

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1