您好,欢迎访问三七文档
合肥工业大学计算机与信息学院实验报告课程:操作系统专业班级:计算机科学与技术班学号:姓名:一、实验目的:1、通过查看FAT12文件系统的扫描数据,并调试扫描的过程,理解FAT12文件系统管理软盘的方式。2、通过改进FAT12文件系统的扫描功能,加深对FAT12文件系统的理解。二、实验内容:1、阅读控制台命令“sd”相关的源代码,并查看其执行的结果:2、根据BPB中的信息计算出其他信息:通过BPB中保存的信息重新计算出下列信息,并打印输出:(1)计算并打印输出根目录的起始扇区号,即pVcb-FirstRootDirSector的值。(2)计算并打印输出根目录的大小,即pVcb-RootDirSize的值。(3)计算并打印输出数据区的起始扇区号,即pVcb-FirstDataSector的值。(4)计算并打印输出数据区中簇的数量,即pVcb-NumberOfClusters的值。在ConsoleCmdScanDisk函数中,使用了下面的语句打印输出根目录的起始扇区号:fprintf(StdHandle,FirstSectorofRootDirectroy:%d\n,pVcb-FirstRootDirSector);根目录的起始扇区号可以使用保留扇区的数量加上FAT表占用扇区的数量来计算获得,而这些信息都可以从BPB中获得,所以上面的语句可以修改为:fprintf(StdHandle,FirstSectorofRootDirectroy:%d\n,pVcb-Bpb.ReservedSectors+pVcb-Bpb.Fats*pVcb-Bpb.SectorsPerFat);用fprintf(StdHandle,SizeofRootDirectroy:%d\n,pVcb-Bpb.RootEntries*32);代替fprintf(StdHandle,SizeofRootDirectroy:%d\n,pVcb-RootDirSize);用fprintf(StdHandle,FirstSectorofDataArea:%d\n,(pVcb-Bpb.ReservedSectors+pVcb-Bpb.Fats*pVcb-Bpb.SectorsPerFat)+(pVcb-Bpb.RootEntries*32/pVcb-Bpb.BytesPerSector));代替fprintf(StdHandle,FirstSectorofDataArea:%d\n,pVcb-FirstDataSector);用fprintf(StdHandle,NumberOfClusters:%d\n\n,pVcb-Bpb.Sectors-((pVcb-Bpb.ReservedSectors+pVcb-Bpb.Fats*pVcb-Bpb.SectorsPerFat)+(pVcb-Bpb.RootEntries*32/pVcb-Bpb.BytesPerSector)));代替fprintf(StdHandle,NumberOfClusters:%d\n\n,pVcb-NumberOfClusters);3、阅读控制台命令“dir”相关的源代码,并查看其执行的结果:4、输出每个文件所占用的磁盘空间的大小:文件的大小与文件所占用的磁盘空间是两个不同的概念,文件所占用的磁盘空间是簇的整数倍,所以文件所占用的磁盘空间总是大于或等于文件的大小。更改代码如下:fprintf(StdHandle,Name|Size(Byte)|LastWriteTime|Space(Byte)\n);for(i=0;ipVcb-Bpb.RootEntries;i++){pDirEntry=(PDIRENT)(pBuffer+32*i);////跳过未使用的目录项和被删除的目录项//if(0x0==pDirEntry-Name[0]||(CHAR)0xE5==pDirEntry-Name[0])continue;FatConvertDirNameToFileName(pDirEntry-Name,FileName);for(n=0,NowCluster=pDirEntry-FirstCluster;pDirEntry-FirstCluster!=0;){n++;if(FatGetFatEntryValue(pVcb,NowCluster)==(USHORT)0xFF8)break;NowCluster=FatGetFatEntryValue(pVcb,NowCluster);}fprintf(StdHandle,%s%d%d-%d-%d%d:%d:%d%d\n,FileName,pDirEntry-FileSize,1980+pDirEntry-LastWriteDate.Year,pDirEntry-LastWriteDate.Month,pDirEntry-LastWriteDate.Day,pDirEntry-LastWriteTime.Hour,pDirEntry-LastWriteTime.Minute,pDirEntry-LastWriteTime.DoubleSeconds,n*512);}三、实验思考题:1.在ConsoleCmdScanDisk函数中扫描FAT表时,为什么不使用FAT表项的数量进行计数,而是使用簇的数量进行计数呢?而且为什么簇的数量要从2开始计数呢?答:文件分配表(FileAllocationTable)用于将数据区中的磁盘空间分配给文件,属于典型的显式链接方式。文件分配表被划分为紧密排列的若干个表项,每个表项都与数据区中的一个簇相对应,而且表项的序号也是与簇号一一对应的本来序号为0和1的FAT表项应该对应于簇0和簇1,但是由于这两个表项被设置成了固定值,簇0和簇1就没有存在的意义了,这样数据区就起始于簇2四、实验感想:通过本次试验,让我对操作系统中系统区根目录和文件分配表有了一个深刻的认识,对于根目录的内容和内容各数据之间的关系也有了一定的了解。对于内存系统区的存放方式更有了认识上的进步。对fat表模型的理解也是一大收获。
本文标题:fat表实验
链接地址:https://www.777doc.com/doc-4268463 .html