汤园园课程的设计Word文档格式.docx
《汤园园课程的设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《汤园园课程的设计Word文档格式.docx(48页珍藏版)》请在冰豆网上搜索。
为LINUX设计一个简单的二级文件系统。
要求做到以下几点:
1、可以实现下列几条命令(至少4条)。
Login 用户登录
Dir 列文件目录
Create 创建文件
Delete 删除文件
Open 打开文件
Close 关闭文件
Read 读文件
Write 写文件
2、列目录时要列出文件名、物理地址、保护码和文件长度。
3、源文件可以进行读写保护。
(2)设计原理和系统总体功能框架图
设计原理:
首先本文件系统采用两级目录,其中第一级对应于用户账户,第二级对应于用户账户下的文件。
另外,为了简单本文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。
另外该文件系统依据以下数据结构及主要函数而设计的。
【1】主要的一些数据结构
1)i节点
structinode
{structinode*i_forw;
structinode*i_back;
chari_flag;
unsignedinti_ino;
/*磁盘i节点标号*/
unsignedinti_count;
/*引用计数*/
unsigned short di_number;
/*关联文件数,当为0时,则删除该文件*/
unsigned short di_mode;
/*存取权限*/
unsigned short di_uid;
/*磁盘i节点用户id*/
unsigned short di_gid;
/*磁盘i节点组id*/unsigned int di_addr[NADDR];
/*物理块号*/
2)磁盘i节点
structdinode
{ unsigned short di_number;
/*关联文件数*/unsigned short di_mode;
/*存取权限*/
unsigned short di_uidunsigned short di_gid;
unsigned long di_size;
/*文件大小*/unsigned int di_addr[NADDR];
/*物理块号*/
}
3)目录项结构structdirect
{ char d_name[DIRSIZ];
/*目录名*/unsigned int d_ino;
/*目录号*/
4)超级块structfilsys
{ unsignedshort s_isize;
/*i节点块块数*/unsignedlong s_fsize;
/*数据块块数*/
unsignedint s_nfree;
/*空闲块块数*/
unsignedshort s_pfree;
/*空闲块指针*/unsignedint s_free[NICFREE];
/*空闲块堆栈*/unsignedint s_ninode;
/*空闲i节点数*/
unsignedshort s_pinode;
/*空闲i节点指针*/unsignedint s_inode[NICINOD];
/*空闲i节点数组*/unsignedint s_rinode;
/*铭记i节点*/
char s_fmod;
/*超级块修改标记*/
5)用户密码struct pwd
{ unsigned short p_uid;
unsigned short p_gid;
charpassword[PWOSIZ];
};
6)目录structdir
{ struct direct direct[DIRNUM];
intsize;
7)查找内存i节点的hash表
structhinode
{ struct inode *i_forw;
8)系统打开表structfile
{ char f_flag;
/*文件操作标志*/unsigned int f_count;
struct inode *f_inode;
/*指向内存i节点*/
unsigned long f_off;
/*读/写指针*/
9)用户打开表structuser
{ unsignedshortu_default_mode;
unsignedshortu_uid;
/*用户标志*/
unsignedshortu_gid;
/*用户组标志*/unsignedshortu_ofile[NOFILE];
/*用户打开表*/
【2】主要的一些函数
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()
login
选择操作
Dir
Chdir
Mkdir
Creat
Write
Close
Delete
logout
halt
结束
(3)详细设计及少数重要编码的说明
【1】头文件filesys.h的设计:
它包括文件系统中的数据结构,常量,全局变量等申明。
例如:
1)i节点
unsigned int i_ino;
unsigned int i_count;
2)常量的设置:
#defineBLOCKSIZ512
#defineSYSOPENFILE40
#defineDIRNUM128
#defineDIRSIZ14
#definePWDSIZ12
#definePWDNUM32
#defineNOFILE20
#defineNADDR10
#defineNHINO128 /*mustbepowerof2*/#defineUSERNUM10
#defineDINODESIZ32
【2】主函数模块(main.c):
其中重要部分代码:
printf("
begin:
\n"
);
\nDoyouwanttoformatthedisk?
if(getchar()=='
y'
)
\nFormatwillerasecontextonthedisk\nAreyousure?
getchar();
if((c=getchar())=='
{
formatstarts\n"
format();
iHave_formated=1;
printf("
formatended\n"
else
receivedchar:
%cfromstdin\n"
c);
step1ended\n"
install();
step2ended\n"
_dir();
step3ended\n"
login(2118,"
abcd"
user_id=0;
step4ended\n"
mkdir("
a2118"
_dir();
step5-1ended\n"
chdir("
step5-2ended\n"
ab_fd1=creat(2118,"
ab_file0.c"
01777);
step6ended\n"
buf=(char*)malloc(BLOCKSIZ*6+5);
step7ended\n"
write(2118,ab_fd1,buf,BLOCKSIZ*6+5);
step8ended\n"
close(2118,ab_fd1);
【3】初始化磁盘格式模块(format.c):
其中的一下重要的算法:
/*给main()中的密码表pwd[PWDNUM]填入内容*/pwd[0].p_uid=2116;
pwd[0].p_gid=03;
strcpy(pwd[0].password,"
dddd"
pwd[1].p_uid=2117;
pwd[1].p_gid=03;
strcpy(pwd[1].password,"
bbbb"
pwd[2].p_uid=2118;
pwd[2].p_gid=04;
strcpy(pwd[2].password,"
pwd[3].p_uid=2119;
pwd[3].p_gid=04;
strcpy(pwd[3].password,"
cccc"
pwd[4].p_uid=2220;
pwd[4].p_gid=05;
strcpy(pwd[4].password,"
eeee"
开始
Buf是为null?
否
初始化用户登录
创建主目录和副目录
初始化超级块
该模块的流程图:
是