FAT
文件系统原理
(
一
)
一、
硬盘的物理结构:
硬盘存储数据是根据电、磁转换原理实现的。硬盘由一个或几个表面镀有磁性物质的金属或玻璃等物质盘片以及盘片两面所安装的磁头和相应的控制电路组成
(
图
1)
,其中盘片和磁头密封在无尘的金属壳中。
硬盘工作时,盘片以设计转速高速旋转,设置在盘片表面的磁头则在电路控制下径向移动到指定位置然后将数据存储或读取出来。当系统向硬盘写入数据时,磁头中 “ 写数据 ” 电流产生磁场使盘片表面磁性物质状态发生改变,并在写电流磁场消失后仍能保持,这样数据就存储下来了;当系统从硬盘中读数据时,磁头经过盘片指定区域,盘片表面磁场使磁头产生感应电流或线圈阻抗产生变化,经相关电路处理后还原成数据。因此只要能将盘片表面处理得更平滑、磁头设计得更精密以及尽量提高盘片旋转速度,就能造出容量更大、读写数据速度更快的硬盘。这是因为盘片表面处理越平、转速越快就能越使磁头离盘片表面越近,提高读、写灵敏度和速度;磁头设计越小越精密就能使磁头在盘片上占用空间越小,使磁头在一张盘片上建立更多的磁道以存储更多的数据。
硬盘工作时,盘片以设计转速高速旋转,设置在盘片表面的磁头则在电路控制下径向移动到指定位置然后将数据存储或读取出来。当系统向硬盘写入数据时,磁头中 “ 写数据 ” 电流产生磁场使盘片表面磁性物质状态发生改变,并在写电流磁场消失后仍能保持,这样数据就存储下来了;当系统从硬盘中读数据时,磁头经过盘片指定区域,盘片表面磁场使磁头产生感应电流或线圈阻抗产生变化,经相关电路处理后还原成数据。因此只要能将盘片表面处理得更平滑、磁头设计得更精密以及尽量提高盘片旋转速度,就能造出容量更大、读写数据速度更快的硬盘。这是因为盘片表面处理越平、转速越快就能越使磁头离盘片表面越近,提高读、写灵敏度和速度;磁头设计越小越精密就能使磁头在盘片上占用空间越小,使磁头在一张盘片上建立更多的磁道以存储更多的数据。
二、硬盘的逻辑结构。
硬盘由很多盘片 (platter) 组成,每个盘片的每个面都有一个读写磁头。如果有 N 个盘片。就有 2N 个面,对应 2N 个磁头 (Heads) ,从 0 、 1 、 2 开始编号。每个盘片被划分成若干个同心圆磁道 ( 逻辑上的,是不可见的。 ) 每个盘片的划分规则通常是一样的。这样每个盘片的半径均为固定值 R 的同心圆再逻辑上形成了一个以电机主轴为轴的柱面 (Cylinders) ,从外至里编号为 0 、 1 、 2…… 每个盘片上的每个磁道又被划分为几十个扇区 (Sector) ,通常的容量是 512byte ,并按照一定规则编号为 1 、 2 、 3…… 形成 Cylinders×Heads×Sector 个扇区。这三个参数即是硬盘的物理参数。我们下面的很多实践需要深刻理解这三个参数的意义。
硬盘由很多盘片 (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 。
计算机在按下 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 。
你的硬盘的
MBR
引导代码可能并非这样。不过即使不同,所执行的功能大体是一样的。
这是wowocock关于磁盘mbr的反编译
,已加了详细的注释,感兴趣可以细细研究一下。
我们看 DPT 部分。操作系统为了便于用户对磁盘的管理。加入了磁盘分区的概念。即将一块磁盘逻辑划分为几块。磁盘分区数目的多少只受限于 C ~ Z 的英文字母的数目,在上图 DPT 共 64 个字节中如何表示多个分区的属性呢 ?microsoft 通过链接的方法解决了这个问题。在 DPT 共 64 个字节中,以 16 个字节为分区表项单位描述一个分区的属性。也就是说,第一个分区表项描述一个分区的属性,一般为基本分区。第二个分区表项描述除基本分区外的其余空间,一般而言,就是我们所说的扩展分区。这部分的大体说明见表 1 。
我们看 DPT 部分。操作系统为了便于用户对磁盘的管理。加入了磁盘分区的概念。即将一块磁盘逻辑划分为几块。磁盘分区数目的多少只受限于 C ~ Z 的英文字母的数目,在上图 DPT 共 64 个字节中如何表示多个分区的属性呢 ?microsoft 通过链接的方法解决了这个问题。在 DPT 共 64 个字节中,以 16 个字节为分区表项单位描述一个分区的属性。也就是说,第一个分区表项描述一个分区的属性,一般为基本分区。第二个分区表项描述除基本分区外的其余空间,一般而言,就是我们所说的扩展分区。这部分的大体说明见表 1 。
表
1
图
2
分区表第一字段
| |||
字节位移
|
字段长度
|
值
|
字段名和定义
|
0x01BE
|
BYTE
|
0x80
|
引导指示符
(Boot Indicator)
指明该分区是否是活动分区。
|
0x01BF
|
BYTE
|
0x01
|
开始磁头
(Starting Head)
|
0x01C0
|
6
位
|
0x01
|
开始扇区
(Starting Sector)
只用了
0~5
位。后面的两位
(
第
6
位和第
7
位
)
被开始柱面字段所使用
|
0x01C1
|
10
位
|
0x00
|
开始柱面
(Starting Cylinder)
除了开始扇区字段的最后两位外,还使用了
1
位来组成该柱面值。开始柱面是一个
10
位数,最大值为
1023
|
0x01C2
|
BYTE
|
0x07
|
系统
ID(System ID)
定义了分区的类型,详细定义,请参阅图
4
|
0x01C3
|
BYTE
|
0xFE
|
结束磁头
(Ending Head)
|
0x01C4
|
6
位
|
0xFF
|
结束扇区
(Ending Sector)
只使用了
0~5
位。最后两位
(
第
6
、
7
位
)
被结束柱面字段所使用
|
0x01C5
|
10
位
|
0x7B
|
结束柱面
(Ending Cylinder)
除了结束扇区字段最后的两位外,还使用了
1
位,以组成该柱面值。结束柱面是一个
10
位的数,最大值为
1023
|
0x01C6
|
DWORD
|
0x0000003F
|
相对扇区数
(Relative Sectors)
从该磁盘的开始到该分区的开始的位移量,以扇区来计算
|
0x01CA
|
DWORD
|
0x00DAA83D
|
总扇区数
(Total Sectors)
该分区中的扇区总数
|
注:上表中的超过
1
字节的数据都以实际数据显示,就是按高位到地位的方式显示。存储时是按低位到高位存储的。两者表现不同,请仔细看清楚。以后出现的表,图均同。
也可以在
winhex
中看到这些参数的意义:
说明: 每个分区表项占用 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
3.2 扩展分区:
扩展分区中的每个逻辑驱动器都存在一个类似于 MBR 的扩展引导记录 ( Extended Boot Record, EBR) ,也有人称之为虚拟 mbr 或扩展 mbr ,意思是一样的。扩展引导记录包括一个扩展分区表和该扇区的标签。扩展引导记录将记录只包含扩展分区中每个逻辑驱动器的第一个柱面的第一面的信息。一个逻辑驱动器中的引导扇区一般位于相对扇区 32 或 63 。但是,如果磁盘上没有扩展分区,那么就不会有扩展引导记录和逻辑驱动器。第一个逻辑驱动器的扩展分区表中的第一项指向它自身的引导扇区。第二项指向下一个逻辑驱动器的 EBR 。如果不存在进一步的逻辑驱动器,第二项就不会使用,而且被记录成一系列零。如果有附加的逻辑驱动器,那么第二个逻辑驱动器的扩展分区表的第一项会指向它本身的引导扇区。第二个逻辑驱动器的扩展分区表的第二项指向下一个逻辑驱动器的 EBR 。扩展分区表的第三项和第四项永远都不会被使用。
通过一幅 4 分区的磁盘结构图可以看到磁盘的大致组织形式。如图 5 :
关于扩展分区,如图 6 所示,扩展分区中逻辑驱动器的扩展引导记录是一个连接表。该图显示了一个扩展分区上的三个逻辑驱动器,说明了前面的逻辑驱动器和最后一个逻辑驱动器之间在扩展分区表中的差异。
除了扩展分区上最后一个逻辑驱动器外,表 2 中所描述的扩展分区表的格式在每个逻辑驱动器中都是重复的:第一个项标识了逻辑驱动器本身的引导扇区,第二个项标识了下一个逻辑驱动器的 EBR 。最后一个逻辑驱动器的扩展分区表只会列出它本身的分区项。最后一个扩展分区表的第二个项到第四个项被使用。
说明: 每个分区表项占用 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
3.2 扩展分区:
扩展分区中的每个逻辑驱动器都存在一个类似于 MBR 的扩展引导记录 ( Extended Boot Record, EBR) ,也有人称之为虚拟 mbr 或扩展 mbr ,意思是一样的。扩展引导记录包括一个扩展分区表和该扇区的标签。扩展引导记录将记录只包含扩展分区中每个逻辑驱动器的第一个柱面的第一面的信息。一个逻辑驱动器中的引导扇区一般位于相对扇区 32 或 63 。但是,如果磁盘上没有扩展分区,那么就不会有扩展引导记录和逻辑驱动器。第一个逻辑驱动器的扩展分区表中的第一项指向它自身的引导扇区。第二项指向下一个逻辑驱动器的 EBR 。如果不存在进一步的逻辑驱动器,第二项就不会使用,而且被记录成一系列零。如果有附加的逻辑驱动器,那么第二个逻辑驱动器的扩展分区表的第一项会指向它本身的引导扇区。第二个逻辑驱动器的扩展分区表的第二项指向下一个逻辑驱动器的 EBR 。扩展分区表的第三项和第四项永远都不会被使用。
通过一幅 4 分区的磁盘结构图可以看到磁盘的大致组织形式。如图 5 :
关于扩展分区,如图 6 所示,扩展分区中逻辑驱动器的扩展引导记录是一个连接表。该图显示了一个扩展分区上的三个逻辑驱动器,说明了前面的逻辑驱动器和最后一个逻辑驱动器之间在扩展分区表中的差异。
除了扩展分区上最后一个逻辑驱动器外,表 2 中所描述的扩展分区表的格式在每个逻辑驱动器中都是重复的:第一个项标识了逻辑驱动器本身的引导扇区,第二个项标识了下一个逻辑驱动器的 EBR 。最后一个逻辑驱动器的扩展分区表只会列出它本身的分区项。最后一个扩展分区表的第二个项到第四个项被使用。
表
2
扩展分区表项的内容
| |
扩展分区表项
|
分区表项的内容
|
第一个项
|
包括数据的开始地址在内的与扩展分区中当前逻辑驱动器有关的信息
|
第二个项
|
有关扩展分区中的下一个逻辑驱动器的信息,包括包含下一个逻辑驱动器的
EBR
的扇区的地址。如果不存在进一步的逻辑驱动器的话,该字段不会被使用
|
第三个项
|
未用
|
第四个项
|
未用
|
扩展分区表项中的相对扇区数字段所显示的是从扩展分区开始到逻辑驱动器中第一个扇区的位移的字节数。总扇区数字段中的数是指组成该逻辑驱动器的扇区数目。总扇区数字段的值等于从扩展分区表项所定义的引导扇区到逻辑驱动器末尾的扇区数。
有时候在磁盘的末尾会有剩余空间,剩余空间是什么呢?我们前面说到,分区是以
1
柱面的容量为分区粒度的,那么如果磁盘总空间不是整数个柱面的话,不够一个柱面的剩下的空间就是剩余空间了,这部分空间并不参与分区,所以一般无法利用。照道理说,磁盘的物理模式决定了磁盘的总容量就应该是整数个柱面的容量,为什么会有不够一个柱面的空间呢。在我的理解看来,本来现在的磁盘为了更大的利用空间,一般在物理上并不是按照外围的扇区大于里圈的扇区这种管理方式,只是为了与操作系统兼容而抽象出来
CHS
。可能其实际空间容量不一定正好为整数个柱面的容量吧。
数据修复
:
随着计算机技术的发展,计算机在各行各业使用的普及,特别是计算机网络技术出现与应用,计算机的数据安全和数据存储问题也越来越倍受关注。如病毒的破坏、黑客的侵入、有意无意的人为破坏、系统软件与应用软件、共享软件以及硬件之间的使用冲突都有可能造成数据损坏、数据丢失。一旦出现数据损坏、数据丢失,用户往往考虑的是重新录入,但这样做工作量大,多数情况找不到原始硬拷贝,其次用户就是上网找一些共享数据恢复软件进行数据恢复,如果用户不清楚这些共享软件的特性或使用不当,往往会造成数据的第二次破坏性,错过了数据恢复的最佳时机。所以我们建议你找专业数据恢复人士进行数据恢复,即找数据恢复实力比较强的数据恢复公司进行数据恢复,
90%
以上的数据这可以进行恢复的。
计算机硬盘数据丢失分两种情况:物理故障造成数据丢失和逻辑故障造成数据丢失。
硬件故障数据恢复 , 物理故障造成数据丢失的一些现象包括:计算机检测不到硬盘即 CMOS 不认硬盘、常有磁头撞击盘体 “ 咔嚓咔嚓 ” 的声音、电机不转即通电后无任何声音、磁头错位造成读写错误等。产生这些故障的原因有:磁盘划伤、磁组变形、芯片及其它原器件烧坏、断针断线等硬件故障、磁头偏移、磁头损坏、出厂时写入硬盘的参数丢失即固件信息丢失等。
软件故障数据恢复 , 硬盘逻辑故障造成数据丢失包括:误分区、误格式化、误删除、误克隆、 MBR 丢失、 BOOT 扇区丢失、用 PQ 调整分区大小发生错误、病毒破坏、黑客攻击、分区信息丢失、 RAID0 磁盘阵列、 RAID1 磁盘阵列、 RAID5 磁盘阵列失效等引起的数据丢失。
计算机硬盘数据丢失分两种情况:物理故障造成数据丢失和逻辑故障造成数据丢失。
硬件故障数据恢复 , 物理故障造成数据丢失的一些现象包括:计算机检测不到硬盘即 CMOS 不认硬盘、常有磁头撞击盘体 “ 咔嚓咔嚓 ” 的声音、电机不转即通电后无任何声音、磁头错位造成读写错误等。产生这些故障的原因有:磁盘划伤、磁组变形、芯片及其它原器件烧坏、断针断线等硬件故障、磁头偏移、磁头损坏、出厂时写入硬盘的参数丢失即固件信息丢失等。
软件故障数据恢复 , 硬盘逻辑故障造成数据丢失包括:误分区、误格式化、误删除、误克隆、 MBR 丢失、 BOOT 扇区丢失、用 PQ 调整分区大小发生错误、病毒破坏、黑客攻击、分区信息丢失、 RAID0 磁盘阵列、 RAID1 磁盘阵列、 RAID5 磁盘阵列失效等引起的数据丢失。