操作系统课设--具有二级索引的文件系统

山东大学操作系统课设lab5

  • 实验五 具有二级索引的文件系统(lab5)
    • 实验目的
    • 实验环境
    • 实验思路
    • 调试记录

实验五 具有二级索引的文件系统(lab5)

实验目的

Nachos系统原有的文件系统只支持单级索引,最大能存取NumDirect * SectorSize的大小的文件。本次试验将在理解原文件系统的组织结构基础上扩展原有的文件系统,设计并实现具有二级索引的文件系统。

实验环境

虚拟机下Ubuntu Linux 16.04 LTS系统,nachos-3.4内核管理模块和MIPS CPU软件模拟模块,文件系统模块,代码在lab5文件夹下面实现。

实验思路

有参考这个:https://wenku.baidu.com/view/049223482b160b4e767fcfd6.html
其实通过lab4就可以看出,思路是沿着fstest.cc里的Append()去扩展文件系统,具体是Append()里的openFile.Write(),更底层就到了Write()调用的WriteAt()。说到底,就是这一小段代码最终确定了如何分配,如何扩展,如何索引整个文件系统的扇区。所以在lab5实验里只用关注AllocateSpace()方法就好。(不对)
操作系统课设--具有二级索引的文件系统_第1张图片
因为filesystem里Create()方法有创建文件头对象,且构造方法里也有调用到filehdr里的Allocate()等方法,所以filehdr.cc里的每个方法,只要涉及到数组保存,都要由一个数组写成两个数组,才能完成由一级索引到二级索引的转换。

操作系统课设--具有二级索引的文件系统_第2张图片
操作系统课设--具有二级索引的文件系统_第3张图片
之前lab4里的filehdr.cc里的Allocate(),文件是通过一个数组dataSectors来进行分配的。
操作系统课设--具有二级索引的文件系统_第4张图片
Filehdr.h里最初的定义部分有:
#define NumDirect ((SectorSize - 2 * sizeof(int)) / sizeof(int))
在这里插入图片描述
这是在filehdr.h里private定义dataSectors[]的大小
之前在lab4实验报告里有说,
操作系统课设--具有二级索引的文件系统_第5张图片
操作系统课设--具有二级索引的文件系统_第6张图片
所以一个sector里128个字节,sectorSize = 128,sizeof(int) = 4,则NumDirect = 30,即有存储文件消耗30个sector,30*128 = 3840,即文件可占字节为3840
想要扩展文件系统,还是从存储文件字节的数组下手。
建立一个dataSectors2数组,
定义大小
==#define NumDirect2 (SectorSize/sizeof(int)) == 大小为128/4 = 32
修改
==#define MaxFileSize ((NumDirect+NumDirect2)*SectorSize) ==

之前单级索引是用数组的最后1位作为索引号,dataSectors[0]-dataSectors[28]作为存取数据的块号;如果dataSectors[29]=-1,则表明没有没有二级索引块,如果dataSectors[29]为任意正值,则与二级索引块相应块号对应,即dataSectors2[]值。文件超过dataSectors[]可存放大小,则放到dataSector2[]中,dataSectors2[]返回的Sector号对应着dataSectors[-1]的值。
文件读取还是依照之前的方法,openFile里WriteAt()添加的AllocateSpace(),其中AllocateSpace()添加了filehdr的ExpandSpace()。只是需要修改读数组dataSectors[]的方法,在读到最后一位时,需要跳到dataSectors2里去继续读二级索引的数据内容。
关键源代码注释以及程序说明:
这是lab4里filehdr.cc里的Allocate():
操作系统课设--具有二级索引的文件系统_第7张图片
但是现在需要判断一些先需加入的扇区内容是否有超过文件大小范围。如果没超过,还是一级索引可以承受的;如果超过了,则需要用到二级索引。
如果没超过文件内容,则和lab4基本一致, 将dataSectors[-1]设置为-1;超过文件内容则使用二级索引,先将dataSectors[-1]设置为,并设置dataSectors2的大小,把其他放不下的数据块放到二级索引数组里。并把相应块号设为一级索引的值。
操作系统课设--具有二级索引的文件系统_第8张图片

Filehdr里的deallocate原来是这样:
操作系统课设--具有二级索引的文件系统_第9张图片
相应的deallocate需要修改:如果只有一级索引,则与之前无异;若有二级索引,则将dataSector[]数组内容清除,再清楚dataSectors2[]数组内容。
操作系统课设--具有二级索引的文件系统_第10张图片
Lab4的ExpandSpace()是这样的。
操作系统课设--具有二级索引的文件系统_第11张图片
相应的加上dataSectors2的修改内容。
操作系统课设--具有二级索引的文件系统_第12张图片
操作系统课设--具有二级索引的文件系统_第13张图片
ByteToSector()和Print()也相应地添加上关于dataSectors2[]的内容。

调试记录

./nachos -f
./nachos -D
./nachos -cp test/big big
./nachos -ap test/big big *5
操作系统课设--具有二级索引的文件系统_第14张图片
但是当我继续 ./nachos -ap test/big big 时就报错了。

我也许是没有真正实现二级索引,所以才会这样。
发现之前一直没有make,而且在makefile和makefile.local里面是filesys而不是lab5,因为filesys和lab5是同级文件,而且内部都有filesys.cc,所以会调用错。需要修改成lab5。
操作系统课设--具有二级索引的文件系统_第15张图片
操作系统课设--具有二级索引的文件系统_第16张图片
发现其实在lab4里面也是调用的filesys,修改之后make再执行,如下。
操作系统课设--具有二级索引的文件系统_第17张图片
Lab5修改后make再执行如下:
操作系统课设--具有二级索引的文件系统_第18张图片
修改了输出格式,想把一级索引对应的二级索引也写出来。

操作系统课设--具有二级索引的文件系统_第19张图片
做到现在,感觉对二级索引终于有了一点了解,对linux系统的debug也有了一点了解。
虽然现在最多可以扩展到68,但是还有个很诡异的事情,就是中间会报一次错,但是之后又可以继续扩展。很奇怪,待解决。
操作系统课设--具有二级索引的文件系统_第20张图片

你可能感兴趣的:(操作系统,山东大学)