📄 硬盘 fat 文件系统原理的详细分析-数据恢复.htm
字号:
的英文字母的数目,在上图 DPT 共 64 个字节中如何表示多个分区的属性呢 ?microsoft 通过链接的方法解决了这个问题。在 DPT 共
64 个字节中,以 16
个字节为分区表项单位描述一个分区的属性。也就是说,第一个分区表项描述一个分区的属性,一般为基本分区。第二个分区表项描述除基本分区外的其余空间,一般而言,就是我们所说的扩展分区。这部分的大体说明见表
1 。 </P>
<P align=center><IMG height=503
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1684.gif" width=459></P>
<P><BR> 注:上表中的超过 1
字节的数据都以实际数据显示,就是按高位到地位的方式显示。存储时是按低位到高位存储的。两者表现不同,请仔细看清楚。以后出现的表,图均同。 </P>
<P> 也可以在 winhex 中看到这些参数的意义: </P>
<P align=center><IMG height=963
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1685.gif" width=422></P>
<P> 说明: 每个分区表项占用 16 个字节,假定偏移地址从 0 开始。如图 3 的分区表项 3
。分区表项 4 同分区表项 3 。 </P>
<P> 1 、 0H 偏移为活动分区是否标志,只能选 00H 和 80H 。 80H 为活动, 00H
为非活动。其余值对 microsoft 而言为非法值。 </P>
<P> 2 、重新说明一下 ( 这个非常重要 ) :大于 1 个字节的数被以低字节在前的存储格式格式
(little endian format)
或称反字节顺序保存下来。低字节在前的格式是一种保存数的方法,这样,最低位的字节最先出现在十六进制数符号中。例如,相对扇区数字段的值
0x3F000000 的低字节在前表示为 0x0000003F 。这个低字节在前的格式数的十进制数为 63 。 </P>
<P>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 的模来填充。不过这几个字节是什么其实都无关紧要了。 </P>
<P>
虽然现在的系统均采用线性寻址的方式来处理分区的大小。但不可跨柱面的原则依然没变。本分区的扇区总数加上与前一分区之间的保留扇区数目依然必须是柱面容量的整数倍。
( 保留扇区中的第一个扇区就是存放分区表的 MBR 或虚拟 MBR
的扇区,分区的扇区总数在线性表示方式上是不计入保留扇区的。如果是第一个分区,保留扇区是本分区前的所有扇区。 </P>
<P> 附:分区表类型标志如图 4 </P>
<P align=center><IMG height=630
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1686.gif" width=358></P>
<P> 3.2 扩展分区 </P>
<P> 扩展分区中的每个逻辑驱动器都存在一个类似于 MBR 的扩展引导记录
( Extended Boot Record, EBR) ,也有人称之为虚拟 mbr 或扩展 mbr
,意思是一样的。扩展引导记录包括一个扩展分区表和该扇区的标签。扩展引导记录将记录只包含扩展分区中每个逻辑驱动器的第一个柱面的第一面的信息。一个逻辑驱动器中的引导扇区一般位于相对扇区
32 或 63
。但是,如果磁盘上没有扩展分区,那么就不会有扩展引导记录和逻辑驱动器。第一个逻辑驱动器的扩展分区表中的第一项指向它自身的引导扇区。第二项指向下一个逻辑驱动器的
EBR
。如果不存在进一步的逻辑驱动器,第二项就不会使用,而且被记录成一系列零。如果有附加的逻辑驱动器,那么第二个逻辑驱动器的扩展分区表的第一项会指向它本身的引导扇区。第二个逻辑驱动器的扩展分区表的第二项指向下一个逻辑驱动器的
EBR 。扩展分区表的第三项和第四项永远都不会被使用。 </P>
<P> 通过一幅 4 分区的磁盘结构图可以看到磁盘的大致组织形式。如图 5 : </P>
<P align=center><IMG height=570
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1687.gif" width=265></P>
<P> 关于扩展分区,如图 6
所示,扩展分区中逻辑驱动器的扩展引导记录是一个连接表。该图显示了一个扩展分区上的三个逻辑驱动器,说明了前面的逻辑驱动器和最后一个逻辑驱动器之间在扩展分区表中的差异。
</P>
<P align=center><IMG height=535
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1688.gif" width=316></P>
<P> 除了扩展分区上最后一个逻辑驱动器外,表 2
中所描述的扩展分区表的格式在每个逻辑驱动器中都是重复的:第一个项标识了逻辑驱动器本身的引导扇区,第二个项标识了下一个逻辑驱动器的 EBR
。最后一个逻辑驱动器的扩展分区表只会列出它本身的分区项。最后一个扩展分区表的第二个项到第四个项被使用。 </P>
<P><IMG height=175 src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1689.gif"
width=478></P>
<P>
扩展分区表项中的相对扇区数字段所显示的是从扩展分区开始到逻辑驱动器中第一个扇区的位移的字节数。总扇区数字段中的数是指组成该逻辑驱动器的扇区数目。总扇区数字段的值等于从扩展分区表项所定义的引导扇区到逻辑驱动器末尾的扇区数。
</P>
<P> 有时候在磁盘的末尾会有剩余空间,剩余空间是什么呢?我们前面说到,分区是以 1
柱面的容量为分区粒度的,那么如果磁盘总空间不是整数个柱面的话,不够一个柱面的剩下的空间就是剩余空间了,这部分空间并不参与分区,所以一般无法利用。照道理说,磁盘的物理模式决定了磁盘的总容量就应该是整数个柱面的容量,为什么会有不够一个柱面的空间呢。在我的理解看来,本来现在的磁盘为了更大的利用空间,一般在物理上并不是按照外围的扇区大于里圈的扇区这种管理方式,只是为了与操作系统兼容而抽象出来
CHS 。可能其实际空间 <A
href="mailto:zymail@vip.sina.com">mailto:zymail@vip.sina.com</A></P>
<P> 四、 FAT 分区原理 </P>
<P> 先来一幅结构图: </P>
<P><IMG height=640 src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1690.gif"
width=322></P>
<P> 现在我们着重研究 FAT 格式分区内数据是如何存储的。 FAT 分区格式是 MICROSOFT
最早支持的分区格式,依据 FAT 表中每个簇链的所占位数 ( 有关概念,后面会讲到 ) 分为 fat12 、 fat16 、 fat32 三种格式
" 变种 " ,但其基本存储方式是相似的。 </P>
<P> 仔细研究图 7 中的 fat16 和 fat32 分区的组成结构。下面依次解释 DBR 、 FAT1 、
FAT2 、根目录、数据区、剩余扇区的概念。提到的地址如无特别提示均为分区内部偏移。 </P>
<P> 4.1 关于 DBR. </P>
<P> DBR 区 (DOS BOOT RECORD)
即操作系统引导记录区的意思,通常占用分区的第 0 扇区共 512 个字节 ( 特殊情况也要占用其它保留扇区,我们先说第 0 扇 ) 。在这 512
个字节中,其实又是由跳转指令,厂商标志和操作系统版本号, BPB(BIOS Parameter Block) ,扩展 BPB ,
os 引导程序,结束标志几部分组成。 以用的最多的 FAT32 为例说明分区 DBR 各字节的含义。见图 8 。 </P>
<P align=center><IMG height=621
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1691.gif" width=500></P>
<P> 图 8 的对应解释见表 3 </P>
<P align=center><IMG height=202
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1692.gif" width=459></P>
<P> 图 9 给出了 winhex 对图 8 DBR 的相关参数解释: </P>
<P> </P>
<P align=center><IMG height=721
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1693.gif" width=392></P>
<P> 根据上边图例,我们来讨论 DBR 各字节的参数意义。 </P>
<P> MBR 将 CPU 执行转移给引导扇区,因此,引导扇区的前三个字节必须是合法的可执行的基于 x86 的
CPU 指令。这通常是一条跳转指令,该指令负责跳过接下来的几个不可执行的字节 (BPB 和扩展 BPB) ,跳到操作系统引导代码部分。 </P>
<P> 跳转指令之后是 8 字节长的 OEM ID ,它是一个字符串,
OEM ID 标识了格式化该分区的操作系统的名称和版本号。为了保留与 MS-DOS 的兼容性,通常
Windows 2000 格式化该盘是在 FAT16 和 FAT32 磁盘上的该字段中记录了 “MSDOS 5.0” ,在
NTFS 磁盘上 ( 关于 ntfs ,另述 ) , Windows 2000 记录的是 “NTFS” 。通常在被
Windows 95 格式化的磁盘上 OEM ID 字段出现 “MSWIN4.0” ,在被
Windows 95 OSR2 和 Windows 98 格式化的磁盘上 OEM ID 字段出现
“MSWIN4.1” 。 </P>
<P> 接下来的从偏移 0x0B 开始的是一段描述能够使可执行引导代码找到相关参数的信息。通常称之为
BPB(BIOS Parameter Block) , BPB
一般开始于相同的位移量,因此,标准的参数都处于一个已知的位置。磁盘容量和几何结构变量都被封在 BPB 之中。由于引导扇区的第一部分是一个 x86
跳转指令。因此,将来通过在 BPB 末端附加新的信息,可以对 BPB 进行扩展。只需要对该跳转指令作一个小的调整就可以适应 BPB 的变化。图 9
已经列出了项目的名称和取值,为了系统的研究,针对图 8 ,将 FAT32 分区格式的 BPB 含义和扩展 BPB 含义释义为表格,见表 4 和表 5
。 </P>
<P align=center><IMG height=1378
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1694.gif" width=500></P>
<P> DBR 的偏移 0x5A 开始的数据为操作系统引导代码。这是由偏移 0x00
开始的跳转指令所指向的。在图 8 所列出的偏移 0x00~0x02 的跳转指令 "EB 58 90" 清楚地指明了 OS
引导代码的偏移位置。 jump 58H 加上跳转指令所需的位移量,即开始于 0x5A
。此段指令在不同的操作系统上和不同的引导方式上,其内容也是不同的。大多数的资料上都说 win98, 构建于 fat 基本分区上的
win2000,winxp 所使用的 DBR 只占用基本分区的第 0 扇区。他们提到,对于 fat32 ,一般的 32 个基本分区保留扇区只有第 0
扇区是有用的。实际上,以 FAT32 构建的操作系统如果是 win98, 系统会使用基本分区的第 0 扇区和第 2 扇区存储 os 引导代码;以
FAT32 构建的操作系统如果是 win2000 或 winxp, 系统会使用基本分区的第 0 扇区和第 0xC 扇区 (win2000 或
winxp, 其第 0xC 的位置由第 0 扇区的 0xAB 偏移指出 ) 存储 os 引导代码。所以,在 fat32 分区格式上,如果 DBR
一扇区的内容正确而缺少第 2 扇区 (win98 系统 ) 或第 0xC 扇区 (win2000 或 winxp 系统 )
,系统也是无法启动的。如果自己手动设置 NTLDR 双系统,必须知道这一点。 </P>
<P> DBR 扇区的最后两个字节一般存储值为 0x55AA 的 DBR
有效标志,对于其他的取值,系统将不会执行 DBR 相关指令。上面提到的其他几个参与 os 引导的扇区也需以 0x55AA 为合法结束标志。 </P>
<P> FAT16 DBR : </P>
<P align=center> FAT32 中 DBR 的含义大致如此,对于 FAT12 和 FAT16
其基本意义类似,只是相关偏移量和参数意义有小的差异, FAT 格式的区别和来因,以后会说到,此处不在多说 FAT12 与 FAT16 。我将
FAT16 的扇区参数意义列表。感兴趣的朋友自己研究一下,和 FAT32 大同小异的。 </P>
<P align=center><IMG height=177
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1695.gif" width=478></P>
<P align=center><IMG height=1027
src="硬盘 FAT 文件系统原理的详细分析-数据恢复.files/1711.gif" width=500></P>
<P> </P>
<P> 4.2 关于保留扇区 </P>
<P> 在上述 FAT 文件系统 DBR 的偏移 0x0E 处,用 2 个字节存储保留扇区的数目。所谓保留扇区
( 有时候会叫系统扇区,隐藏扇区 ) ,是指从分区 DBR 扇区开始的仅为系统所有的扇区,包括 DBR 扇区。在 FAT16
文件系统中,保留扇区的数据通常设置为 1 ,即仅仅 DBR 扇区。而在 FAT32 中,保留扇区的数据通常取为 32 ,有时候用
Partition Magic 分过的 FAT32 分区会设置 36 个保留扇区,有的工具可能会设置 63 个保留扇区。 </P>
<P> FAT32 中的保留扇区除了磁盘总第 0 扇区用作 DBR ,总第 2 扇区 (win98 系统 )
或总第 0xC 扇区 (win2000,winxp) 用作 OS
引导代码扩展部分外,其余扇区都不参与操作系统管理与磁盘数据管理,通常情况下是没作用的。操作系统之所以在 FAT32 中设置保留扇区,是为了对 DBR
作备份或留待以后升级时用。 FAT32 中, DBR 偏移 0x34 占 2 字节的数据指明了 DBR 备份扇区所在,一般为 0x06 ,即第 6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -