FAT文件系统原理
——http://www.sjhf.net
文本结构索引:
一、硬盘的物理结构
二、硬盘的逻辑结构
图片表格索引:
表 1 分区表参数
表 2 扩展分区表项的内容
图 1 硬盘的物理结构
表 3 FAT32 分区DBR的位置划分
图 2 winhex下的磁盘MBR
表 4 FAT32 分区的BPB字段
3.1 MBR扇区
三、磁盘
引导原理 3.2 扩展分区
图 3 winhex给出的MBR参数的意义
表 5 FAT32 分区的扩展BPB字段
图 4 分区表类型标志
表 6 FAT16 分区上的DBR组成
4.1 关于DBR
4.1.1 FAT32
DBR扇区
4.1.2 FAT16
DBR扇区
4.2 关于保留
扇区
四、FAT分
区原理
4.3.1 存储过程
假想
图 5 一个 4 分区的磁盘结构图示
表 7 FAT16 分区的BPB字段
图 6 分区表链接图示
图 7 磁盘的整体结构图示
图 8 winhex下的FAT32 基本分区DBR
图
图 9 winhex给出的图 8DBR参数说明
表 8 FAT16 分区的扩展BPB字段
表 9 FAT16 分区大小与对因簇
大小
表 11 FAT16 目录项的定义
表 12 FAT32 分区大小与对因簇
大小
4.3 FAT表和数
据的存储原则
4.3.2 FAT16 存
储原理
图 10 winhex所截FAT16 的文件分配
表
表 13 FAT表的取值含义
4.3.3 FAT32 存
储原理
图 4.3.11 Fat16 的组织形式
五、结束
图 4.3.12 Fat32 的组织形式
表 14 FAT32 短文件目录项的定
义
表 15 FAT32 长文件目录项的定
义
一、硬盘的物理结构:
硬盘存储数据是根据电、磁转换原理实现的。硬盘由一个或几个表面镀有
磁性物质的金属或玻璃等物质盘片以及盘片两面所安装的磁头和相应的控制电
路组成(图 1),其中盘片和磁头密封在无尘的金属壳中。
硬盘工作时,盘片以设计转速高速旋转,设置在盘片表面的磁头则在电路控制
下径向移动到指定位置然后将数据存储或读取出来。当系统向硬盘写入数据
时,磁头中“写数据”电流产生磁场使盘片表面磁性物质状态发生改变,并在
写电流磁场消失后仍能保持,这样数据就存储下来了;当系统从硬盘中读数据
第 1/39 页数据恢复(http://www.sjhf.net)
时,磁头经过盘片指定区域,盘片表面磁场使磁头产生感应电流或线圈阻抗产
生变化,经相关电路处理后还原成数据。因此只要能将盘片表面处理得更平
滑、磁头设计得更精密以及尽量提高盘片旋转速度,就能造出容量更大、读写
数据速度更快的硬盘。这是因为盘片表面处理越平、转速越快就能越使磁头离
盘片表面越近,提高读、写灵敏度和速度;磁头设计越小越精密就能使磁头在
盘片上占用空间越小,使磁头在一张盘片上建立更多的磁道以存储更多的数
据。
[返回索引]
二、硬盘的逻辑结构。
硬盘由很多盘片(platter)组成,每个盘片的每个面都有一个读写磁头。如
果有N个盘片。就有 2N个面,对应 2N个磁头(Heads),从 0、1、2 开始编号。每
个盘片被划分成若干个同心圆磁道(逻辑上的,是不可见的。)每个盘片的划分
规则通常是一样的。这样每个盘片的半径均为固定值R的同心圆再逻辑上形成了
一个以电机主轴为轴的柱面(Cylinders),从外至里编号为 0、1、2……每个盘
片上的每个磁道又被划分为几十个扇区(Sector),通常的容量是 512byte,并
按照一定规则编号为 1、2、3……形成Cylinders×Heads×Sector个扇区。这
三个参数即是硬盘的物理参数。我们下面的很多实践需要深刻理解这三个参数
的意义。
[返回索引]
三、磁盘引导原理。
3.1 MBR(master boot record)扇区:
计算机在按下power键以后,开始执行主板bios程序。进行完一系列检测和
配置以后。开始按bios中设定的系统引导顺序引导系统。假定现在是硬盘。
Bios执行完自己的程序后如何 把执行权交给硬盘呢。交给硬盘后又执行存储在
哪里的程序呢。其实,称为mbr的一段代码起着举足轻重的作用。MBR(master
boot record),即主引导记录,有时也称主引导扇区。位于整个硬盘的 0 柱面 0
磁头 1 扇区(可以看作是硬盘的第一个扇区),bios在执行自己固有的程序以后
就会jump到mbr中的第一条指令。将系统的控制权交由mbr来执行。在总共
512byte的主引导记录中,MBR的引导程序占了其中的前 446 个字节(偏移 0H~偏
移 1BDH),随后的 64 个字节(偏移 1BEH~偏移 1FDH)为DPT(Disk
PartitionTable,硬盘分区表),最后的两个字节“55 AA”(偏移 1FEH~偏移
1FFH)是分区有效结束标志。
MBR不随操作系统的不同而不同,意即不同的操作系统可能会存在相同的
MBR,即使不同,MBR也不会夹带操作系统的性质。具有公共引导的特性。
我们来分析一段mbr。下面是用winhex查看的一块希捷 120GB硬盘的mbr。
第 2/39 页数据恢复(http://www.sjhf.net)
[返回索引]
你的硬盘的 MBR 引导代码可能并非这样。不过即使不同,所执行的功能大体
是一样的。
我们看 DPT 部分。操作系统为了便于用户对磁盘的管理。加入了磁盘分区的
概念。即将一块磁盘逻辑划分为几块。磁盘分区数目的多少只受限于 C~Z 的英
文字母的数目,在上图 DPT 共 64 个字节中如何表示多个分区的属性
呢?microsoft 通过链接的方法解决了这个问题。在 DPT 共 64 个字节中,以 16
个字节为分区表项单位描述一个分区的属性。也就是说,第一个分区表项描述
一个分区的属性,一般为基本分区。第二个分区表项描述除基本分区外的其余
空间,一般而言,就是我们所说的扩展分区。 这部分的大体说明见表 1。
第 3/39 页数据恢复(http://www.sjhf.net)
表 1 图 2 分区表第一字段
字节位
移
字段
长度
值
字段名和定义
0x01BE BYTE
0x80
0x01BF BYTE
0x01
0x01C0 6 位
0x01
0x01C1 10 位
0x00
0x01C2 BYTE
0x07
0x01C3 BYTE
0xFE
0x01C4 6 位
0xFF
0x01C5 10 位
0x7B
引导指示符
(Boot
Indicator) 指
明该分区是否是
活动分区。
开始磁头
(Starting Head)
开始扇区
(Starting
Sector) 只用了
0~5 位。后面的
两位(第 6 位和第
7 位)被开始柱面
字段所使用
开始柱面
(Starting
Cylinder) 除
了开始扇区字段
的最后两位外,
还使用了 1 位来
组成该柱面值。
开始柱面是一个
10 位数,最大值
为 1023
系统 ID(System
ID) 定义了分区
的类型,详细定
义,请参阅图 4
结束磁头(Ending
Head)
结束扇区(Ending
Sector) 只
使用了 0~5 位。
最后两位(第 6、
7 位)被结束柱面
字段所使用
结束柱面(Ending
Cylinder) 除了
结束扇区字段最
后的两位外,还
使用了 1 位,以
组成该柱面值。
结束柱面是一个
10 位的数,最大
值为 1023
0x01C6 DWORD 0x0000003F 相对扇区数
第 4/39 页数据恢复(http://www.sjhf.net)
(Relative
Sectors) 从该磁
盘的开始到该分
区的开始的位移
量,以扇区来计
算
总扇区数(Total
Sectors) 该分区
中的扇区总数
0x01CA DWORD 0x00DAA83D
[返回索引]
注:上表中的超过 1 字节的数据都以实际数据显示,就是按高位到地位的方式
显示。存储时是按低位到高位存储的。两者表现不同,请仔细看清楚。以后出
现的表,图均同。
第 5/39 页数据恢复(http://www.sjhf.net)
也可以在winhex中看到这些参数的意义:
第 6/39 页数据恢复(http://www.sjhf.net)
第 7/39 页数据恢复(http://www.sjhf.net)
[返回索引]
说明: 每个分区表项占用 16 个字节,假定偏移地址从 0 开始。如图 3 的
分区表项 3。分区表项 4 同分区表项 3。
1、0H偏移为活动分区是否标志,只能选 00H和 80H。80H为活动,00H为非
活动。其余值对microsoft而言为非法值。
2、重新说明一下(这个非常重要):大于 1 个字节的数被以低字节在前的存
储格式格式(little endian format)或称反字节顺序保存下来。低字节在前的
格式是一种保存数的方法,这样,最低位的字节最先出现在十六进制数符号
中。例如,相对扇区数字段的值 0x3F000000 的低字节在前表示为
0x0000003F。这个低字节在前 的格式数的十进制数为 63。
3、系统在分区时,各分区都不允许跨柱面,即均以柱面为单位,这就是通
常所说的分区粒度。有时候我们分区是输入分区的大小为 7000M,分出来却是
6997M,就是这个原因。 偏移 2H和偏移 6H的扇区和柱面参数中,扇区占 6 位
(bit),柱面占 10 位(bit),以偏移 6H为例,其低 6 位用作扇区数的二进制表
示。其高两位做柱面数 10 位中的高两位,偏移 7H组成的 8 位做柱面数 10 位中
的低 8 位。由此可知,实际上用这种方式表示的分区容量是有限的,柱面和磁
头从 0 开始编号,扇区从 1 开始编号,所以最多只能表示 1024 个柱面×63 个扇
区×256 个磁头×512byte=8455716864byte。即通常的 8.4GB(实际上应该是
7.8GB左右)限制。实际上磁头数通常只用到 255 个(由汇编语言的寻址寄存器决
定),即使把这 3 个字节按线性寻址,依然力不从心。 在后来的操作系统中,超
过 8.4GB的分区其实已经不通过C/H/S的方式寻址了。而是通过偏移CH~偏移FH
共 4 个字节 32 位线性扇区地址来表示分区所占用的扇区总数。可知通过 4 个字
节可以表示 2^32 个扇区,即 2TB=2048GB,目前对于大多数计算机而言,这已
经是个天文数字了。在未超过 8.4GB的分区上,C/H/S的表示方法和线性扇区的
表示方法所表示的分区大小是一致的。也就是说,两种表示方法是协调的。即
使不协调,也以线性寻址为准。(可能在某些系统中会提示出错)。超过 8.4GB
的分区结束C/H/S一般填充为FEH FFH FFH。即C/H/S所能表示的最大值。有时候
也会用柱面对 1024 的模来填充。不过这几个字节是什么其实都无关紧要了。
虽然现在的系统均采用线性寻址的方式来处理分区的大小。但不可跨柱面
的原则依然没变。本分区的扇区总数加上与前一分区之间的保留扇区数目依然
必须是柱面容量的整数倍。(保留扇区中的第一个扇区就是存放分区表的MBR或
虚拟MBR的扇区,分区的扇区总数在线性表示方式上是不计入保留扇区的。如果
是第一个分区,保留扇区是本分区前的所有扇区。
附:分区表类型标志如图 4
第 8/39 页数据恢复(http://www.sjhf.net)