1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 与NTFS文件系统相关的MBR和DBR的简单分析+解析DBR操作系统引导记录数据

与NTFS文件系统相关的MBR和DBR的简单分析+解析DBR操作系统引导记录数据

时间:2020-12-02 23:54:18

相关推荐

与NTFS文件系统相关的MBR和DBR的简单分析+解析DBR操作系统引导记录数据

-04-29 18:03:00sxjin

本文描述windows系统下已经确定文件系统下的磁盘主引导扇区,文件系统为NTFS。其他操作系统下是否完全相同,暂时不知。

MBR以及DBR扇区分析

1 MBR

MBR全称为Master Boot Record,俗称为主引导扇区。它是系统运行时第一块加载到内存中的扇区,其结构为:引导程序、磁盘签名、主分区信息和结束标记。每一部分在MBR中所占的位置如下图:

图1 MBR扇区结构

黑框内为引导程序,绿色框内为磁盘签名,红色框内为结束标志。引导程序不是我们感兴趣的不做分析。

磁盘签名在上图中标记占用了6B,但是实际上磁盘签名仅仅占用了前4个字节。磁盘签名的作用是说明当前物理磁盘已经完成了格式化和分区,如果磁盘签名为空,即4个字节的数据全部为00,那么说明磁盘尚没有完成初始化,操作系统无法识别和加载,从而导致系统崩溃。如果我们连续两次对物理磁盘进行格式化,那么每次格式化得到的磁盘签名是不相投的。

结束标志,结束标志的值始终是55 AA,占用2个字节。如果结束标志不是55 AA,那么在系统加载磁盘时候会报错。

在磁盘签名和结束标志之间是当前物理磁盘的分区信息。众所周知,通过操作系统界面,我们看到的磁盘分区有好多个。如果你通过管理界面查看分区信息,会看到有的磁盘分区是主分区,有些磁盘分区是扩展分区。之所以有这些差别,其原因就在这里。在MBR中每个分区记录占用16个字节,所以在仅仅占用64个字节中包含所有的磁盘分区信息是不肯能的。在MBR中最多包含4个分区的信息,而这4个分区称之为主分区;不在MBR中的分区信息称之为扩展分区。第一个扩展分区的位置信息在MBR中最有一个分区记录中表示。下面对分区记录中每个字节所代表的意义进行分析和阐述。

我们对图1中的第一条分区记录和最后一条分区记录进行分析,之所与选择这两条记录,原因是:当前物理磁盘总共划分了8个分区,第一条记录是普通的一条主分区记录,最后一个分区记录包含了扩展分区信息所在位置等信息。

第一条分区记录是:80 6B 10 00 07 86 0E 30 00 80 00 00 00 20 03 00

最后一条分区记录是:00 86 CE FF 0F 86 CE FF B1 A1 A9 03 60 10 6E 21

为了更加直观和清晰的表示每个字节所代表的意义,采用列表方式,如下表

偏移量

长度

意义

1BE

80

1B

引导标志,指明该分区是否为活动分区

1BF

6B

1B

开始磁头

1C0

10

6b

起始扇区,并且只是用了“10”字节中的0~5位,后面两位6、7用于起始柱面

1C1

00

10b

该字节的8为加上10字节中的后两位,总共8为表示该分区起始柱面

1C2

07

1B

表示分区类型,该条记录表示是分区本身文件系统类型或者分区是否为扩展分区(即该记录指向扩展分区信息所在扇区)

1C3

86

1B

该分区的结束磁头

1C4

0E

6b

结束扇区,同起始扇区类似,只占用当前字节中的0~5为,后面6、7位用于结束柱面

1C5

30

10b

结束柱面,共10为,包括本字节的八位和上一个字节的6、7两位

1C6

00 80 00 00

4B

偏移扇区,即当前扇区到分区起始扇区的距离(单位:扇区)

1C9

00 20 03 00

4B

分区所拥有的总扇区数

表1分区记录字节意义表

(如果字段长度超过一个字节,那么该字段代表的数值是按照由左到右有地位到高位)

表1是以分区记录中的第一条记录为例进行说明其意义的。如果我们将最后一条分区记录的数据按照表1进行分析,分区类型为0F,查找分区类型表可知为扩展分区(windows 95 Extended大于8GB)。由于分区类型表比较大,所以在这里对分区类型不进行详细列举。如果分区类型为0F,那么偏移扇区为第一扩展分区信息所在扇区的偏移量,而总扇区数表示所有扩展分区拥有的扇区数目累加和。

下图扩展分区信息所在的扇区数据

图2扩展分区分区记录所在扇区数据

在扩展分区的分区记录所在扇区,除最后两字节为结束标记以及两条分区记录外,其他位置的值是不确定的。图2中黑色方框内的数据为当前扩展分区的分区记录信息,红色方框内的数据时下一扩展分区的分区记录信息。如果当前扩展分区为最后一个扩展分区,那么红色方框内的数据为00。扩展分区记录的数据结构与MBR中分区记录的数据结构相同,所以在此不再累赘介绍,具体字节意义请参照表1

2 DBR

DBR全称为Driver Boot Record,俗称分区引导扇区。在DBR中包含分区引导程序、分区信息记录,比如文件$MFT起始簇、跳转代码、OEM、结束标志等信息。下图为DBR扇区数据:

图3 DBR扇区数据分布情况

上图为DBR所在扇区分布情况。DBR扇区总共有五部分数据组成,即跳转程序,绿色方框内的数据,共占3B;OEM代号,浅绿色方框内,共占8B;BPB数据,红色方框内,共占73B;引导程序,红色方框和黑色方框之间数据,共占426B;结束标志,黑色方框内,数值为55 AA,占用2B。其中OEM代号的值与系统厂商有关,这里不做具体分析,由厂方设置其值。在本文中,分析的重点为BPB,具体如下所述。

BPB在DBR整个扇区的的起始地址为0X0B,共73个字节,并且包含了丰富的关于当前分区的信息。我们以图3为例,对BPB进行详细分析,具体如下表:

偏移量

字段值

字段长

字段意义

0X0B

00 02

2B

每个扇区字节数目

0x0D

08

1B

每个簇所拥有扇区数

0X0E

00 00

2B

保留扇区(在NTFS中无用)

0x10

00 00 00

3B

无意义

0X13

00 00

2B

NTFS未使用

0X15

F8

1B

介质描述,F8代表硬盘,

0x16

00 00

2B

总为0

0x18

13 00

2B

每个磁道扇区数

0X1A

E0 00

2B

磁头数,是逻辑C/H/S中的一个参数,一般为FF,NTFS中已经不使用了。

0X1C

B0 04 00 00

4B

隐藏扇区数,即MBR分区到当前DBR分区的扇区总数。

0X20

00 00 00 00

4B

NTFS未使用

0X24

80 00 80 00

4B

NTFS未使用

0x28

FF 5F EF 07 00 00 00 00

8B

扇区总数

0x30

00 00 0C 00 00 00 00 00

8B

$MFT文件起始簇号

0x38

02 00 00 00 00 00 00 00

8B

$MFTMirr文件起始簇号

0x40

F6

1B

文件记录大小描述,该字节待用符号,当其为负数时,说明每个文件记录的大小要小于每个簇的扇区数,计算方法为2-1X每个文件记录的簇树。

0x41

00 00 00

3B

未用

0X44

01

1B

索引缓冲区的大小描述,该字节与文件记录大小描述以及其计算方法相同。

0X45

00 00 00

3B

未用

0X48

BE 6B 50 4C B1 50 4C 78

8B

卷序列号

0X50

00 00 00 00

4B

校验和

表2 DBR扇区中BPB字段分析表

表2中提到簇的概念,所谓的簇是指文件系统划分的以若干个扇区为单位,一个簇至少包含1个扇区。在对文件分配空间或者文件预读取等,文件系统可以以簇为单位,来减少磁盘碎片和减少磁盘操作次数等。在BPB中,我们可以获取分区许多信息,比如磁盘大小、簇大小、$MFT文件起始位置、索引缓冲区大小等等,而这些信息也是我们以后分析$MFT文件记录和读取文件等操作所必须的信息。

解析DBR操作系统引导记录数据

-08-07 18:13:49细粉条阅读数 3468更多

分类专栏:文件系统

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

本文链接:/liyun123gx/article/details/38421837

要想了解文件系统,不得不熟悉DBR,下面我们一起来解析一下文件系统DBR中的数据。

Dos Boot Record(DBR)操作系统引导记录是由操作系统的格式化程序建立的,在文件系统驱动操作任何一个磁盘卷时,这一部分的信息将被读取并作为文件系统在这个磁盘卷上的参数被使用。它包含了有效的引导程序、厂商标志、BPB数据块等。

1.那么怎么得到DBR呢?它位于分区的第一个扇区。而分区的地址可以从磁盘的第一个分区的分区表项中获得。

具体可参考/liyun123gx/article/details/38420665

2.分析本扇区数据

下面是一个FAT文件系统的DBR的信息

(注意 数据以小端格式存储的)

0x01~0x02: 3个字节,跳转指令。跳转到DBR后面一点的引导程序处。引导程序是一段用来加载真正操作系统的程序。

0x03~0xA: 8个字节,OEM串。本例中是MSDOC5.0

0X0B~0X0C: 2个字节,每扇区的字节数。本例是0X0200,512

0X0D 1个字节,每簇的扇区数。本例是0x8

0X0E~0X0F: 2个字节,保留扇区数。本例是0x0026

0X10: 1个字节,FAT表个数。本例是0x02

0X11~0X12: 2个字节,根目录最多可容纳的目录项数。FAT12和FAT16通常为512,FAT32不使用此值,为0.本例中是FAT32,所以为0.

0X13~0X14: 2个字节,扇区总数。小于32MB时使用该处存放,超过32MB的使用偏移0x20~-x23字节处的4字节存放。本例中磁盘为7G多,故为0.

0X15:1个字节,介质描述。本例中0XF8表示本地硬盘。

0X16~0X17: 2个字节,每个FAT表的扇区数。同样,FAT32不使用,为0.

0X18~0X19: 2个字节,每个磁道的扇区数。本例是0X3F,63

0X1A~0X1B: 2个字节,磁头数。本例是0XFF,255

0X1C~0X1F: 4个字节,分区前已经使用的扇区数,隐藏扇区数。本例是 0X 00 00 00 3F,63

0X20~0X23: 4个字节,文件系统扇区数。本例是 0X00 EA 58 78,15358072

0X24~0X27: 4个字节,每个FAT表的扇区数。本例是 0X00 00 3A 79,14969

0X28~0X29: 2个字节,标记。

0x2A~0x2B: 2个字节,版本号。

0x2C~0x2F: 4个字节,根目录簇号,2。(虽然在FAT32文件系统下,根目录可以存放在数据区的任何位置,但是通常情况下还是起始于2号簇)

0x30~0x31: 2个字节,FSINFO(文件系统信息扇区)扇区号,1。该扇区为操作系统提供关于空簇总数及下一可用簇的信息。

0x32~0x33: 2个字节,备份引导扇区的位置,6。备份引导扇区总是位于文件系统的6号扇区。

0x34~0x3F: 12个字节,未使用。

0x40~0x40: 1个字节,BIOS INT 13H 设备号,0x80。

0x41~0x41: 1个字节,未用。

0x42~0x42: 1个字节,扩展引导标志。0x29。

0x43~0x46: 1个字节,卷序列号。通常为一个随机值。

0x47~0x51: 11个字节,卷标(ASCII码),如果建立文件系统的时候指定了卷标,会保存在此。本例中是NO NAME

0x52~0x59: 8个字节,文件系统格式的ASCII码,FAT32。

0x5A~0x1FD: 410个字节,未使用。该部分没有明确的用途。

0x1FE~0x1FF: 签名标志“55 AA”。

3.FSINFO信息扇区

FSINFO一般位于文件系统的1号扇区,就是DBR的下一个扇区。它用来记录文件系统中空闲簇的数量以及下一可用簇的簇号等信息。

下面介绍一下FSINFO的结构

0x00~0x03:4个字节,扩展引导标志“52526141”。

0x04~0x1E3: 480个字节,未使用,全部置0。

0x1E4~0x1E7: 4个字节,FSINFO签名“72724161”。

0x1E8~0x1EB: 4个字节,文件系统的空簇数,41207688(0x00 12 6D 88)。

0x1EC~0x1EF: 4个字节,下一可用簇号,663(0x00 00 02 97)。

0x1F0~0x1FD: 14个字节,未使用。

0x1FE~0x1FF: 2个字节,“55 AA”标志。

注意:通常情况下,文件系统的2号扇区结尾也会被设置“55 AA”标志。6号扇区也会有一个引导扇区的备份,相应的,7号扇区应该是一个备份FSINFO信息扇区。8号扇区可以看做是2号扇区的备份,它的结尾也会有一个“55 AA”标志。

4.下面是一个NTFS文件系统的DBR

0x01~0x02: 3个字节,跳转指令。

0x03~0xA: 8个字节,文件系统的字符串。本例中是NTFS

0X0B~0X0C: 2个字节,每扇区的字节数。本例是0X0200,512

0X0D 1个字节,每簇的扇区数。本例是0x8

0X0E~0X0F: 2个字节,保留扇区数。本例是0x0000

0X10~0X13: 4个字节,未使用

0X15:1个字节,介质描述。本例中0XF8表示本地硬盘。

0X16~0X17: 2个字节,总为0.

0X18~0X19: 2个字节,每个磁道的扇区数。本例是0X3F,63

0X1A~0X1B: 2个字节,每个柱面的磁头数。本例是0XFF,255

0X1C~0X1F: 4个字节,隐含扇区数。本例是 0X 0C 81 98 00,209819648

0X20~0X23: 4个字节,未使用

0X24~0X27: 4个字节,未使用,一般都为0X80 00 80 00

0X28~0X2F: 8个字节,该分区的扇区数。本例为0X00 00 00 00 19 01 8F FF,419532799

0x30~0x37: 8个字节,$MFT的起始逻辑簇号。本例为0X00 00 00 00 00 0C 00 00

0x38~0x3F: 8个字节,$MFTMirr(MFT文件的镜像文件)的起始逻辑簇号。本例为0X00 00 00 00 00 00 00 02

0x40~0x43: 4个字节,每个MFT记录所占的簇数。本例中为0XF6 00 00 00

0x44~0x47: 4个字节,每索引簇数,通常每索引簇数为1个簇。本例为0X00 00 00 01

0x48~0x4F: 8个字节,分区的逻辑序列号,这个序列号是硬盘格式化时随机产生的。本例为0X14 A2 8F A3 A2 8F 87 C6

0x50~0x53: 4个字节,校验和。为0X00 00 00 00 00

0x54~0x1FD: 426个字节,自举代码

0x1FE~0x1FF: 结束标志

SD卡中FAT32文件格式快速入门(图文详细介绍)

-05-09 11:52:21TomiTwo阅读数 112123文章标签:FAT32格式分析FAT32格式详解更多

分类专栏:嵌入式Wince硬件电路

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

本文链接:/mjx91282041/article/details/8904705

说明:

MBR:MasterBootRecord(主引导记录)

DBR:DOSBootRecord(引导扇区)

FAT:FileAllocationTable(文件分配表)

硬件:本文SD卡为Kingston4GB,FAT32格式,簇大小4KB,每扇区512字节。

SD Specification Standards:/downloads/pls/

第一章硬盘结构与SD卡结构

1.1硬盘介绍

1.1硬盘结构

如果你熟悉硬盘结构跳过本节。下图是硬盘的结构,如果你只是为了学习SD卡FAT32文件系统的话,这里你只需要注意硬盘排序结构:主引导记录(MBR)—引导扇区—数据—引导扇区—数据。

图1

1.2MBR分析

MBR(MainBootRecord主引导记录区)放置在硬盘物理地址0的地方。总共512字节的主引导扇区中,MBR只占用了其中的446个字节,另外64个字节交给了DPT(DiskPartitionTable硬盘分区表),最后两个字节“55,AA”是分区的结束标志。DPT由4个分区表组成,每个16字节。下图中以以硬盘的MBR图,粉红色为硬盘分区表。

图2

对于我们来说,更关注硬盘分区表表中红色区域:下图为硬盘分区表详细说明 。如果要对SD卡、U盘等分多个区,DPT的内容就表示各个区的偏移地址和大小。

起始地址

字节数

描述

0x1BE

1

可引导标志,0x00不可引导,0x80可引导

0x1BF~0x1C1

3

分区起始CHS地址(CHS=磁头、柱面、扇区),起始地址

0x1C2

1

分区类型

0x1C3~0x1C5

3

分区结束CHS地址

0x1C6

4

从磁盘开始到该分区开始的偏移量(分区起始LBA地址Little-endian顺序)

0x1CA

4

总扇区数(Little-endian顺序)

图3

SD结构

SD卡没有分区,默认就是一个分区。首先用WinHex文件打开SD所在的盘符,显示如下图:

图4

①非分区空间(红线所示):起始扇区0,我认为这个分区就是硬盘上的MBR所在区域,

打开后如下图所示,也可以称为SD卡的MBR区域。

图5

根据表1知道:

红线区域(00002000)为下个分区的扇区地址,即第8192扇区,见图3分区1的起始扇区。

蓝线区域(00760C00)为SD卡总的扇区个数,我们可以计算一下:

0x760C00*512(每扇区字节)=3960995840(字节),与实际大小基本一样。

②分区1(蓝线所示):起始扇区8192.

③剩余扇区:才疏学浅,我不知道干嘛的,呵呵

1.3SD卡存储结构

由此可知SD卡文件系统并不是处在整个SD卡最开始的地方,它处在MBR所处的保留区之后,于是我们可以对使用FAT32文件系统的SD卡整体布局给出如下图示。

图6

第二章

2.1FAT文件系统简介

FAT(FileAllocationTable,文件分配表)文件系统是windows操作系统所使用的一种文件系统,它的发展过程经历了FAT12、FAT16、FAT32三个阶段。FAT文件系统用“簇”作为数据单元。一个“簇”由一组连续的扇区组成,簇所含的扇区数必须是2的整数次幂。簇的最大值为64个扇区,即32KB。所有簇从2开始进行编号,每个簇都有一个自己的地址编号。用户文件和目录都存储在簇中。本文每簇4KB大小。

FAT文件系统的数据结构中有两个重要的结构:文件分配表和目录项:

文件分配表:文件和文件夹内容储存在簇中,如果一个文件或文件夹需要多余一个簇的空间,则用FAT表来描述,如何找到另外的簇。FAT结构用于指出文件的下一个簇,同时也说明了簇的分配状态。FAT12、FAT16、FAT32这三种文件系统之间的主要区别在与FAT项的大小不同。

目录项:FAT文件系统的每一个文件和文件夹都被分配到一个目录项,目录项中记录着文件名、大小、文件内容起始地址以及其他一些元数据。

在FAT文件系统中,文件系统的数据记录在“引导扇区中(DBR)”中。引导扇区位于整个文件系统的0号扇区,是文件系统隐藏区域(也称为保留区)的一部分,我们称其为DBR(DOSBootRecorder——DOS引导记录)扇区,DBR中记录着文件系统的起始位置、大小、FAT表个数及大小等相关信息。在FAT文件系统中,同时使用“扇区地址”和“簇地址”两种地址管理方式。这是因为只有存储用户

数据的数据区使用簇进行管理(FAT12和FAT16的根目录除外),所有簇都位于数据区。其他文件系统管理数据区域是不以簇进行管理的,这部分区域使用扇区地址进行管理。文件系统的起始扇区为0号扇区。

2.2FAT32文件系统结构

FAT文件系统整体分布如上图存储器文件结构图所示,有:

【1深绿色】保留区含有一个重要的数据结构——系统引导扇区(DBR)。FAT12、FAT16的保留区通常只有一个扇区,而FAT32的保留扇区要多一些,除0号扇区外,还有其他一些扇区,其中包括了DBR的备份扇区。

【2黄色】FAT区由来年各个大小相等的FAT表组成——FAT1、FAT2,FAT2紧跟在FAT1之后。

【3灰色】FAT12、FAT16的根目录虽然也属于数据区,但是他们并不由簇进行管理。也就是说FAT12、FAT16的根目录是没有簇号的,他们的2号簇从根目录之后开始。而FAT32的根目录通常位于2号簇。

2.2.1保留区(深绿色区域)

FAT32文件系统的开始部分有一个由若干个扇区组成的保留区,保留区的大小会记录在DBR扇区中,比较常见的为32、34或38个扇区。如上图:由DBR中)0x0e和0x0f两个地址的数值决定,记得是小端模式,即N的值。

2.2.1.1引导扇区(DBR)

【大小】:512字节;

对读写FAT文件系统来说常用的就图中红色划线部分,48个字节。其他的均为一些标注信息。想了解具体的定义请看附录表。

图7

【1】0x00~0x02:3字节,跳转指令。

【2】0x03~0x0A:8字节,文件系统标志和版本号,这里为MSDOC5.0。

【3】0x0B~0x0C:2字节,每扇区字节数,512(0X0200)。

【4】0x0D~0x0D:1字节,每簇扇区数,8(0x08)。

【5】0x0E~0x0F:2字节,保留扇区数,38(0x0026),符合FAT1起始地址为38扇区。

【6】0x10~0x10:1字节,FAT表个数,2。

【7】0x11~0x12:2字节,FAT32必须等于0,FAT12/FAT16为根目录中目录的个数;

【8】0x13~0x14:2字节,FAT32必须等于0,FAT12/FAT16为扇区总数。

【9】0x15~0x15:1字节,哪种存储介质,0xF8标准值,可移动存储介质,常用的0xF0。

【10】0x16~0x17:2字节,FAT32必须为0,FAT12/FAT16为一个FAT表所占的扇区数。

【11】0x18~0x19:2字节,每磁道扇区数,只对于有“特殊形状”(由磁头和柱面每 分割为若干磁道)的存储介质有效,63(0x003F)。

【12】0x1A~0x1B:2字节,磁头数,只对特殊的介质才有效,255(0x00FF)。

【13】0x1C~0x1F:4字节,EBR分区之前所隐藏的扇区数,8192(0x00002000),与MBR中地址0x1C6开始的4个字节数值相等。

【14】0x20~0x23:4字节,文件系统总扇区数,7736320(0x00760C00),7736320* 512=3960995840≈3.67GB。

【15】0x24~0x27:4字节,每个FAT表占用扇区数,7541(0x00001D75)。

【16】0x28~0x29:2字节,标记,此域FAT32特有。

【17】0x2A~0x2B:2字节,FAT32版本号0.0,FAT32特有。

【18】0x2C~0x2F:4字节,根目录所在第一个簇的簇号,2。(虽然在FAT32文件系统 下,根目录可以存放在数据区的任何位置,但是通常情况下还是起始于2号簇)

【19】0x30~0x31:2字节,FSINFO(文件系统信息扇区)扇区号1,该扇区为操作 系统提供关于空簇总数及下一可用簇的信息。

【20】0x32~0x33:2字节,备份引导扇区的位置。备份引导扇区总是位于文件系统 的6号扇区。

【21】0x34~0x3F:12字节,用于以后FAT扩展使用。

【22】0x40~0x40:1字节,与FAT12/16的定义相同,只不过两者位于启动扇区不

同的位置而已。

【23】0x41~0x41:1字节,与FAT12/16的定义相同,只不过两者位于启动扇区不

同的位置而已。

【24】0x42~0x42:1字节,扩展引导标志,0x29。与FAT12/16的定义相同,只不过 两者位于启动扇区不同的位置而已

【25】0x43~0x46:4字节,卷序列号。通常为一个随机值。

【26】0x47~0x51:11字节,卷标(ASCII码),如果建立文件系统的时候指定了卷 标,会保存在此。

【27】0x52~0x59:8字节,文件系统格式的ASCII码,FAT32。

★【28】0x5A~0x1FD:90~509共420字节,未使用。该部分没有明确的用途。

【29】0x1FE~0x1FF:签名标志“55AA”。

★说明:引导代码

FAT文件系统将引导代码与文件形同数据结构融合在一起,FAT32文件系统引导扇区的512字节中,90~509字节为引导代码,而FAT12/16则是62~509字节为引导代码。同时,FAT32还可以利用引导扇区后的扇区空间存放附加的引导代码。一个FAT卷即使不是可引导文件文件系统,也会存在引导代码。

2.2.1.2FSInfo信息分区

FAT32在保留区中增加了一个FSINFO扇区,用以记录文件系统中空闲簇的数量以及下一可用簇的簇号等信息,以供操作系统作为参考。FSINFO信息扇区一般位于文件系统的1号扇区,结构非常简单。FSINFO信息扇区结构。

图8

【1】0x00~0x03:4个字节,扩展引导标志“0x52526141”。

【2】0x04~0x1E3:480个字节,未使用,全部置0。

【3】0x1E4~0x1E7:4个字节,FSINFO签名“0x72724161”。

【4】0x1E8~0x1EB:4个字节,文件系统的空簇数,964466(0x000EB772)。

【5】0x1EC~0x1EF:4个字节,下一可用簇号(0x00000015)。

【6】0x1F0~0x1FD:14个字节,未使用。

【7】0x1FE~0x1FF:2个字节,“55AA”标志。

温馨提示:通常情况下,文件系统的2号扇区结尾也会被设置“55AA”标志。6号扇区也会有一个引导扇区的备份,相应的,7号扇区应该是一个备份FSINFO信息扇区,8号扇区可以看做是2号扇区的备份。

2.2.2文件分区FAT表(黄色区域)

紧跟在保留分区后面的是FAT区,其由两个完全相同的FAT(FileAllocationTable,文件分配表)表单组成,FAT文件系统的名字也是因此而来。FAT表(FileAlloacationTable)是一组与数据簇号对应的列表。FAT2紧跟在FAT1之后,它的位置可以通过FAT1的位置加上FAT表的大小扇区数计算出来。

2.2.2.1文件系统概述

文件系统分配磁盘空间按簇来分配。因此,文件占有磁盘空间时,基本单位不是字节而是簇,即使某个文件只有一个字节,操作系统也会给它分配一个最小单元:即一个簇。对于大文件,需要分配多个簇。同一个文件的数据并不一定完整地存放在磁盘中一个连续地区域内,而往往会分若干段,像链子一样存放。这种存储方式称为文件的链式存储。为了实现文件的链式存储,文件系统必须准确地记录哪些簇已经被文件占用,还必须为每个已经占用的簇指明存储后继的下一个簇的簇号,对于文件的最后一簇,则要指明本簇无后继簇。这些都是由FAT表来保存的,FAT表对应表项中记录着它所代表的簇的有关信息:诸如是空,是不是坏簇,是否是已经是某个文件的尾簇等。

v对于文件系统来说,FAT表有两个重要作用:描述簇的分配状态以及标明文件或目录的下一簇的簇号。

v通常情况下,一个FAT把文件系统会有两个FAT表,但有时也允许只有一个FAT表,FAT表的具体个数记录在引导扇区的偏移0x10字节处。

v由于FAT区紧跟在文件系统保留区后,所以FAT1在文件系统中的位置可以通过引导记录中偏移0x0E~0x0F字节处的“保留扇区数”得到,如存储器结构体图中M值。

2.2.2.2FAT表分析说明

FAT32中每个簇的簇地址是有32bit(4个字节),FAT表中的所有字节位置以4字节为单位进行划分,并对所有划分后的位置由0进行地址编号。0号地址与1号地址被系统保留并存储特殊标志内容。从2号地址开始,每个地址对应于数据区的簇号,FAT表中的地址编号与数据区中的簇号相同。我们称FAT表中的这些地址为FAT表项,FAT表项中记录的值称为FAT表项值。

当文件系统被创建,也就是进行格式化操作时,分配给FAT区域的空间将会被清空,在FAT1与FAT2的0号表项与1号表项写入特定值。由于创建文件系统的同时也会创建根目录,也就是为根目录分配了一个簇空间,通常为2号簇,与之对应的2号FAT表项记录为2号簇,被写入一个结束标记。

几点说明:

Ø由于簇号起始于2号,所以FAT表项的0号表项与1号表项不与任何簇对应。FAT32的0号表项值总是“F8FFFF0F”。

Ø1号表项可能被用于记录脏标志,以说明文件系统没有被正常卸载或者磁盘表面存在错误。不过这个值并不重要。正常情况下1号表项的值为“FFFFFFFF”或“FFFFFF0F”。

Ø如果某个簇未被分配使用,它对应的FAT表项内容为0;

Ø当某个簇已被分配使用,则它对应的FAT表项内的FAT表项值也就是该文件的下一个存储位置的簇号。如果该文件结束于该簇,则在它的FAT表项中记录的是一个文件结束标记,对于FAT32而言,代表文件结束的FAT表项值为0x0FFFFFFF。

Ø如果某个簇存在坏扇区,则整个簇会用0xFFFFFF7标记为坏簇,这个坏簇标记就记录在它所对应的FAT表项中。

Ø在文件系统中新建文件时,如果新建的文件只占用一个簇,为其分配的簇对应的FAT表项将会写入结束标记。如果新建的文件不只占用一个簇,则在其所占用的每个簇对应的FAT表项中写入为其分配的下一簇的簇号,在最后一个簇对应的FAT表象中写入结束标记。

Ø新建目录时,只为其分配一个簇的空间,对应的FAT表项中写入结束标记。当目录增大超出一个簇的大小时,将会在空闲空间中继续为其分配一个簇,并在FAT表中为其建立FAT表链以描述它所占用的簇情况。

2.2.2.3FAT表示例

【0号表项】:0x0FFFFFF8;FAT表起始固定标识

【1号表项】:0xFFFFFFFF;不是用,默认值

【2号表项】:0x0FFFFFFF;根目录所在簇,

紫色的为3号表项,绿色的为4号表项,以此类推。注意:0和1号表项均不与实际的物理地址对应,2号表项开始才与物理地址对应。2号表项物理地址为FAT2表后紧跟着的那个簇!3号在2号表项紧跟着的一个簇。

计算:FAT所占扇区数7541(0x1D75);FAT2起始扇区为38+7541=7579;根目录起始扇区在7579+7541=15120。记得本文8个扇区为一个簇,即4K(0x1000),簇是系统分配内存的最小单元。

如图表中的起始地址对比,发现根目录起始地址刚好在15120,所以FAT表中0和1号表项没有对应物理地址!

图9

我将SD格式化,新建了一个test.txt的文本文件,大小为8.2kB。如下图:

图10

我们来分析上图:

在图中可以看出,test.txt文件起始簇为15128,这个地址是我们根目录(2号簇)后的一个簇,所以test.txt文件起始簇是3号簇,也就是3号表项(FAT表中表项值与簇号对应)。

【1】:2号表项为根目录,即2号簇。

【2】:3号表项为-0x00000004,test文件的下一簇号在4号表项,查看4号表项。

【3】:4号表项为-0x00000005,test文件下一簇号在5号表项,查看5号表项。

【4】:5号表项为-0x0FFFFFFF,结束符号。说明文件在5号簇时就存储完毕。

2.2.3数据区(灰色区域)

数据区时真正用于存放用户数据的区域。数据区紧跟在FAT2之后,被划分成一个个的簇。所有的簇从2开始进行编号,也就是说,2号簇的起始位置就是数据区的起始位置。

2.2.3.1根目录

FAT表示例中,根目录截图:

图11

虽然原则上FAT32允许根目录位于数据区的任何位置,但通常情况下它都位于数据区起始扇区,2号簇,可以在DBR偏移地址0x2C~0x2F查看。在FAT文件系统中,先要寻找数据区的第一簇(即2号簇)的位置,它不是位于文件系统开始处,而是位于数据区。从前面的学习知道,在数据区前面是保留区域和FAT区域,在前面还有MBR区域,这些区域都不使用FAT表进行管理。因此,数据区以前的区域只能使用扇区地址,而无法使用簇地址。

其实在2.2.2.3节,FAT表示例中我们就已经计算过其实地址(15128),注意这个地址不是物理地址哦,只是在FAT文件区域中一个相对地址!因为在之前还有MBR保留区域!

【保留区域大小(绿色部分)】:DBR偏移地址0x0E~0x0F,38(0x26),

【FAT表个数】:DBR偏移地址0x10开始2字节,2个,

【每个FAT表扇区数】:DBR偏移地址0x24~0x27,7541(0x00001D75),

说明:以上值均参见2.2.1.1节。

【计算公式】:

数据区起始扇区号=保留扇区数+每个FAT表大小扇区数×FAT表个数

【示例】:数据区起始扇区号=38+7541*2=15120

为了避免根目录被更改,也可以用下面的计算公式计算出根目录扇区:

根目录起始扇区=保留扇区数+FAT×2+(根目录起始簇-2)x每簇的扇区数。

说明:1、如果要得到物理地址,需要加上MBR保留区域大小。

2.2.3.2根目录的短文件目录项定义

目录所在的扇区,都是以32Bytes划分为一个单位,每个单位称为一个目录项(Directory

Entry),即每个目录项的长度都是32Bytes。根目录由若干个目录项组成,一个目录项占用32个字节,可以是长文件名目录项、文件目录项、子目录项等。32字节的具体定义如下图:

图12

示例:

图13

特别关注的参数说明:

【1】:文件或者文件夹存储的起始簇号,上图中紫色区域,偏移地址:0x14-0x15(高16为)和0x1A-0x1B(低16位),0x00000003,表示这个文件存储在3号簇的位置,在FAT表中为3号表项。

【2】:文件大小:偏移地址0x1C-0x1F,0x000020EE(8430字节);

【3】文件属性:偏移地址0x0B-0x0B,0x20,归档。

其他说明:

【0】子目录存储在数据区

【1】文件名的第一个字节,为0xE5,表示该项已被删除。

【2】名字为0x2E(“.”),表示当前目录。

图14

【3】名字为0x2E0x2E(“..”),表示上一级目录。

2.2.3.3长文件目录定义

图15

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。