福州大学操作系统实验报告-文件系统的构建

发布时间:

计算机操作系统实验三
【实验名称】文件系统的构建(实验3
【实验目的】掌握磁盘的工作原理和操作系统进行文件管理的原理【实验原理】硬盘的
MBRMBRMainBootRecord,按其字面上的理解
即为主引导记录区,位于整个硬盘的0磁道0柱面1扇区。
总共512字节的主引导扇区中,MBR只占用了其中的446个字(偏移0000--偏移01BD另外的64个字节(偏移01BE--偏移01FD)交给了DPT(DiskPartitionTable硬盘分区表,最后两个字节"55AA"(偏移01FE-偏移01FF)是分区的结束标志。这个整体构成了硬盘的主引导扇区。大致的结构如图所示:

硬盘依据分区表中的信息把硬盘划分为最多四个分区(对于扩展分区,可进一步划分为多个逻辑分区)。U盘采用类似的方法划分分区。每个分区或软盘上可建立独立的文件系统。下图是FAT文件系统空间分布结构。




FAT1
FAT2

根目录区
文件数据区
【实验内容】在掌握磁盘的工作原理和操作系统进行文件管理原理的基础
上,自行设计实现在磁盘上建立文件系统的软件,该软件应该具有与Format似的功能,至少支持一种文件系统格式,如FATNTFSEXT2,至少能够对一种媒体进行格式化,如软盘,U盘或硬盘(不得在实验室的机器上进行硬盘格式

化的实验)等。不能直接调用操作系统提供的格式化工具或类似SHFormatDrive()的高层系统函数实现该软件。在Windows环境可使用biosdisk(函数完成底层盘操作,在Linux环境上可参考format的源代码。比较自己设计实现的软件与FORMAT,分析存在什么异同。
一、背景知识
使用DOC分区体系时,磁盘的第一个——也就是0号扇区被称为主引导记录扇区,也称为主引导记录MBRMasterBootrecorderMBR)。
1MBR数据结构
MBR446个字节的引导代码、64字节的主分区(4个)表及两个字节的55AA是分区的结束标志。FAT文件系统的整体布局

2、说明
1保留区含有一个重要的数据结构——系统引导扇区DBRFAT12FAT16的保留区通常只有一个扇区,FAT32的保留扇区要多一些,0号扇区外,还有其他一些扇区,其中包括了DBR的备份扇区。
2FAT区由来年各个大小相等的FAT表组成——FAT1FAT2FAT2紧跟在FAT1之后。
3FAT12FAT16的根目录虽然也属于数据区,但是他们并不由簇进行管理。也就是说FAT12FAT16的根目录是没有簇号的,他们的2号簇从根目录之后开始。FAT32的根目录通常位于2号簇。
3、典型的FAT32_DBR
10x00~0x023个字节,跳转指令。
20x03~0x0A8个字节,文件系统标志和版本号,这里为MSDOC5.030x0B~0x0C2个字节,每扇区字节数,5120X0200)。40x0D~0x0D1个字节,每簇扇区数,80x08)。
50x0E~0x0F2个字节,保留扇区数,20500x0802)。60x10~0x101个字节,FAT表个数,270x11~0x122个字节,根目录最多可容纳的目录项数,FAT12/16通常为512FAT32不使用此处值,置0
80x13~0x142个字节,扇区总数,小于32MB时使用该处存放。超过32MB使用偏移0x20~0x23字节处的4字节存放。笔者的SD卡容量为2GB,所以不使用该处,置0.
1


90x15~0x151个字节,介质描述符,0xF8表示本地硬盘。
100x16~0x172个字节,每个FAT表的大小扇区数(FAT12/16使用,FAT32不使用此处,置0)。
110x18~0x192个字节,每磁道扇区数,630x003F)。120x1A~0x1B2个字节磁头数,2550x00FF)。130x1C~0x1F4个字节,分区前已使用扇区数,140x20~0x234个字节,文件系统大小扇区数。150x24~0x274个字节,每个FAT表的大小扇区数。160x28~0x292个字节,标记。170x2A~0x2B2个字节,版本号。
180x2C~0x2F4个字节,根目录簇号,2(虽然在FAT32文件系统下,根目录可以存放在数据区的任何位置,但是通常情况下还是起始于2号簇)
190x30~0x312个字节,FSINFO(文件系统信息扇区)扇区号,1。(上图的标注即用黄色条纹的标注有误,请读者注意)该扇区为操作系统提供关于空簇总数及下一可用簇的信息。
200x32~0x332个字节,备份引导扇区的位置,6。(上图的标注即用黄色条纹的标注有误,请读者注意)备份引导扇区总是位于文件系统的6号扇区。210x34~0x3F12个字节,未使用。
220x40~0x401个字节,BIOSINT13H设备号,0x80。(这个我也不知道什么意思
230x41~0x411个字节,未用。
240x42~0x421个字节,扩展引导标志。0x29
250x43~0x461个字节,卷序列号。通常为一个随机值。
260x47~0x5111个字节,卷标(ASCII码),如果建立文件系统的时候指定了卷标,会保存在此。笔者当时没有指定卷表,上图中的YCY是后来指定的。270x52~0x598个字节,文件系统格式的ASCII码,FAT32280x5A~0x1FD410个字节,未使用。该部分没有明确的用途。

本实验关键点:
FAT1起始扇区=DBR的扇区号+保留扇区号
根目录起始扇区=保留扇区数+一个FAT的扇区数×FAT表个数+(起始始簇号-2x每簇的扇区数
Fat32查找目录区簇号,在fat表中从根目录查起,直到其表项标记结束。使用到的工具:winhex(自行网上下载)a.cb.cc.c(将下面源码复制进相应文件里即可,linux下运行没问题,windows会报错)
2


二、实验方案(如图)

获取FAT32
导记录
更改记录
写入引导记

清空分配表

三、预计实验结果:
u盘格式化成fat32文件系统,8G容量。
四、关键代码:
a.c文件
读取FAT32DBR保存到tmp.txt
#include#include#include#includeintmain({intfd;charmbr[512];FILE*fp;chartmp[20];printf("input:\n";scanf("%s",tmp;fd=open(tmp,O_RDWR;//打开驱动器read(fd,mbr,sizeof(mbr;close(fd;fp=fopen("tmp.txt","w";fwrite(mbr,sizeof(mbr,1,fp;fclose(fp;}
b.c文件
#include#include#include#include

3

#include#include//DBR结构
typedefstructFAT32_DBR{charBS_jmpBoot[3];//跳转指令charBS_OEMName[8];//操作系统的名称和版本号charBPB_BytesPerSec[2];//每扇区字节数charBPB_SecPerClus[1];//每簇扇区数charBPB_RsvdSecCnt[2];//保留扇区数目charBPB_NumFATs[1];//此卷中FAT表数charBPB_RootEntCnt[2];//FAT320charBPB_TotSec16[2];//FAT320charBPB_Media[1];//存储介质charBPB_FATSz16[2];//FAT320charBPB_SecPerTrk[2];//磁道扇区数charBPB_NumHeads[2];//磁头数charBPB_HiddSec[4];//FAT区前隐扇区数charBPB_TotSec32[4];//该卷总扇区数charBPB_FATSz32[4];//一个FAT表扇区数charBPB_ExtFlags[2];//FAT32特有charBPB_FSVer[2];//FAT32特有charBPB_RootClus[4];//根目录簇号charFSInfo[2];//保留扇区FSINFO扇区数charBPB_BkBootSec[2];//通常为6charBPB_Reserved[12];//扩展用charBS_DrvNum[1];//charBS_Reserved1[1];//charBS_BootSig[1];//charBS_VolID[4];//charBS_FilSysType[11];//charBS_FilSysType1[8];//"FAT32"charleft[422];//剩余空间}fat32;
intmain({fat32mymbr;intfd,i;FILE*fp;chartmp[20];charini=0x00;charend2=0xff;printf("input:\n";

4

scanf("%s",tmp;fp=fopen("tmp.txt","r";//从文件读取DBRfread(&mymbr,sizeof(fat32,1,fp;fd=open(tmp,O_RDWR;//打开驱动器if(fd<0{printf("error!\n";exit(1;}write(fd,&mymbr,sizeof(mymbr;//写入DBRprintf("SUCCESS!\n";close(fd;fclose(fp;return0;}
c.c文件
#include#include#include#include#include#includeintmain({intfd,i;chartmp[20];charini=0x00;intfat1,fat2,dir;fat1=1049600;fat2=8913408;dir=16777216;fat1+=12;fat2+=12;printf("input:\n";scanf("%s",tmp;fd=open(tmp,O_RDWR;//打开驱动器if(fd<0{printf("error!\n";exit(1;}lseek(fd,fat1,SEEK_SET;//跳到fat1位置for(i=0;i<100000;i++//清空分配表write(fd,&ini,1;lseek(fd,fat2,SEEK_SET;//跳到fat2位置for(i=0;i<100000;i++//清空分配表write(fd,&ini,1;lseek(fd,dir,SEEK_SET;//跳到dir位置

5

}
for(i=0;i<10000;i++//清空目录表write(fd,&ini,1;printf("SUCCESS!\n";close(fd;return0;
五、傻瓜式操作步骤及实验代码分析

1,将上面代码存到a.c,b.c,c.c3个文件中,放到linux同一目录下就好了2,在windows下将实验U盘格式化成fat32文件系统(右击格式化就好了
3,在linux下插入U盘运行a.c程序,输入u盘物理地址(一般是/dev/sdb或者/dev/sdb1懂的话可以通过fdisk-l指令查看,那个个字母是小写L
会自动生成一个tmp.txt,复制到windows(这个就是标准的fat32文件系统dbr内容,可以通过winhex打开)
4windows打开winhex软件,打开tmp.txt文件后得到上图。5,根据上面dbr的说明和图计算后可得到如下数据。
保留扇区数为Ox0802(高地址在前)=2050(十进制)每个fat表扇区数Ox3bff=15359(十进制)
FAT1起始扇区=DBR的扇区号+保留扇区号=0+2050=2050FAT2起始扇区=FAT1起始扇区+每个fat表扇区数
6


根目录起始扇区=保留扇区数+一个FAT的扇区数×FAT表个数
得到以上数据后,将每个值乘以512(每个扇区的字节数),即可得到对应起始字节数。这些信息在代码3.c中有用到(注意每个u盘的这些信息都不一样)本人U盘的值如下:
fat1=1049600;//fat1起始字节fat2=8913408;//fat2起始字节dir=16777216;//dir起始字节
6,现在先将刚才的U盘随便塞点东西进去,以便格式化完后看效果如果你没将u盘改成其他文件系统(就是没重新格式化成非fat32系统),省略步骤77回到linux下,插入u盘,运行b.c文件,输入/dev/sdb(和刚才一样)他会自动将tmp.txt的内容重新写到u盘第一个扇区。
8,将c.c文件中fat1fat2dir设置成你自己dbr的(刚才教过怎么算了)


9,运行c.c程序,输入/dev/sdb就格式成功了。
六、调试过程

7



七、实验结果:
更改了DBR,格式成8G优盘:


八、实验结果分析:
本实验只简单的对U盘格式化,没进行坏道检查等操作。实验先读取到FAT32DBR,然后更改内容,或者原样写入U盘,清空分区,FAT1,FAT2,有遇到没有找到备份的FAT2情况。
实验实践了操作系统的理论知识,对文件系统的构建有了具体的认识。

8


福州大学操作系统实验报告-文件系统的构建

相关推荐