文件系统实习报告善良的大姐姐2015.5.32目录一:总体概述...................................................................................3二:任务完成情况............................................................................3任务完成列表(Y/N)................................................................3具体Exercise的完成情况...........................................................3三:遇到的困难以及解决方法......................................................29内容四:收获及感想......................................................................30内容五:对课程的意见和建议......................................................30内容六:参考文献..........................................................................303一:总体概述Nachos系统模拟了一个简单的文件系统,其中包括磁盘,文件目录,空闲磁盘快分配表等,用于维护文件的逻辑结构与物理位置之间的映射关系。还有对文件的基本操作函数和数据结构,如创建、删除、读取、写入等。本实习希望通过修改Nachos系统的底层源代码,达到“完善文件系统”的目标。二:任务完成情况任务完成列表(Y/N)Exercise1Exercise2Exercise3Exercise4Exercise5Exercise6Exercise7ChallengeYesYesYesYesYesYesYesYes具体Exercise的完成情况Exercise1:源代码阅读任务:阅读Nachos源代码中与文件系统相关的代码,理解Nachos文件系统的工作原理。完成情况:1.Filesys.h(cc)概述:定义了一个filesystem类,包括了对文件系统的初始化函数,以及若干个对文件系统中某个文件的操作的函数。在介绍函数之前,先介绍两个以文件形式存在的重要内容:1)空闲磁盘块分配表:以文件的形式存储,头文件位于文件目录的第0项。是由bitmap类生成的。每一个bit对应于磁盘中的一个块的使用情况,0表示空闲,1表示已使用。2)文件目录:以文件的形式存储,头文件位于文件目录的第1项。是由directory类(之后会介绍)生成的。directory的项是name,sector的对子,用于文件名-磁盘块的索引。找到的是文件头部所在磁盘块。4接下来介绍函数:函数名称主要功能filesystem构造函数创建或者载入一个文件系统解释:传入一个bool型参数format,当format为true时会初始化filesystem(相当于格式化了文件系统),使用新的空闲磁盘块分配表以及新的文件目录。否则仅仅载入原来存在的空闲磁盘块分配表以及文件目录。filesystemcreate函数在文件系统中创建文件解释:参数为文件名和初始长度。1)从磁盘载入空闲磁盘块分配表文件和文件目录文件(通过bitmap和directory的fetchfrom(sector)实现)2)为新文件创建文件头部(filehdr):找到一个空闲磁盘块(通过bitmap的find函数实现,返回空闲磁盘块的sector号);将头文件信息写入目录文件(通过directory的add(name,sector)函数实现);3)将文件块的信息写入文件头部:文件被切分成若干个文件块,并在文件头部记录每个文件块位于磁盘的哪个sector(通过filehdr的allocate(bitmap,initialSize)实现)4)将更新了的空闲磁盘块分配表文件和文件目录文件写回磁盘(通过bitmap和directory的writeback(sector)实现)filesystemopen函数在文件系统中打开文件解释:参数为文件名。1)从磁盘载入文件目录文件2)在文件目录中,通过文件名,查找文件头部对应的磁盘号(通过directory的find(name)实现)3)如果存在,打开文件头部,并返回一个openfile类的指针(通过new一个openfile类实现)filesystemremove函数在文件系统中移除文件解释:参数为文件名。1)从磁盘载入空闲磁盘块分配表文件和文件目录文件2)将文件块从磁盘中移除(通过filehdr的deallocate(bitmap)函数实现)3)将文件头部从磁盘中移除(通过bitmap的clear(头部sector)实现)4)将文件从文件目录中移除(即清除文件名,文件头部sector的对子)(通过directory的remove(name)函数实现)5)将更新了的空闲磁盘块分配表文件和文件目录文件写回磁盘filesystemlist,print函数打印文件系统信息解释:打印文件系统的相关信息,包括磁盘块分配状况,文件目录情况,以及存在的文件的详细情况等。具体细节略。2.Filehdr.h(cc)5概述:定义了一个fileheader类,模拟文件头部。私有变量包括文件长度,文件占用的磁盘块个数,文件块,磁盘块对应关系数组。以及对文件块的分配,回收等函数。由于目前只支持定长文件,因此文件的信息在初始化的时候就确定了,文件头的信息在文件使用过程中不会发生改变,类似于只读。函数介绍:函数名称主要功能filehdrallocate函数为文件块分配磁盘块解释:参数为空闲磁盘块分配表指针,和文件长度。1)更新私有变量:文件长度和文件占用的磁盘块个数(通过文件长度/一个磁盘块大小)实现2)为文件块分配对应的磁盘块。(通过bitmap的find函数实现)——注意:此时磁盘块仅仅是分配了,但是并没将文件写入。filehdrdeallocate函数将分配的磁盘块回收解释:参数为空闲磁盘块分配表指针1)for循环,将文件块,磁盘块对应关系数组中,每个文件块对应的磁盘块的占用标记清除(通过bitmap的clear函数实现)filehdrfetchfrom函数从磁盘中载入一个文件头部解释:参数为要载入的磁盘块的sector号调用synchdick的readsector函数,将sector对应的磁盘块内容读入,覆盖自己(类似于构造函数)filehdrwriteback函数将当前文件头部写回磁盘解释:和fetchfrom执行相反操作。filehdrbytetosector函数读入文件中偏移为offset的位置的磁盘块解释:参数为偏移量1)计算出偏移量对应的文件块2)通过私有变量数组,找到文件块对应的磁盘块3)返回磁盘块的磁盘号filehdrfilelength函数——返回文件大小fielderprint函数打印文件头部信息3.Directory.h(cc)概述:定义了两个类,一个是directoryentry类,一个是directory类。directoryentry类是做文件名,磁盘号,以及一个标识位,标志当前entry是否被使用了(注意!这里与filehdr里的文件块,磁盘块数组不同,filehdr里是某个文件所有内容所映射的磁盘块,directoryentry中时某个文件的文件头部映射的磁盘块)。directory类模拟文件目录。私有变量包括entry数量和一个directoryentry的entry数组。目前只实现了一级目录索引,最多只支持10个文件头部的存放。6函数介绍:函数名称主要功能directory构造函数初始化私有变量(在概述中介绍了)解释:初始化entry数组,以及将数组中的每个entry的标识位设为false(未使用)directoryfetchfrom函数从文件目录文件中载入directory解释:参数为openfile。调用openfile的readat函数,将文件目录文件的内容覆盖自己(类似于构造函数)directorywriteback函数将当前文件目录写回目录文件解释:参数为openfile。调用openfile的writeat函数,将当前directory写回目录文件directoryfindindex+find函数在entry数组中查找名字对应的文件头部磁盘块解释:参数为文件名for循环比对。并返回磁盘块的磁盘号。找不到返回-1directoryadd函数将一个文件名,文件头部磁盘块的磁盘号的条目加入entry数组中解释:参数为文件名,文件头部磁盘块的磁盘号。注意修改entry的标识位。directoryremove函数和add执行相反功能。directorylist,print函数打印directory的信息4.Openfile.h(cc)概述:定义了一个Openfile类,用于对文件执行基本操作:读和写。私有变量为文件头部的指针,以及当前文件的光标位置。函数介绍:函数名称主要功能Openfile构造函数初始化私有变量解释:参数为文件头部的磁盘块号文件头部的指针通过filehdr-fetchfrom(sector)函数载入磁盘内容;设置初始光标位置为0Openfileseek函数将当前光标位置设置为传入的参数Openfileread函数读入若干个字节到一个数组里解释:参数为返回的内容数组,和需读入的字节数。1)调用readAt(buffer,字节数,当前光标位置)读入若干字节到buffer当中;2)更新光标位置;返回内容数组7Openfilewrite函数写入若干字节到磁盘中解释:参数为需写入的内容数组,和写入的字节数步骤同read函数,只是将readAt变成了writeAt.OpenfilereadAt函数从当前光标位置读入若干字节到一个数组当中解释:参数为返回数组,字节数以及当前光标位置。1)获取文件长度(通过filehdr-filelength函数实现)2)确定当前光标位置所在的文件块(通过“光标位置/一个sector的大小”向上取整实现)3)确定需读入的最后一个字节所在的文件块(通过“光标位置+读入字节/一个sector的大小”向上取整实现)4)计算一共需要访问的磁盘快个数(通过2)3)步做差实现)5)将文件块对应的磁盘块内容读入数组当中(通过私有变量文件头部的bytetosector函数,得到文件块-磁盘快的映射)将真正需要的字节从数组当中取出(由于事实上所需要的字节不一定位于块的头,可能要从某个中间位置截断)图解释:OpenfilewriteAt函数从当前光标位置开始写入若干字节解释:操作步骤基本同上。Openfilelength函数获取文件长度解释:通过私有变量文件头部的filelength函数获得。5.Bitmap.h(cc)概述:在上个lab的实验报告中已经介绍过了。在这次lab中,bitmap作为空闲磁盘块分配表,以文件的形式存放。每一个bit标志了磁盘中某个块当前的情况。此外,还可以使用bitmap的函数,达到模拟对磁盘的管理功能。如改变某个bit为0或者1,或是寻找为0的bit(即空闲的磁盘快)等。Exercise2:扩展文件属性任务:增加文件描述信息,如“类型”、“创建时间”、“上次访问时间”、“上次修改时间”、“路径”等等。尝试突破文件名长度的限制。8完成情况:考虑:对于文件描述信息,可以在fileheader中加入,也可以在directory中加入。但考虑到如果都在fileheader中加入,会使得文件系统中最大文件长度急剧缩水(因为fileheader的文件块-磁盘快的映射对数量减少),所以,文件类型