nachos 扩展文件长度

来源:互联网 发布:山东直销软件开发 编辑:程序博客网 时间:2024/05/22 08:14

前段时间又忙着投各种简历,面试,结果纷纷悲剧。只能当时锻炼胆量和总结经验了,结果也发现了自己很多不足,决定闭关一阵子好好巩固巩固再说。

Lab2 实在是没怎么认真做,基本都是参考上一些学长学姐做过的东西。也留下了很多BUG没有解决,所以也不敢放上来都。

Lab3 过几天又要交了,这今天又有的忙活了,这两天会写一些实验中的过程方出来,仅供参考,当然我也都是参考别人的做的。

攒人品,求过~


1. 首先,为FileHeader添加属性,一级索引和二级索引,同时减小NumDirect的大小

    int inDirectSector1;         // 一级索引

    int inDirectSector2;        // 二级索引

2. 修改FileHeader::Allocate(BitMap *freeMap, int fileSize)方法。

在这里只做了一级索引的方法,二级索引的方法类似。

bool FileHeader::Allocate(BitMap *freeMap, int fileSize){          numBytes = fileSize;        //文件大小    numSectors  = divRoundUp(fileSize, SectorSize);   //根据文件大小计算所需块数   if(NumDirect >= numSectors)     //如果直接索引的数据块足够   {         if (freeMap->NumClear() < numSectors)       //如果位图中空间块不足return FALSE;     // not enough space    for (int i = 0; i < numSectors; i++)      //找到一个空间块并分配dataSectors[i] = freeMap->Find();   }   else     //如果直接索引的数据块不够      {    if(freeMap->NumClear() < numSectors +1) return FALSE; //多一块用来存索引    for (int i = 0; i< NumDirect; i++)dataSectors[i] = freeMap->Find();     inDirectSector1 = freeMap->Find();    //分配一块用来存索引     int index[numSectors-NumDirect];     for (int i = 0; i< numSectors - NumDirect;i++)     {index[i] = freeMap->Find();     }    synchDisk->WriteSector(inDirectSector1,(char *)index);      }    return TRUE;}


3. 修改ByteToSector 方法。

int FileHeader::ByteToSector(int offset){    int sector = offset / SectorSize;    if( sector < NumDirect)  //如果只用到了直接索引    return (dataSectors[sector]);    else    {      //如果还用到了一级索引sector -=NumDirect;int index[numSectors - NumDirect];synchDisk->ReadSector(inDirectSector1,(char *)index);return (index[sector]);    }}

4. 删除文件时也需要判断,如果用到了一级索引,还需要将一级索引中的块号释放掉。

5. 修改Print方法。当文件用到了一级索引时,需要先读取存储间接索引的块内容,然后打开一级索中用到的块,读取块内容。

实验结果如下,可以看到直接索引指向的块号为7-31一级索引所保存的块号为33-55