实验四 Nachos文件系统
一、概述本实验牵涉到Nachos的文件系统。在提供给你的基本文件系统中,有以下一些不足:
不支持层次目录结构,只有一个根目录,所有文件都在此目录下;
目录大小不可变,有一个目录只能含有最多文件数的限制;
文件大小是固定的,在它生成时规定;
没有文件系统的系统调用。
本实验的任务就是要解决上述问题。
二、准备请阅读课本中有关文件系统的一些内容。
在该实验中,你要在filesys和userprog两个目录下工作。必须仔细阅读filesys目录下的文件,尤其是下面文件更应特别注意:
filesys/filehdr.h,filesys/filehdr.cc:管理磁盘文件头(类似于Unix的i-node)。文件头用来定位文件存储在磁盘上的位置,它是一个固定大小的指针表,表中每个条目指向含有文件部分数据的磁盘扇区。表的大小设计成文件头刚好能装在一个磁盘扇区中,这意味着有126个扇区,每个Nachos文件最大为63K。不象真实的系统,filehdr不保留文件权限、所有权、最后修改日期等信息。在本实验中,你无需关心这些。
filesys/directory.h,filesys/directory.cc:维护文件名目录。该目录是定长条目的一张表,每个条目代表一个文件,含有文件名和文件头在磁盘上位置等信息。表中每个条目的长度固定意味着文件名有最大长度限制。另外,所提供的实现还有目录大小不能扩展的限制,也就是说,一旦目录中的所有条目都用完后,就不能再创建别的文件了。
filesys/filesys.h,filesys/filesys.cc:初始化(格式化)Nachos磁盘、创建/删除Nachos磁盘上的文件、打开/关闭Nachos磁盘上的文件等。文件系统中有两个关键的数据结构:根目录和位图。根目录列出文件系统中的所有文件,不象UNIX,该文件系统不提供层次目录结构;另外,为分配的磁盘扇区建有一位图。根目录和位图本身都以文件的形式存在Nachos文件系统中。你需要对此进行修改,以支持可扩展的Nachos文件系统。
filesys/openfile.h,filesys/openfile.cc:操作打开的Nachos文件和装入内存的文件头信息、读/写文件数据出/入内存。
userprog/bitmap.h,userprog/bitmap.cc:对位图进行操作,这在跟踪Nachos磁盘的使用时有用。
在本实验中,可以假设任何时候系统中都只有一个进程在执行,所以,无需担心不同进程对文件系统的并发访问。而且,你也不需要为诸如所有权、文件权限等之类的文件维护别的数据结构。
本实验还提供下面的命令行选项来测试Nachos文件系统:
-f:格式化物理磁盘;
-cp:从UNIX中拷贝一个文件到Nachos;
-p:打印Nachos文件到标准输出设备;
-r:从文件系统中删除一个Nachos文件;
-l:列出Nachos目录内容;
-D:打印整个文件系统的内容。
为了用上面的选项测试基本系统,请按一些步骤进行:(假设你当前处于mp4/目录中)
cd filesys
gmake depend
gmake
nachos –f
nachos –cp,./test/dump dump
nachos –cp,./test/tc1 tc1
nachos –cp,./test/tc2 tc2
nachos –l
nachos –x dump
nachos –x tc1
nachos –x tc2
nachos –r dump
nachos –r tc1
nachos –r tc2
nachos –l
三、任务问题1:文件系统的系统调用你必须实现下面的系统调用:Creat,Open,Close,Read,Write,MkNode,RmNode,Remove,Lseek。在userprog/syscall.h中,提供了上述各项的原型和简短描述。
注意,由于任何时候都只有一个进程,维护一个全局文件表就足够了,没必要为每个进程都设立一个文件表。有关文件表的详细信息,请参阅exception.h中的说明。
问题2:实现层次文件系统所提供的基本实现是一个平面文件系统,而且,目录大小是固定的。你要修改filesys目录中的文件,以实现一个目录可扩展的层次文件系统。
四、测试为了编译你的代码,请进入filesys目录,然后:
gmake depend
gmake nachos
test1:测试系统调用;
test2:测试MkNode;
test3:测试RmNode;
test4:测试层次目录结构。
请检查test*.c,看看是否得到了正确的输出。