1、合肥工业大学计算机与信息学院实验报告课 程:操作系统专业班级:计算机科学与技术班学 号:姓 名: 一、 实验目的:1、通过查看 FAT12 文件系统的扫描数据,并调试扫描的过程,理解 FAT12 文件系统管理软盘的方式。2、通过改进 FAT12 文件系统的扫描功能,加深对 FAT12 文件系统的理解。二、实验内容:1、 阅 读 控 制 台 命 令 “sd”相 关 的 源 代 码 , 并 查 看 其 执 行 的 结 果 :2、 根 据 BPB 中 的 信 息 计 算 出 其 他 信 息 :通过 BPB 中保存的信息重新计算出下列信息,并打印输出:(1) 计算并打印输出根目录的起始扇区号,即 pV
2、cb-FirstRootDirSector 的值。(2) 计算并打印输出根目录的大小,即 pVcb-RootDirSize 的值。(3) 计算并打印输出数据区的起始扇区号,即 pVcb-FirstDataSector 的值。(4) 计算并打印输出数据区中簇的数量,即 pVcb-NumberOfClusters 的值。在 ConsoleCmdScanDisk 函数中,使用了下面的语句打印输出根目录的起始扇区号:fprintf(StdHandle, “First Sector of Root Directroy: %dn“, pVcb-FirstRootDirSector);根目录的起始扇区号可以
3、使用保留扇区的数量加上 FAT 表占用扇区的数量来计算获得,而这些信息都可以从 BPB 中获得,所以上面的语句可以修改为:fprintf(StdHandle, “First Sector of Root Directroy: %dn“, pVcb-Bpb.ReservedSectors + pVcb-Bpb.Fats * pVcb-Bpb.SectorsPerFat);用 fprintf(StdHandle, “Size of Root Directroy : %dn“, pVcb-Bpb.RootEntries * 32);代替fprintf(StdHandle, “Size of Root
4、 Directroy : %dn“, pVcb-RootDirSize);用 fprintf(StdHandle, “First Sector of Data Area : %dn“, (pVcb-Bpb.ReservedSectors + pVcb-Bpb.Fats * pVcb-Bpb.SectorsPerFat) + (pVcb-Bpb.RootEntries * 32 / pVcb-Bpb.BytesPerSector);代替fprintf(StdHandle, “First Sector of Data Area : %dn“, pVcb-FirstDataSector);用 fpr
5、intf(StdHandle, “Number Of Clusters : %dnn“, pVcb-Bpb.Sectors - (pVcb-Bpb.ReservedSectors + pVcb-Bpb.Fats * pVcb-Bpb.SectorsPerFat) + (pVcb-Bpb.RootEntries * 32 / pVcb-Bpb.BytesPerSector);代替fprintf(StdHandle, “Number Of Clusters : %dnn“, pVcb-NumberOfClusters);3、 阅 读 控 制 台 命 令 “dir”相 关 的 源 代 码 , 并 查
6、 看 其 执 行 的 结 果 :4、 输 出 每 个 文 件 所 占 用 的 磁 盘 空 间 的 大 小 :文件的大小与文件所占用的磁盘空间是两个不同的概念,文件所占用的磁盘空间是簇的整数倍,所以文件所占用的磁盘空间总是大于或等于文件的大小。更改代码如下:fprintf(StdHandle, “Name | Size(Byte) | Last Write Time| Space(Byte)n“);for(i=0; iBpb.RootEntries; i+) pDirEntry = (PDIRENT)(pBuffer + 32 * i);/ 跳过未使用的目录项和被删除的目录项/if(0x0 =
7、pDirEntry-Name0| (CHAR)0xE5 = pDirEntry-Name0)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(
8、StdHandle, “%s %d %d-%d-%d %d:%d:%d %dn“,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. 在 ConsoleCmdSca
9、nDisk 函数中扫描 FAT 表时,为什么不使用 FAT 表项的数量进行计数,而是使用簇的数量进行计数呢?而且为什么簇的数量要从 2 开始计数呢?答:文件分配表(File Allocation Table)用于将数据区中的磁盘空间分配给文件,属于典型的显式链接方式。文件分配表被划分为紧密排列的若干个表项,每个表项都与数据区中的一个簇相对应,而且表项的序号也是与簇号一一对应的本来序号为 0 和 1 的 FAT 表项应该对应于簇 0 和簇 1,但是由于这两个表项被设置成了固定值,簇 0 和簇 1 就没有存在的意义了,这样数据区就起始于簇 2四、实验感想:通过本次试验,让我对操作系统中系统区根目录和文件分配表有了一个深刻的认识,对于根目录的内容和内容各数据之间的关系也有了一定的了解。对于内存系统区的存放方式更有了认识上的进步。对 fat 表模型的理解也是一大收获。