操作系统实验报告
——实验十一
学
学
学
科: 操作系统
院: 计算机与信息学院
号: 20112462
学生姓名: 韩 力
专业班级:计算机科学与技术 11-1 班
一、 实验目的
通过查看 FAT13 文件系统的扫描数据,并调试扫描的过程,
理解 FAT12 文件系统管理软盘的方式。
通过改进 FAT12 文件系统的扫描功能,加深对 FAT12 文件系
统的理解。
二、 实验内容
3.1 实验准备
1.启动 OS Lab
2.新建一个 EOS Kernel 项目
3.2 阅读控制台命令“sd”相关的源代码,并查看其执行的结
果
按照下面的步骤执行控制台命令“SD”,查看扫描的结果
1. 按 F7 生成在本实验 3.1 中创建的 EOS Kernel 项目
2. 按 F5 启动调试
3. 待 EOS 启动完毕,在 EOS 控制台中输入命令“sd”后回车
观察命令执行的结果
3.3 根据 BPB 中的信息计算出其他信息
3.3.1要求
修改“sd”命令函数 ConsoleCmdScanDisk 的源代码,在输
出 BPB 中保存信息后,不再通过 pVcb->FirstRootDirSetor 等
变量的值进行打印输出时,而是通过 BPB 中保存的信息重新计
算出下列的信息,并进行打印输出:
//修改后的 ConsoleCmdScanDisk 函数
PRIVATE
VOID
ConsoleCmdScanDisk(
IN HANDLE StdHandle
)
{
BOOL IntState;
PDEVICE_OBJECT FatDevice;
PVCB pVcb;
ULONG i, FreeClusterCount, UsedClusterCount;
IntState = KeEnableInterrupts(FALSE);
// 关中断
//
// 得到 FAT12 文件系统设备对象,然后得到卷控制块 VCB
//
FatDevice = (PDEVICE_OBJECT)ObpLookupObjectByName(IopDeviceObjectType, "A:");
pVcb = (PVCB)FatDevice->DeviceExtension;
//
// 将卷控制块中缓存的 BIOS Parameter Block (BPB) ,以及卷控制块中的其它重要信息
输出
//
fprintf(StdHandle, "******** BIOS Parameter Block (BPB) ********\n");
: %d\n", pVcb->Bpb.BytesPerSector);
fprintf(StdHandle, "Bytes Per Sector
fprintf(StdHandle, "Sectors Per Cluster: %d\n", pVcb->Bpb.SectorsPerCluster);
fprintf(StdHandle, "Reserved Sectors
: %d\n", pVcb->Bpb.ReservedSectors);
fprintf(StdHandle, "Fats
fprintf(StdHandle, "Root Entries
fprintf(StdHandle, "Sectors
fprintf(StdHandle, "Media
fprintf(StdHandle, "Sectors Per Fat
fprintf(StdHandle, "Sectors Per Track
fprintf(StdHandle, "Heads
: %d\n", pVcb->Bpb.HiddenSectors);
fprintf(StdHandle, "Hidden Sectors
fprintf(StdHandle, "Large Sectors
: %d\n", pVcb->Bpb.LargeSectors);
fprintf(StdHandle, "******** BIOS Parameter Block (BPB) ********\n\n");
: %d\n", pVcb->Bpb.RootEntries);
: %d\n", pVcb->Bpb.Sectors);
: 0x%X\n", pVcb->Bpb.Media);
: %d\n", pVcb->Bpb.SectorsPerFat);
: %d\n", pVcb->Bpb.SectorsPerTrack);
: %d\n", pVcb->Bpb.Fats);
: %d\n", pVcb->Bpb.Heads);
fprintf(StdHandle, "First Sector of Root Directroy: %d\n", pVcb->Bpb.ReservedSectors +
pVcb->Bpb.Fats * pVcb->Bpb.SectorsPerFat);
fprintf(StdHandle, "Size of Root Directroy
fprintf(StdHandle, "First Sector of Data Area
: %d\n", pVcb->Bpb.RootEntries * 32);
: %d\n", pVcb->Bpb.ReservedSectors +
pVcb->Bpb.Fats * pVcb->Bpb.SectorsPerFat + pVcb->Bpb.RootEntries * 32 /
pVcb->Bpb.BytesPerSector);
fprintf(StdHandle, "Number Of Clusters
: %d\n\n", (pVcb->Bpb.Sectors -
(pVcb->Bpb.ReservedSectors + pVcb->Bpb.Fats * pVcb->Bpb.SectorsPerFat +
pVcb->Bpb.RootEntries * 32 / pVcb->Bpb.BytesPerSector)) / pVcb->Bpb.SectorsPerCluster);
//
// 扫描 FAT 表,统计空闲簇的数量,并计算软盘空间的使用情况
//
FreeClusterCount = 0;
for (i = 2; i < pVcb->NumberOfClusters + 2; i++) {
if (0 == FatGetFatEntryValue(pVcb, i))
FreeClusterCount++;
}
UsedClusterCount = pVcb->NumberOfClusters - FreeClusterCount;
fprintf(StdHandle, "Free Cluster Count: %d (%d Byte)\n", FreeClusterCount,
FreeClusterCount*pVcb->Bpb.SectorsPerCluster*pVcb->Bpb.BytesPerSector);
fprintf(StdHandle, "Used Cluster Count: %d (%d Byte)\n", UsedClusterCount,
UsedClusterCount*pVcb->Bpb.SectorsPerCluster*pVcb->Bpb.BytesPerSector);
KeEnableInterrupts(IntState); // 开中断
}
3.4 阅读控制台命令“dir”相关的源代码,并查看其执行结果
1. 按 F7 生成在本实验 3.1 中创建的 EOS Kernel 项目
2. 按 F5 启动调试
3. 待 EOS Kernel 启动完毕,在 EOS 控制台中输入命令
“dir”后按回车
观察命令的执行结果:
3.5 输出每个文件所占用的磁盘空间的大小
3.5.1 要求:
修改“dir”命令函数 ConsoleCmdDir 函数的源代码,要求
在输出每个文件夹的名词、大小、最后修改时间后再输出每个
文件所占用的磁盘空间
3.5.2 测试方法
1.ConsoleCmdDir 函数的源代码修改完毕后,按 F7 生成项目
2.在“项目管理器”窗口中双击 Flopp.img 文件,使用
FloppyImageEditor 工具打开此软盘镜像
3.将本实验文件夹中的 void.txt 文件(大小为 0)添加到软盘
镜像的根目录中
4.点击 FloppyImageEditor 工具上的保存按钮,关闭该工具
5.按 F5 启动调试
6.待 EOS 启动完毕,在 EOS 控制台中输入命令“dir”后按回车
查看输出结果:
三、 实验思考题
因为在文件系统中是以簇为单位的,而每个簇都是由几个山区构
成,但必须是 2 的 n 次方倍,也就是因此原因,簇的数量才需要从 2
开始计数。