操作系统课程设计报告虚拟文件系统的实现后附源代码_第1页
操作系统课程设计报告虚拟文件系统的实现后附源代码_第2页
操作系统课程设计报告虚拟文件系统的实现后附源代码_第3页
操作系统课程设计报告虚拟文件系统的实现后附源代码_第4页
操作系统课程设计报告虚拟文件系统的实现后附源代码_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

1、. . 甘肃政法学院甘肃政法学院 计算机操作系统课程设计计算机操作系统课程设计 题 目 虚拟文件系统的实现虚拟文件系统的实现 计算机科学学院 计算机科学与技术 专业 10 级 计算科学与技术本科 班 姓 名:_ _ 指导教师:_ _ 成 绩:_ _ 完成时间:_2013 年 7 月 . . 目录目录 第一章 课程设计简介1 1.1 课程设计的目的1 1.2 课程设计内容1 第二章 数据结构的设计2 2.1 预定义2 2.2 结构体2 2.3 全局变量和函数4 2.4 结构体说明5 第三章 功能模块(或算法)描述5 3.1 format 格式化5 3.2 install 安装6 3.3 logi

2、n 登陆6 3.4 ialloc 申请inode空间6 3.5 balloc 申请block空间6 3.6 create 创建文本文件7 3.7 cdir 创建文件夹7 3.8 edit 读取和追加文本文件7 3.9 access(文件名) 权限判断7 3.10 cd 进入子目录 或上级目录 8 3.11 attr(文件名)查看文件或者文件夹的属性 8 3.12 del 删除文件或目录 8 第四章 程序运行结果8 4.1 格式化 和登录界面8 4.2 ls命令-显示当前目录下的文件和目录9 4.3 logout命令-注销用户 9 第五章 心得体会9 参考文献10 附:源代码11 . . 第一章

3、第一章 课程设计简介课程设计简介 1.11.1 课程设计的目的课程设计的目的 课程设计目的使学生熟悉文件管理系统的设计方法;加深对所学各种文件 操作的了解及其操作方法的特点。通过模拟文件系统的实现,深入理解操作系 统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实 现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知 识的能力。 1.21.2 课程设计内容课程设计内容 课程设计内容设计一个简单的多用户文件系统。即: 在系统中用一个文件来模拟一个磁盘; 此系统至少有: login、create、del、ls、cd、md、rd、write、rename、att

4、r、relogin、clo se 等和部分文件属性的功能。 实现这个文件系统。 能实际演示这个文件系统。基本上是进入一个界面(此界面就是该文件系统 的界面)后,可以实现设计的操作要求。 1)设计一个 10 个用户的文件系统,每次用户可保存 10 个文件,一次运行用户 可以打开 5 个文件。 2)程序采用二级文件目录(即设置主目录 mfd)和用户文件目录(ufd) 。另外, 为打开文件设置了运行文件目录(afd) 。 3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指 针,并不进行实际的读写操作。 4)因系统样,文件目录的检索使用了简单的线性搜索。 5)文件保护简单使用了三位

5、保护码:允许读写执行、对应位为 1,对应位为 0,则表示不允许读写、执行。 6)程序中使用的主要设计结构如下:主文件目录和用户文件目录(mfd、ufd) , 打开文件目录(afd)即运行文件目录,如图 5.1 所示。 . . 第二章第二章 数据结构的设计数据结构的设计 2.12.1 预定义预定义 #define blocksiz 512/磁盘块的大样 #define datablknum 512/数据块的数目 #define blkgrupnum50/数据块组包含多少数据块 #define p_n_blocks15/inode 节点中 指向数据块的指针个数 #definegroupnumdat

6、ablknum/blkgrupnum+1 /数据块组 组数 #define dinodesiz 512/磁盘 i 结点区的大样(空间 32512) #define dinodenum 32/磁盘 i 结点区的块数 #define sysopenfile 40 #define dirnum 32/一个目录下的最多目录和文件的总和数 #define dirsiz 14/文件、目录名的长度(字节) #define upwdsiz 15/密码的长度 #define unamsiz 15/用户名的长度 #define pwdsizsizeof(struct pwd) /密码结构的长度 #define p

7、wdnum blocksiz/pwdsiz/密码数据空间的大样(pwd 为单位) #define nofile 20/一个用户最多可以打开的文件数目 #define dinodestart 4*blocksiz /i 结点区的开始地址-inodes table ,1 引导 2 超块 3block bitmap 4inode bitmap #define datastart (2+dinodenum)*blocksiz/数据区的开始地址 #definedatastartno36/数据区开始指针 #define dimode_empty00000/*可以用的空间*/ #define dimode_

8、file00001 #define dimode_dir 00002 #define dimode_passwd00004 #define grup_00/管理员组 #define grup_11 #define grup_22 #define grup_44 2.22.2 结构体结构体 /磁盘 i 结点结构, struct inode / chardi_namedirsiz; unsigned _int16 di_ino;/*磁盘 i 节点标识*/ unsigned _int16 di_number;/*关联文件数,当为 0 时表示删除 . . 文件*/ unsigned _int16 di

9、_mode; /*存取权限*/ unsigned _int16 di_uid; /*磁盘 i 节点用户 id*/ unsigned _int16 di_gid; /*磁盘 i 节点权限组 id*/ /1 管理员 组 2 用户组 unsigned _int32 di_size; /*文件大样*/ unsigned _int32 di_ctime; /* creation time */ unsigned _int32 di_mtime; /* modification time */ unsigned _int16 di_blockp_n_blocks; /* 一组 block 指针 */ ;

10、/ 目录项结构 struct direct chard_namedirsiz;/*目录名(14 字节)*/ _int16 d_ino;/*目录号*/ ; /超级快结构 struct super_block unsigned _int16 s_inodes_count; /* inodes 计数 */ unsigned _int16 s_blocks_count; /* blocks 计数 */ unsigned _int16 s_r_blocks_count; /* 保留的 blocks 计数 */ unsigned _int16 s_free_blocks_count; / 空闲的 bloc

11、ks 计数 unsigned _int16 s_free_inodes_count; /* 空闲的 inodes 计数 */ unsigned _int16 s_free_blocks_groupgroupnum;/新增 一个数组 来记录每个数据块组中的空闲数据块计数 unsigned _int16 s_first_data_block; /* 第一个数据 block */ unsigned _int16 s_log_block_size; /* block 的大样 */ unsigned _int16 s_blocks_per_group; /* 每 block group 的 block

12、数量 */ unsigned _int16 s_inodes_per_group; /* 每 block group 的 inode 数量 */ ; / 用户密码 struct pwd unsigned _int8 p_uid; unsigned _int8 p_gid; char usernameunamsiz;/*用户名 新加的*/ char passwordupwdsiz; ; / 目录结构 struct dir struct direct directdirnum; _int16 size; . . ; 2.32.3 全局变量和函数全局变量和函数 /全局变量 unsigned _int

13、8 di_bitmapdinodenum; / 硬盘 inode 节点位图 1 表示已 使用 0 表示未使用 unsigned _int8bk_bitmapdatablknum;/ 数据块 block 位图 struct super_block filsys;/超级块 struct pwd pwdpwdnum; file *fd;/文件指针 struct inode *cur_inode;/i 节点当前目录指针 struct inode *inodetemp;/i 节点指针 const char fsystemname20=linux.ext2;/模拟硬盘的文件名 struct direct

14、dir_bufblocksiz / sizeof(struct direct);/目录数 组 char cmdhead20;/cmd 的头 表示所在哪个文件夹、 int i_lock=0;/inode 位图锁 可能会多线程 int b_lock=0;/block 位图锁 struct pwd *cur_user; /*全局函数*/ extern int format();/格式化磁盘 extern int install();/启动,安装文件系统 struct inode * read_inode(int);/install 里面读取文件 dinode struct direct * read

15、_dir_data(int);/读取存储文件夹的物理块 extern void showdir();/命令 dir int enterdir(char);/进入某个文件夹 命令- cd 文件名 int fd_dirfile(char);/查找当前目录里的文件 没找到返回-1 找到返回 inode 号 int iscmd(char);/判断是否两个字符串的命令 void two_cmd(char,char);/两个字符串的命令 int creat(char);/创建文件 void changeinode();/交换指针 char * readfile(char);/读取文件 int mkdir(

16、char);/创建文件夹 void showbitmap();/显示位图 int deletefd(char);/删除文件 int editfile(char);/编辑文件 int rename(char);/重命名 void showhelp();/命令帮助 void login(); void logout(); int access();/权限判断 /*磁盘 i 节点的分配与释放(当一个新文件被建立的时候,在给该文件分配磁 . . 盘存储区之前, 应为该文件分配存放该文件说明信息的磁盘 i 节点,当从文件系统中删除某个 文件时, 应首先删除它的磁盘 i 节点项。 )*/ intiallo

17、c();/*开辟一个空闲的 i 节点,返回 i 节点*/磁盘块分配与释 放函数 intballoc(int);/申请硬盘空间 2.42.4 结构体说明结构体说明 (1)硬盘模拟文件:每个数据块 512 字节,第一个数据块空闲备用,第 2 块是超 级块,第 3 块是 inode 位图,第 4 块是 block 位图,第 5 块开始有 32 块是 inode 节点,然后是数据区 block,512 块。 (2)超级块:存放整个文件系统的基本状态,如:inode 块数,block 总块数, 空闲的 block 计数,空闲的 inode 计数,每个数据块组中的空闲块数(为 block 分组,便于读取)

18、 ,每个 block 的大样(512 字节) ,每个数据块组的 block 块数。 (3)inode 位图:用一个数组来描述每个 inode 的使用状况,1 表示被占用,0 表示空闲。 (4)block 位图:用一个数组来描述每个数据区的 block 的使用状况,1 表示被 占用,0 表示空闲。 (5)inode 节点:inode 记录了文件或者目录在数据区存放位置,是文件还是目 录,是否系统文件,属于管理员组还是普通用户组,是由谁创建的,创建时间 等。如果是目录,则还记录了里面包含多少个文件或子目录。是文件则记录了 文件的大样。读取文件要先通过 inode 然后找到 block,才能读取。

19、(6)block 数据块:存放文件的地方,如果是目录则记录了这个目录下所有的文 件和子目录的名称和所占的 inode,如果是文本文档,则是字节流文件。 第三章第三章 功能模块(或算法)描述功能模块(或算法)描述 3.13.1 formatformat 格式化格式化 只写打开模拟文件,初始化超级快,初始化 dinode 位图 block 位图,初 始化主目录,初始化 etc 目录,初始化管理员 admin 目录,初始化用户 xiao 目录,初始化 用户 passwd 文件,写入模拟硬盘文件。 . . 3.23.2 installinstall 安装安装 读写打开模拟文件,读取 dinode 位图

20、 block 位图,读取主目录,读取 etc 目录,读取管理员 admin 目录,读取用户 xiao 目录,读取 用户 passwd 文件。 3.33.3 loginlogin 登陆登陆 用户输入用户名和密码,在 passwd 文件中查找是否有此用户,核对密码。 正确则登陆成功,当前目录设定到当前用户文件夹下。登录流程图 3.2。 3.43.4 iallocialloc 申请申请 inodeinode 空间空间 先检测 inode 位图是否加锁,是则退出。加锁,检测 inode 空间是否还有 已满,是则退出。在 inode 位图中顺序查找空闲的 inode,找到则返回 inode 地址,blo

21、ck 解锁。函数结束。流程图 3.3。 login 登录 结束 是,登录成功 输入用户名 查找是否有改 用户名 输入密码 是 否 密码是否正确 否 ialloc 申请inode空间 inode位图是否加锁 否,加锁 inode空间是否已满 否 在ionde位图顺序查 找空闲的inode 找到返回inode地址 inode位图解锁 结束 申请失败 是 找不到 balloc(int k) 申请k个block空间 block位图是否加锁 否,加锁 是否有k个空闲的 block 是 在block位图按照分 组查找空闲的block 找到返回block地址 block位图解锁 结束 申请失败 否 找不到

22、登录流程图 3.2 ialloc 流程图 3.3balloc 流程图 3.4 3.53.5 ballocballoc 申请申请 blockblock 空间空间 先检测 block 位图是否加锁,是则退出。加锁,检测 block 空间是否还有 k 个空闲,否则退出。在还有空闲 block 的组中查找是否有 k 个空闲,没有则 . . 去下一个 block 组中查找,找到则返回 block 地址,block 解锁。函数结束。 流程图 3.4。 3.63.6 createcreate 创建文本文件创建文本文件 查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内 容,以#结束。申请 in

23、ode 空间(ialloc 函数),申请硬盘 block 空间 (balloc 函数) ,申请失败则结束。将文件内容写入 inode 空间和 block 空间。 修改当前目录的结构,修改超级快,修改 inode 位图,block 位图,写入模拟硬 盘。如图 4 所示: 图 4 create 创建文本文件 3.73.7 cdircdir 创建文件夹创建文件夹 查找当前目录下是否有同名文件,是则退出,否则,申请 inode 空间 (ialloc 函数),申请硬盘 block 空间(balloc 函数) ,申请失败则结束。将文 件夹内容写入 inode 空间和 block 空间。修改当前目录的结构,

24、修改超级快, 修改 inode 位图,block 位图,写入模拟硬盘。 rootetcyangfxb#cdir caobinhui 1 已经找到空闲的 block 7 它在第 0 组 当前目录文件数 3 3.83.8 editedit 读取和追加文本文件读取和追加文本文件 edit-调用读取文件模块,读取成功则用户输入追加的内容,如果追加 的内容大于一个 block 则申请 block 空间,失败则退出,申请成功则保存文件。 3.93.9 accessaccess(文件名)(文件名) 权限判断权限判断 先判断当前目录是否有该文件,在当前目录的 block 找到该文件,判断当 . . 前登录用户

25、是哪个组,判断是否该用户创建,判断该文件的可见级别。 如果是该用户创建的 则有读写权限如果当前用户是管理员组的 也具有读写权 限如果该文件是用户可查看文件则都具有权限。 3.103.10 cdcd 进入子目录进入子目录 或上级目录或上级目录 查找当前目录是否有该子目录,没有则退出,调用 access()判断当前用 户是否有权限,无则退出,有则读取该子目录的 inode,将当前目录指向该目 录。 rootetcyang#cd fxb rootetcyangfxb# 3.113.11 attrattr(文件名)查看文件或者文件夹的属性(文件名)查看文件或者文件夹的属性 先查找当前目录下是否有该文件

26、或目录,有则判断文件是否系统文件,是 否文本文件,是否目录,由谁创建,属于什么组,占用的 block,和 inode。将 其全部显示出来。 3.123.12 deldel 删除文件或目录删除文件或目录 查找当前目录是否有该文件名,没有则退出,有则调用 access()判断是 否有权限,有则判断是否为系统文件,是则无法删除,不是则判断是否是文件, 是文件则直接删除,不是则判断是否文件夹,是文件夹则判断该文件夹下是否 有文件,有文件则无法删除。提示用户是否删除,确认则删除文件,修改当前 文件夹 inode,block 结构,修改该文件占有的 inode 和 block 位图为 0,修改 超级块,写

27、入模拟硬盘。 rootetcyangfxb#del caobinhui 是否真的要删除 caobinhui ?y 0 7 rootetcyangfxb#cd caobinhui 未找到该文件!请输入正确的文件或目录名 进入目录失败! rootetcyangfxb# . . 第四章第四章 程序运行结果程序运行结果 4.14.1 格式化格式化 和登录界面和登录界面 登录后显示帮助信息 ,进入到用户文件夹下,如图 5 所示: 图 5 格式化及登录界面 4.24.2 lsls 命令命令-显示当前目录下的文件和目录显示当前目录下的文件和目录 rootetcyangfxb#ls . inode 6 . i

28、node 4 rootetcyangfxb# 4.34.3 logoutlogout 命令命令-注销用户注销用户 rootetc#logout 用户名: 普通用户无法进入 admin 管理员目录。 . . 第五章第五章 心得体会心得体会 操作系统课程设计是本课程重要的实践教学环节。课程设计的目的,一方 面使学生更透彻地理解操作系统的基本概念和原理,使之由抽象到具体;另一 方面,通过课程设计加强学生的实验手段与实践技能,培养学生独立分析问题、 解决问题、应用知识的能力和创新精神。与本课程的实验教学相比,课程设计 独立设课,具有更多的学时,给学生更多自行设计、自主实验的机会,充分放 手让学生真正培

29、养学生的实践动手能力,全面提高学生的综合素质。 在设计的过程中遇到问题,可以说得是困难重重,遇到了过各种各样的问 题,同时在设计的过程中发现了我们的不足之处,对以前所学过的知识理解得 不够深刻,掌握得不够牢固,不过在老师和同学们的帮助下设计终于顺利完成 了,对给过我们帮助的所有同学和各位指导老师再次表示忠心的感谢! 参考文献参考文献 1 袁庆龙,候文义ni-p 合金镀层组织形貌及显微硬度研究 太原理工大学学报,2001,32(1): 51-53.(连续出版物:序号 主要责任者文献题名j 刊名,出版年份,卷号(期号):起止页码) 2 刘国钧,王连成图书馆史研究 北京:高等教育出版社,1979:1

30、5-18,31 (专著:序号 主要责任者文献题名 出版地:出版者,出版年:起止页码 ) 3 孙品一高校学报编辑工作现代化特征 中国高等学校自然科学学报研究会科技编辑学论文 集(2)北京:北京师范大学出版社,1998:10-22 (论文集:序号 主要责任者文献题名主 编论文集名出版地:出版者,出版年:起止页码 ) . . 附:源代码附:源代码 #include #include #include #include #include #include #define blocksiz 512/磁盘块的大样 #define datablknum 512/数据块的数目 #define blkgrupn

31、um50/数据块组包含多少数据块 #define p_n_blocks 15/inode 节点中 指向数据块的指针个数 #definegroupnum datablknum/blkgrupnum+1 /数据块组 组数 #define dinodesiz 512/磁盘 i 结点区的大样(空间 32512) #define dinodenum 32/磁盘 i 结点区的块数 #define sysopenfile 40 #define dirnum 32/一个目录下的最多目录和文件的总和数 #define dirsiz 14/文件、目录名的长度(字节) #define upwdsiz 15/秘密的长

32、度 #define unamsiz 15/用户名的长度 #define pwdsizsizeof(struct pwd) /密码结构的长度 #define pwdnum blocksiz/pwdsiz/密码数据空间的大样(pwd 为单位) #define nofile 20/一个用户最多可以打开的文件数目 #define nhino 128 #define usernum 10/用户名的长度 #define dinodestart 4*blocksiz/i 结点区的开始地址-inodes table ,1 引导 2 超 块 3block bitmap 4inode bitmap #define

33、 datastart (2+dinodenum)*blocksiz/数据区的开始地址 #definedatastartno 36/数据区开始指针 /* di._mode */ #define dimode_empty00000/*可以用的空间*/ #define dimode_file00001 #define dimode_dir 00002 #define dimode_passwd 00004 #define dimode_system 00040/*系统文件*/ #define dimode_read 00010 /* read 和该数与操作后得到的是可以读该文件的 用户组*/ #de

34、fine dimode_write 00020 /* write */ #define dimode_exicute 01000 /* exicute */ #define dimode_admin00100/*管理员权限*/ #define dimode_share00200/*不需要权限*/ /*组*/ #define grup_00/管理员组 . . #define grup_11 #define grup_22 #define grup_44 /* 文件系统 数据结构 */ /* 磁盘 i 结点结构, */ struct inode / chardi_namedirsiz; unsig

35、ned _int16 di_ino;/*磁盘 i 节点标识*/ unsigned _int16 di_number;/*关联文件数,当为 0 时表示删除文件*/ unsigned _int16 di_mode;/*存取权限*/ unsigned _int16 di_uid; /*磁盘 i 节点用户 id*/ unsigned _int16 di_gid; /*磁盘 i 节点权限组 id*/ /1 管理员组 2 用户组 unsigned _int32 di_size; /*文件大样*/ unsigned _int32 di_ctime; /* creation time */ unsigned

36、_int32 di_mtime; /* modification time */ unsigned _int16 di_blockp_n_blocks; /* 一组 block 指针 */ ; /* 目录项结构 */ struct direct char d_namedirsiz; /*目录名(14 字节)*/ _int16 d_ino;/*目录号*/ ; /* 超级快结构 */ struct super_block unsigned _int16 s_inodes_count; /* inodes 计数 */ unsigned _int16 s_blocks_count; /* blocks

37、 计数 */ unsigned _int16 s_r_blocks_count; /* 保留的 blocks 计数 */ unsigned _int16 s_free_blocks_count; / 空闲的 blocks 计数 unsigned _int16 s_free_inodes_count; /* 空闲的 inodes 计数 */ unsigned _int16 s_free_blocks_groupgroupnum;/新增 一个数组来记录每个数 据块组中的空闲数据块计数 unsigned _int16 s_first_data_block; /* 第一个数据 block */ uns

38、igned _int16 s_log_block_size; /* block 的大样 */ unsigned _int16 s_blocks_per_group; /* 每 block group 的 block 数量 */ unsigned _int16 s_inodes_per_group; /* 每 block group 的 inode 数量 */ ; /* . . 用户密码 */ struct pwd unsigned _int8 p_uid; unsigned _int8 p_gid; char usernameunamsiz;/*用户名 新加的*/ char passwordu

39、pwdsiz; ; /* 目录结构 */ struct dir struct direct directdirnum; _int16 size; ; /全局变量 unsigned _int8 di_bitmapdinodenum;/ 硬盘 inode 节点位图 1 表示已使用 0 表示未 使用 unsigned _int8bk_bitmapdatablknum;/ 数据块 block 位图 struct super_block filsys;/超级块 struct pwd pwdpwdnum; /struct user userusernum; /int usernum; file *fd;/

40、文件指针 struct inode *cur_inode;/i 节点当前目录指针 /struct dinode *dinodef;/全局硬盘节点指针 struct inode *inodetemp;/i 节点指针 /struct inode *inodetemp2; const char fsystemname20=linux.ext2; /模拟硬盘的文件名 struct direct dir_bufblocksiz / sizeof(struct direct);/目录数组 char cmdhead20;/cmd 的头 表示所在哪个文件夹、 int i_lock=0;/inode 位图锁 可

41、能会多线程 int b_lock=0;/block 位图锁 struct pwd *cur_user; /*全局函数*/ extern int format();/格式化磁盘 extern int install();/启动,安装文件系统 struct inode * read_inode(int);/install 里面读取文件 dinode struct direct * read_dir_data(int);/读取存储文件夹的物理块 extern void showdir();/命令 dir int enterdir(char);/进入某个文件夹 命令- cd 文件名 int fd_di

42、rfile(char);/查找当前目录里的文件 没找到返回-1 找到返回 inode 号 . . int iscmd(char);/判断是否两个字符串的命令 void cmd_up(char,char);/两个字符串的命令 int creat(char);/创建文件 void changeinode();/交换指针 char * readfile(char);/读取文件 int cdir(char);/创建文件夹 void showbitmap();/显示位图 int deletefd(char);/删除文件 int editfile(char);/编辑文件 int rename(char);

43、/重命名 void showhelp();/命令帮助 void login(); void logout(); int access();/权限判断 /*磁盘 i 节点的分配与释放(当一个新文件被建立的时候,在给该文件分配磁盘存储区之 前, 应为该文件分配存放该文件说明信息的磁盘 i 节点,当从文件系统中删除某个文件时, 应首先删除它的磁盘 i 节点项。 )*/ intialloc();/*开辟一个空闲的 i 节点,返回 i 节点*/ /磁盘块分配与释放函数 intballoc(int);/申请硬盘空间 void showaccess(char strname20); /内存 i 节点的获取与

44、释放 /extern struct inode *iget(unsigned int);/*获取 hino 位置的 i 节点,返回 i 节点指针*/ /extern void iput(struct inode* );/*将 i 节点 释放或是写入磁盘*/ /#endif void main() char str10; char strname10; char c; printf(是否格式化?); scanf(%c, fflush(stdin); if(c=y) if(!format() return; printf(格式化完毕!n); if(!install() . . return; pr

45、intf(login.n); login(); showhelp(); printf(%s,cmdhead); while(1) scanf(%s, if(strcmp(str,exit)=0) fclose(fd); return; else if(strcmp(str,dir)=0) showdir(); else if(strcmp(str,bit)=0) showbitmap(); else if(strcmp(str,help)=0) showhelp(); else if(strcmp(str,logout)=0) logout(); else if(iscmd(str) scan

46、f(%s, cmd_up(str,strname); else printf(错误命令!n); printf(%s,cmdhead); /-格式化- int format() . . struct pwd passwd blocksiz/pwdsiz; int i; /*creat the file system file */ fd = fopen (fsystemname, wb);/*读写创建一个二进制文件*/ if(fd=null) printf(硬盘模拟文件创建失败!n); return 0; /超级块 filsys.s_inodes_count=dinodenum ; /* ino

47、des 计数 */ filsys.s_blocks_count=datablknum; /* blocks 计数 */ filsys. s_r_blocks_count=0; /* 保留的 blocks 计数 */ filsys. s_free_blocks_count=datablknum-5; /* 空闲的 blocks 计数 */ filsys.s_free_blocks_group0=50-5;/第一个 block group 已经被用了 5 个 for(i=1;igroupnum-1;i+) filsys.s_free_blocks_groupi=50; /后面的 group 全部空

48、闲 /printf(block group %d 空闲个数为%dn,i,filsys.s_free_blocks_groupi); filsys.s_free_blocks_groupgroupnum-1=12;/最后一个 block 组 只有 12 个 block filsys.s_free_inodes_count=dinodenum-5; /* 空闲的 inodes 计数 */ filsys.s_first_data_block=datastartno; /* 第一个数据 block 也就是*/ filsys.s_log_block_size=blocksiz; /* block 的大样

49、 */ filsys.s_blocks_per_group=blkgrupnum; /* 每 block group 的 block 数量 */ filsys.s_inodes_per_group=0; /每 block group 的 inode 数量 暂未使用 fseek(fd, blocksiz, seek_set); fwrite ( /初始化 dinode 位图 block 位图 di_bitmap0=1; di_bitmap1=1; di_bitmap2=1;/前三个 inode 分别被 root etc 用户 passwd 文件占用 di_bitmap3=1; di_bitmap

50、4=1; bk_bitmap0=1; bk_bitmap1=1; bk_bitmap2=1;/前三个 inode 分别被 root etc 用户 passwd 文件占用 bk_bitmap3=1; bk_bitmap4=1; for(i=5;idinodenum;i+) di_bitmapi=0; bk_bitmapi=0; . . for(;idi_name,/); ininode-di_ino=0;/i 节点标志 ininode-di_number=3;/关联 3 个文件夹 ininode-di_mode=dimode_dir|dimode_system;/0 为目录 ininode-di

51、_uid=1;/用户 id 第一个用户 ininode-di_gid=1;/组 id 管理员组 ininode-di_size=0;/为目录 ininode-di_ctime=0; /* creation time */ ininode-di_mtime=0; /* modification time */ ininode-di_block0=0;/所占物理块号 后 3 块分别是 一级指针,二级指针,3 级指针 fseek(fd,dinodestart, seek_set); fwrite(ininode,sizeof(struct inode), 1, fd); strcpy(dir_buf

52、0.d_name, .); dir_buf0.d_ino= 0;/当前目录的 dinode 号 strcpy(dir_buf1.d_name,.); dir_buf1.d_ino= 0;/主目录的上级目录还是自己 strcpy(dir_buf2.d_name, etc); dir_buf2.d_ino = 1;/etc 目录 fseek(fd, datastart, seek_set); fwrite(dir_buf, blocksiz, 1, fd); /etc 目录 ininode-di_ino=1;/i 节点标志 ininode-di_number=5;/ ininode-di_gid=

53、1;/组 id ininode-di_block0=1;/所占物理块号 后 3 块分别是 一级指针,二级指针,3 级指针 fseek(fd, dinodestart+blocksiz, seek_set); fwrite(ininode,sizeof(struct inode), 1, fd); . . strcpy (dir_buf0.d_name, .); dir_buf0.d_ino = 1; strcpy(dir_buf1.d_name, .); dir_buf1.d_ino = 0; strcpy(dir_buf2.d_name, passwd); dir_buf2.d_ino =

54、2; strcpy(dir_buf3.d_name, admin); dir_buf3.d_ino = 3; strcpy(dir_buf4.d_name, xiao); dir_buf4.d_ino = 4; fseek(fd, datastart+blocksiz, seek_set); fwrite (dir_buf, blocksiz,1,fd); / admin 目录 ininode-di_ino=3;/i 节点标志 ininode-di_number=2;/ ininode-di_gid=0;/组 id ininode-di_block0=3;/所占物理块号 后 3 块分别是 一级

55、指针,二级指针,3 级指针 fseek(fd, dinodestart+blocksiz*3, seek_set); fwrite(ininode,sizeof(struct inode), 1, fd); strcpy (dir_buf0.d_name, .); dir_buf0.d_ino = 3; strcpy(dir_buf1.d_name, .); dir_buf1.d_ino = 1; fseek(fd, datastart+blocksiz*3, seek_set); fwrite (dir_buf, blocksiz,1,fd); / xiao 目录 ininode-di_in

56、o=4;/i 节点标志 ininode-di_number=2;/ ininode-di_uid=2;/用户 id ininode-di_gid=1;/组 id ininode-di_block0=4;/所占物理块号 后 3 块分别是 一级指针,二级指针,3 级指针 fseek(fd, dinodestart+blocksiz*4, seek_set); fwrite(ininode,sizeof(struct inode), 1, fd); strcpy (dir_buf0.d_name, .); dir_buf0.d_ino =4; strcpy(dir_buf1.d_name, .);

57、dir_buf1.d_ino = 1; fseek(fd, datastart+blocksiz*4, seek_set); fwrite (dir_buf, blocksiz,1,fd); /用户 passwd 文件 passwd0.p_uid= 1; passwd0.p_gid = grup_0; /管理员 strcpy(passwd0.username, admin); strcpy(passwd0.password, admin); . . passwd1.p_uid= 2; passwd1.p_gid = grup_1; strcpy(passwd1.username, xiao);

58、 strcpy(passwd1.password, xiao); for (i=2; idi_ino=2;/i 节点标志 ininode-di_number=2;/ ininode-di_mode=dimode_passwd|dimode_system;/ ininode-di_uid=1;/用户 id 第一个用户 ininode-di_gid=1;/组 id 管理员组 ininode-di_size=blocksiz;/大样 ininode-di_ctime=0; /* creation time */ ininode-di_mtime=0; /* modification time */

59、ininode-di_block0=2;/所占物理块号 后 3 块分别是 一级指针,二级指针,3 级指针 fseek(fd, dinodestart+blocksiz*2, seek_set); fwrite(ininode,sizeof(struct inode), 1, fd); fclose(fd); free(ininode); return 1; intinstall() /struct pwd passwd blocksiz/pwdsiz;/用户 passwd 数组 int i; /struct inode *inode_temp; printf(install.n); fd =

60、fopen (fsystemname, rb+);/ 只读方式打开硬盘模拟文件 if(fd=null) printf(文件打开失败n); return 0; fseek(fd,blocksiz,seek_set); fread( inodetemp=(struct inode *)malloc(sizeof (struct inode); if(!inodetemp) . . printf(inodetemp 内存分配失败!n); return 0; cur_inode=(struct inode *)malloc(sizeof (struct inode); if(!cur_inode) p

温馨提示

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

评论

0/150

提交评论