文件系统课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

设计时间: 2011-1-5至2011-1-7

专业年级:08计科4班:

一.设计目的:

通过操作系统其中一个子系统的设计和实现,掌握Linux文件系统的基本原理、结构和实现方法,掌握Linux文件系统中文件的建立、打开、读/写、执行、属性等系统调用的使用,学会设计简单的文件系统并实现一组操作,以及学习文件系统的系统调用命令,提高对文件系统实现功能的理解和掌握。同时,掌握操作系统设计的方法与技巧,增强系统软件设计的实际工作能力。

二.设计容:

为LINUX 设计一个简单的二级文件系统。本文件系统采用类似DOS系统的文件管理方式,每次调用该文件系统时,首先申请一定的存空间,然后对该存空间进行分配。将申请到的空间划分为目录区,文件区;采用位示图进行空间管理,盘块的分配使用显示(FAT 表)的方式。每次调用该文件系统时自动为其分配空间,并将上次操作的结果从硬盘上调入存;当结束调用时则将操作的结果重新存入硬盘,以便下次调用。(每次使用都会自动搜索文件系统,以此确定是否是第一次使用;若是则格式化生成文件系统,否则读取已存在的文件系统。)

三.设计过程

1、实现功能

该系统具备下列功能:

login 用户登录logout 注销

mkdir/md 创建目录rmdir/rd 删除目录

cd/cd .. 修改目录creat 创建文件

open 打开文件dir 显示当前目录和文件

write 读文件 delete 删除文件

close 关闭文件

2、添加功能

(1)制作了一个“操作命令符”列表框,说明接下来如何操作,这样有利于更好地阅读、操作和运行程序,使不懂得程序代码的人也可以运行该程序,更好地理解该程序实现的功能。

(2)在命令解释层函数cmdexp()里加了一些选择和操作功能,增加程序实现的功能,如原来程序只有显示当前目录和文件、创建目录和修改目录的功能,把它拓展到系统所要求的全部功能,并在原有的程序的基础上进行相应的修改,使程序更加完善。

3、设计思路

(1)要将文件存储在磁盘上,必须为之分配相应的存储空间,并对文件存储空间进行管

必须互斥地访问它,故在进入ialloc后,要先检查它是否已上锁,若是则睡眠等待;

检查i结点栈空否。若i结点栈中已无空闲结点编号,则应从盘中再调入一批i结点号进栈。若盘中已无空闲i结点,则出错处理,返回;从空闲i结点编号栈中分配一i结点,并对它初始化、填写有关文件的属性;分配存i结点;将磁盘i结点总数-1,置超级块修改标志,返回。

回收过程ifree:当删除文件时,应回收其所占用的盘块及相应的磁盘i结点。具体有:检查超级块上锁否。若是,直接返回,即不把本次回收的i结点号记入空闲i结点编号栈中;检查i结点编号栈满否。若已满,无法再装入新回收的i结点号,立即返回,若未满,便将回收的i结点编号进栈,并使当前空闲结点数+1;置超级块修改标志,返回。

⑤存索引结点的分配与回收

分配过程iget:虽然iget用在打开文件时为之分配i结点,但由于允许文件被共享,因此,如果一文件已被其他用户打开并有了存i结点,则此时只需将i结点中的引用计数+1。如果文件尚未被任何用户(进程)打开,则由iget过程为该文件分配一存i结点,并调用bread过程将其磁盘i结点的容拷贝到存i结点中并进行初始化。

回收过程iput:进程要关闭某文件时,须调用iput过程,先对该文件存i结点中的引用计数-1。若结果为0,便回收该存i结点,再对该文件的磁盘i结点中的连接计数减1,若其结果也为0,便删除此文件,并回收分配给该文件的盘块和磁盘i结点。

(3)主要文件操作的处理过程

①打开文件open:检索目录,核调用namei从根目录或从当前目录,沿目录树查找指定的索引结点。若未找到或该文件不允许存取,则出错处理返回NULL,否则转入下一步;分配存索引结点,如果该文件已被其它用户打开,只需对上一步中所找到的i结点引用计数+1,否则应为被打开文件分配一存i结点,并调用磁盘读过程将磁盘i结点的容拷贝到存i结点中,并设置i.count=1;分配文件表项,为已打开的文件分配一文件表项,使表项中的f.inode 指向存索引结点;分配用户文件描述表项。

②创建文件creat:核心调用namei,从根目录或当前目录开始,逐级向下查找指定的索引结点。此时有以下二种情况:重写文件,namei找到了指定i结点,调用free释放原有文件的磁盘块。此时核忽略用户指定的许可权方式和所有者,而保持原有文件的存取权限方式和文件主。最后打开。新建,namei未找到。调用ialloc,为新创建的文件分配一磁盘索引结点,并将新文件名及所分配到的i结点编号,写入其父目录中,建立一新目录项。利用与open相同的方式,把新文件打开。

③关闭文件close:根据用户文件描述符fd,从相应的用户文件描述符表项中,获得指向文件表项的指针fp,再对该文件表项中的f.count-1。

4、算法和流程图

(1)部分主要的算法:

①主函数:

#include

#include "filsys.h"

struct hinode hinode[NHINO]; /* 查找存i节点的hash表 */

struct filsys filsys; /* 超级块数据结构 */

struct inode * cur_path_inode; /* 文件系统(存i节点)数据结构 */

struct user user[USERNUM]; /* 用户打开表数据结构 */

struct file sys_ofile[SYSOPENFILE]; /* 系统打开表数据结构 */

struct direct cur_direct[NOFILE]; /* 目录数据结构路径 */

相关文档
最新文档