FAT文件系统原理.docx
- 文档编号:14844526
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:18
- 大小:83.65KB
FAT文件系统原理.docx
《FAT文件系统原理.docx》由会员分享,可在线阅读,更多相关《FAT文件系统原理.docx(18页珍藏版)》请在冰点文库上搜索。
FAT文件系统原理
FAT文件系统原理
1准备知识
1.1硬盘的物理结构:
硬盘存储数据是根据电、磁转换原理实现的。
硬盘由一个或几个表面镀有磁性物质的金属或玻璃等物质盘片以及盘片两面所安装的磁头和相应的控制电路组成(图1),其中盘片和磁头密封在无尘的金属壳中。
硬盘工作时,盘片以设计转速高速旋转,设置在盘片表面的磁头则在电路控制下径向移动到指定位置然后将数据存储或读取出来。
当系统向硬盘写入数据时,磁头中“写数据”电流产生磁场使盘片表面磁性物质状态发生改变,并在写电流磁场消失后仍能保持,这样数据就存储下来了;当系统从硬盘中读数据时,磁头经过盘片指定区域,盘片表面磁场使磁头产生感应电流或线圈阻抗产生变化,经相关电路处理后还原成数据。
1.2硬盘的逻辑结构:
硬盘由很多盘片(platter)组成,每个盘片的每个面都有一个读写磁头。
如果有N个盘片。
就有2N个面,对应2N个磁头(Heads),从0、1、2开始编号。
每个盘片被划分成若干个同心圆磁道(逻辑上的,是不可见的。
)每个盘片的划分规则通常是一样的。
这样每个盘片的半径均为固定值R的同心圆再逻辑上形成了一个以电机主轴为轴的柱面(Cylinders),从外至里编号为0、1、2……每个盘片上的每个磁道又被划分为几十个扇区(Sector),通常的容量是512byte,并按照一定规则编号为1、2、3……形成Cylinders×Heads×Sector个扇区。
这三个参数即是硬盘的物理参数。
1.3磁盘引导原理
1.3.1MBR(masterbootrecord)扇区:
计算机在按下power键以后,开始执行主板bios程序。
进行完一系列检测和配置以后。
开始按bios中设定的系统引导顺序引导系统。
假定现在是硬盘。
Bios执行完自己的程序后如何把执行权交给硬盘呢。
交给硬盘后又执行存储在哪里的程序呢。
其实,称为mbr的一段代码起着举足轻重的作用。
MBR(masterbootrecord),即主引导记录,有时也称主引导扇区。
位于整个硬盘的0柱面0磁头1扇区(可以看作是硬盘的第一个扇区),bios在执行自己固有的程序以后就会jump到mbr中的第一条指令。
将系统的控制权交由mbr来执行。
在总共512byte的主引导记录中,MBR的引导程序占了其中的前446个字节,随后的64个字节为DPT(DiskPartitionTable,硬盘分区表),最后的两个字节“55AA”是分区有效结束标志。
MBR不随操作系统的不同而不同,即不同的操作系统可能会存在相同的MBR,即使不同,MBR也不会夹带操作系统的性质。
具有公共引导的特性。
DPT(DiskPartitionTable)部分,操作系统为了便于用户对磁盘的管理。
加入了磁盘分区的概念。
即将一块磁盘逻辑划分为几块。
磁盘分区数目的多少只受限于C~Z的英文字母的数目,DPT共64个字节中如何表示多个分区的属性呢?
microsoft通过链接的方法解决了这个问题。
在DPT共64个字节中,以16个字节为分区表项单位描述一个分区的属性。
也就是说,第一个分区表项描述一个分区的属性,一般为基本分区。
第二个分区表项描述除基本分区外的其余空间,一般而言,就是我们所说的扩展分区。
1.3.2扩展分区:
扩展分区中的每个逻辑驱动器都存在一个类似于MBR的扩展引导记录(ExtendedBootRecord)EBR,也有称之为虚拟mbr或扩展mbr。
扩展引导记录包括一个扩展分区表和该扇区的标签。
扩展引导记录将记录只包含扩展分区中每个逻辑驱动器的第一个柱面的第一面的信息。
但是,如果磁盘上没有扩展分区,那么就不会有扩展引导记录和逻辑驱动器。
第一个逻辑驱动器的扩展分区表中的第一项指向它自身的引导扇区。
第二项指向下一个逻辑驱动器的EBR。
如果不存在进一步的逻辑驱动器,第二项就不会使用,而且被记录成一系列零。
如果有附加的逻辑驱动器,那么第二个逻辑驱动器的扩展分区表的第一项会指向它本身的引导扇区。
第二个逻辑驱动器的扩展分区表的第二项指向下一个逻辑驱动器的EBR。
扩展分区也可以安装系统并正常启动。
扩展分区表的第三项和第四项永远都不会被使用。
扩展分区表项的内容
扩展分区表项
分区表项的内容
第一个项
包括数据的开始地址在内的与扩展分区中当前逻辑驱动器有关的信息
第二个项
有关扩展分区中的下一个逻辑驱动器的信息,包括包含下一个逻辑驱动器的EBR的扇区的地址。
如果不存在进一步的逻辑驱动器的话,该字段不会被使用
第三个项
未用
第四个项
未用
1.3.3关于DBR:
DBR区(DOSBOOTRECORD)即操作系统引导记录区的意思,通常占用分区的第0扇区共512个字节。
在这512个字节中,其实又是由跳转指令,厂商标志和操作系统版本号,BPB(BIOSParameterBlock),扩展BPB,os引导程序,结束标志几部分组成。
FAT32DBR
FAT32分区上DBR中各部分的位置划分
字节位移
字段长度(字节)
字段名
0x00
3
跳转指令
0x03
8
厂商标志和os版本号
0x0B
53
BPB
0x40
26
扩展BPB
0x5A
420
引导程序代码
0x01FE
2
有效结束标志
FAT16DBR
一个FAT16分区上的引导扇区段
字节位移
字段长度(字节)
字段名称
0x00
3
跳转指令(JumpInstruction)
0x03
8
OEMID
0x0B
25
BPB
0x24
26
扩展BPB
0x3E
448
引导程序代码(BootstrapCode)
0x01FE
4
扇区结束标识符(0x55AA)
1.3.4保留扇区
所谓保留扇区(有时候会叫系统扇区,隐藏扇区),是指从分区DBR扇区开始的仅为系统所有的扇区,包括DBR扇区。
在FAT16文件系统中,保留扇区的数据通常设置为1,即仅仅DBR扇区。
而在FAT32中,保留扇区的数据通常取为32,有时候用PartitionMagic分过的FAT32分区会设置36个保留扇区,有的工具可能会设置63个保留扇区。
操作系统之所以在FAT32中设置保留扇区,是为了对DBR作备份或留待以后升级时用。
FAT32中,DBR偏移0x34占2字节的数据指明了DBR备份扇区所在,一般为0x06,即第6扇区。
当FAT32分区DBR扇区被破坏导致分区无法访问时。
可以用第6扇区的原备份替换第0扇区来找回数据。
2FAT表和数据的存储原则。
FAT表(FileAllocationTable文件分配表),是Microsoft在FAT文件系统中用于磁盘数据(文件)索引和定位引进的一种链式结构。
假如把磁盘比作一本书,FAT表可以认为相当于书中的目录,而文件就是各个章节的内容。
但FAT表的表示方法却与目录有很大的不同。
在FAT文件系统中,文件的存储依照FAT表制定的簇链式数据结构来进行。
同时,FAT文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。
★存储过程假想:
我们模拟对一个分区存储数据的过程来说明FAT文件系统中数据的存储原则。
假定现在有一个空的完全没有存放数据的磁盘,大小为100KB,我们将其想象为线形的空间地址。
为了存储管理上的便利,我们人为的将这100KB的空间均分成100份,每份1KB。
我们来依次存储这样几个文件:
A.TXT(大小10KB),B.TXT(大小53.6KB),C.TXT(大小20.5KB)。
最起码能够想到,我们可以顺序的在这100KB空间中存放这3个文件。
同时不要忘了,我们还要记下他们的大小和开始的位置,这样下次要用时才能找的到,这就像是目录。
为了便于查找,我们假定用第1K的空间来存储他们的特征(属性)。
还有,我们设计的存储单位是1KB,所以,A.TXT我们需要10个存储单位(为了说明方便,我们把存储单位叫做“簇”吧。
也能少打点字,呵呵。
),B.TXT需要54个簇,C.TXT需要21个簇。
可能有人会说B.TXT和C.TXT不是各自浪费了不到1簇的空间吗?
干嘛不让他们紧挨着,不是省地方吗?
我的回答是,如果按照这样的方式存储,目录中原本只需要记下簇号,现在还需要记下簇内的偏移,这样会增加目录的存储量,而且存取没有了规则,读取也不太方便,是得不偿失的。
整个100KB空间
A.TXT
B.TXT
C.TXT
占1簇
占10簇
占54簇
占21簇
剩余14簇
我们再考虑如何来写这三个文件的目录。
对于每个文件而言,一定要记录的有:
文件名,开始簇,大小,创建日期、时间,修改日期、时间,文件的读写属性等。
这里大小能不能用结束簇来计算呢?
一定不能,因为文件的大小不一定就是整数个簇的大小,否则的话像B.TXT的内容就是54KB的内容了,少了固然不行,可多了也是不行的。
那么我们怎么记录呢?
可以想象一下。
为了管理上的方便,我们用数据库的管理方式来管理我们的目录。
于是我把1KB再分成10份,假定开始簇号为0,定义每份100B的各个位置的代表含义
每行100B共10行(这是例子,非Fat系统)
共10行记录
A.TXT
1
10
2004.3.2210:
41
2004.3.2210:
41
只读
有效记录
B.TXT
11
53.6
1949:
10:
112:
0
2003.8.2220:
40
隐藏
C.TXT
65
20.5
2000:
3:
821:
11
2005:
3:
89:
11
系统
。
。
。
内容留空
文件名(占50个字节)
开始簇(占4个字节)
文件大小(占10个字节)
创建日期、时间(占10字节)
修改日期、时间(占10字节)
读写属性(占4字节)
保留(12字节)
这样设计的结构绝对可以对文件进行正确的读写了。
接着让我们设计的文件系统工作吧。
先改动个文件,比如A.TXT,增加点内容吧!
咦?
增加后往哪里放呀,虽然存储块的后面有很多空间,但紧随其后B.TXT的数据还顶着呢?
要是把A.TXT移到后边太浪费处理资源,而且也不一定解决问题。
这个问题看来暂时解决不了。
那我们换个操作,把B.txt删了,b.txt的空间随之释放。
这时候空间如图
整个100KB空间
A.TXT
C.TXT
占1簇
占10簇
空白54簇
占21簇
剩余14簇
图4.3.4 每行100B共10行(这是例子,非Fat系统)
共10行记录
A.TXT
1
10
2004.3.2210:
41
2004.3.2210:
41
只读
C.TXT
65
20.5
2000:
3:
821:
11
2005:
3:
89:
11
系统
。
。
。
内容留空
文件名(占50个字节)
开始簇(占4个字节)
文件大小(占10个字节)
创建日期、时间(占10字节)
修改日期、时间(占10字节)
读写属性(占4字节)
保留(12字节)
这个操作看来还可以,我们接着做,在存入一个文件D.txt(大小为60.3KB),总共100簇的空间只用了31簇,还有68簇剩余,按说能放下。
可是?
往那里放呢?
没有61个连续的空间了,目录行没办法写了。
其实可以这样解决:
首先我们允许文件的不连续存储。
目录中依然只记录开始簇和文件的大小。
那么我们怎么记录文件占用那些簇呢,以文件映射簇不太方便,因为文件名是不固定的。
我们换个思想,可以用簇来映射文件,在整个存储空间的前部留下几簇来记录数据区中数据与簇号的关系。
对于上例因为总空间也不大,所以用前部的1Kb的空间来记录这种对应,假设3个文件都存储,空间分配如图,同时修改一下目录,
整个100KB空间
文件分配表
A.TXT
B.TXT
C.TXT
第0簇
第1簇
第2~11簇
第12~65簇
第66~86簇
第87~99簇
每行100B共10行(这是例子,非Fat系统)
共10行记录
A.TXT
2
10
2004.3.2210:
41
2004.3.2210:
41
只读
有效记录
B.TXT
12
53.6
1949:
10:
112:
0
2003.8.2220:
40
隐藏
C.TXT
66
20.5
2000:
3:
821:
11
2005:
3:
89:
11
系统
。
。
。
内容留空
文件名(占50个字节)
开始簇(占4个字节)
文件大小(占10个字节)
创建日期、时间(占10字节)
修改日期、时间(占10字节)
读写属性(占4字节)
保留(12字节)
第一簇用来记录数据区中每一簇的被占用情况,暂时称其为文件分配表。
结合文件分配表和文件目录就可以达到完全的文件读取了。
我们想到,把文件分配表做成一个数据表。
文件分配表
簇号
1
2
3
...
11
12
13
...
65
66
67
...
86
87
...
99
对应
A.TXT
(1)
A.TXT
(2)
...
A.TXT(10)
B.TXT
(1)
B.TXT
(2)
...
B.TXT(54)
C.TXT
(1)
C.TXT
(2)
...
C.TXT(21)
...
用上图的组织方式是完全可以实现对文件占有簇的记录的。
但还不够效率。
比如文件名在文件分配表中记录太多,浪费空间,而实际上在目录中已经记录了文件的开始簇了。
所以可以改良一下,用链的方式来存放占有簇的关系,变成下图的组织方式。
文件分配表
簇号
1
2
3
...
11
12
13
...
65
66
67
...
86
87
...
99
对应
3
4
...
FF
13
14
...
FF
67
68
...
FF
0O
...
0O
我们再看上面提到的第三种情况,就是将b.txt删除以后,存入一个大小为60.3KB的d.txt。
利用簇链可以很容易的实现。
整个100KB空间划分
文件分配表
A.TXT
D.TXT
C.TXT
D.TXT
空
第0簇
第1簇
第2~11簇
第12~65簇
第66~86簇
第87~93簇
第94~99簇
文件分配表
簇号
1
2
3
...
11
12
13
...
65
66
67
...
86
87
88
...
93
94
...
99
对应数据
3
4
...
FF
13
14
...
87
67
68
...
FF
88
89
...
FF
00
...
00
★FAT16存储原理:
当把一部分磁盘空间格式化为fat文件系统时,fat文件系统就将这个分区当成整块可分配的区域进行规划,以便于数据的存储。
一般来讲,其划分形式如图7所示。
我们把FAT16部分提取出来,详细描述一下:
FAT16是Microsoft较早推出的文件系统,具有高度兼容性,目前仍然广泛应用于个人电脑尤其是移动存储设备中,FAT16简单来讲由6部分组成(主要是前5部分)。
引导扇区(DBR)我们已经说过,FAT16在DBR之后没有留有任何保留扇区,其后紧随的便是FAT表。
FAT表是FAT16用来记录磁盘数据区簇链结构的。
像前面我们说过的例子一样,FAT将磁盘空间按一定数目的扇区为单位进行划分,这样的单位称为簇。
通常情况下,每扇区512字节的原则是不变的。
簇的大小一般是2n(n为整数)个扇区的大小,像512B、1K、2K、4K、8K、16K、32K、64K。
实际中通常不超过32K。
之所以簇为单位而不以扇区为单位进行磁盘的分配,是因为当分区容量较大时,采用大小为512b的扇区管理会增加fat表的项数,对大文件存取增加消耗,文件系统效率不高。
分区的大小和簇的取值是有关系的,见表
FAT16分区大小与对因簇大小
分区空间大小
每个簇的扇区
簇空间大小
0MB-32MB
1
512个字节
33MB-64MB
2
1k
65MB-128MB
4
2k
129MB-225MB
8
4k
256MB-511MB
16
8k
512MB-1023MB
32
16k
1024MB-2047MB
64
32k
2048MB-4095MB
128
64k
看一幅在winhex所截FAT16的文件分配表
FAT表以"F8FFFFFF"开头,此2字节为介质描述单元,并不参与FAT表簇链关系。
小红字标出的是FAT扇区每2字节对应的簇号。
不管目录文件所占空间为多少簇,一簇为多少字节。
系统都会以32个字节为单位进行目录文件所占簇的分配。
这32个字节以确定的偏移来定义本目录下的一个文件(或文件夹)的属性,实际上是一个简单的二维表。
这32个字节的各字节偏移定义如下表:
FAT16目录项32个字节的表示定义
字节偏移(16进制)
字节数
定义
0x0~0x7
8
文件名
0x8~0xA
3
扩展名
0xB
1
属性字节
00000000(读写)
00000001(只读)
00000010(隐藏)
00000100(系统)
00001000(卷标)
00010000(子目录)
00100000(归档)
0xC~0x15
10
系统保留
0x16~0x17
2
文件的最近修改时间
0x18~0x19
2
文件的最近修改日期
0x1A~0x1B
2
表示文件的首簇号
0x1C~0x1F
4
表示文件的长度
★FAT32存储原理:
FAT32是个非常有功劳的文件系统,Microsoft成功地设计并运用了它,直到今天NTFS铺天盖地袭来的时候,FAT32依然占据着MicrosoftWindows文件系统中重要的地位。
FAT32最早是出于FAT16不支持大分区、单位簇容量大以致空间急剧浪费等缺点设计的。
实际应用中,FAT32还是成功的。
FAT32与FAT16的原理基本上是相同的,如图为FAT32分区的基本构成
Fat32的组织形式
引导扇区
其余保留扇区
FAT1
FAT2(重复的)
根文件夹首簇
其他文件夹及所有文件
剩余扇区
1扇区
31个扇区
实际情况取大小
同FAT1
第2簇
不足一簇
保留扇区
┗━━━━━━━━数据区━━━━━━━━┛
FAT32的文件分配表的数据结构依然和FAT16相同,所不同的是,FAT32将记录簇链的二进制位数扩展到了32位,故而这种文件系统称为FAT32。
理论最大簇数目=2^28=268435450(由于FAT表中登记项的32位值中高4位为保留,即总是0。
),理论分区最大容量=32KB*268435450=8TB。
但实际中FAT32是不能寻址这样大的空间的,随着分区空间大小的增加,FAT表的记录数会变得臃肿不堪,严重影响系统的性能。
所以在实际中通常不格式化超过32GB的FAT32分区。
WIN2000及之上的OS已经不直接支持对超过32GB的分区格式化成FAT32,但WIN98依然可以格式化大到127GB的FAT32分区,但这样没必要也不推荐。
同时FAT32也有小的限制,FAT32卷必须至少有65527个簇,所以对于小的分区,仍然需要使用FAT16或FAT12。
FAT32分区大小与对因簇大小
分区空间大小
每个簇的扇区
簇空间大小
<8GB
8
4k
>=8GB且<16GB
16
8k
>=16GB且<32GB
32
16k
>=32GB
64
32k
FAT32对簇的编号依然同FAT16。
顺序上第1个簇仍然编号为第2簇,通常为根目录所用(这和FAT16是不同的,FAT16的根目录并不占簇区空间,32个扇区的根目录以后才是簇区第1个簇)
FAT32的文件寻址方法与FAT16相同,但目录项的各字节参数意义却与FAT16有所不同,一方面它启用了FAT16中的目录项保留字段,同时又完全支持长文件名了。
对于短文件格式的目录项。
其参数意义见下表:
FAT32短文件目录项32个字节的表示定义
字节偏移(16进制)
字节数
定义
0x0~0x7
8
文件名
0x8~0xA
3
扩展名
0xB*
1
属性字节
00000000(读写)
00000001(只读)
00000010(隐藏)
00000100(系统)
00001000(卷标)
00010000(子目录)
00100000(归档)
0xC
1
系统保留
0xD
1
创建时间的10毫秒位
0xE~0xF
2
文件创建时间
0x10~0x11
2
文件创建日期
0x12~0x13
2
文件最后访问日期
0x14~0x15
2
文件起始簇号的高16位
0x16~0x17
2
文件的最近修改时间
0x18~0x19
2
文件的最近修改日期
0x1A~0x1B
2
文件起始簇号的低16位
0x1C~0x1F
4
表示文件的长度
说明:
(1)、这是FAT32短文件格式目录项的意义。
其中文件名、扩展名、时间、日期的算法和FAT16时相同的。
(2)、由于FAT32可寻址的簇号到了32位二进制数。
所以系统在记录文件(文件夹)开始簇地址的时候也需要32位来记录,FAT32启用目录项偏移0x12~0x13来表示起始簇号的高16位。
(3)、文件长度依然用4个字节表示,这说明FAT32依然只支持小于4GB的文件(目录),超过4GB的文件(目录),系统会截断处理。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FAT 文件系统 原理