设为首页 加入收藏

TOP

分析FAT32内部结构-入门篇-(一)
2019-09-23 11:12:49 】 浏览:125
Tags:分析 FAT32 内部 结构 入门

FAT32(File Allocation Table)是一种32位的FAT文件系统,微软在19968月发布。

FAT32的数字32是下面会讲到的FAT中每个表项的长度。

磁盘(硬盘)是数据的载体,而文件系统则是将这些数据以某种合理的结构组织起来方便操作系统的管理。

借此文分析一下微软的FAT32文件系统格式:(本文分析的FAT32分区是D盘,大小为128MB!环境为VMware虚拟机下的XP系统!

FAT324个部分组成,分别是DBR,FAT1,FAT2DATA,如图:

 

DBR:该分区的引导程序,在DBR的结尾部分会有一些重要的保留扇区(这些保留扇区属于DBR,图中未画出)

FAT1FAT的首要文件分配表

FAT2:文件分配表的备份

DATA:数据区(最小单位为簇(cluster),一般2个扇区为1簇,是微软规定的一种磁盘存储单位,与Linuxblock概念类似)

 

FAT32DBR结构图:

 

红色:跳转指令,将当前执行流程跳转到引导程序处,占2字节,对应汇编JUMP 58H; NOP;

蓝色:OEM代号,由创建该文件系统的厂商规定,占8字节,一般为”MSDOS5.0”

绿色:BPB(BIOS Paramter Block),从DBR的第12个字节开始共占用79字节,记录了文件系统的重要信息,相关字段参数见下表

粉红色:DBR引导程序,如果该分区没安装操作系统那么这段程序是没用的

黄色:DBR结束标记

BPB表:

偏移

字节

含义

BH

2

每扇区的字节个数

DH

1

每簇扇区数

EH

2

保留的扇区个数

10H

1

FAT个数

11H

2

不使用(根目录数量,FAT32已突破此限制,已无效,一般为0

13H

2

不使用(扇区总数,小于32M时才使用)

15H

1

存储介质描述符

16H

2

不使用(FAT占的扇区数,小于32M时才使用)

18H

2

每磁道扇区个数

1AH

2

磁头数

1CH

4

隐藏扇区

20H

4

扇区总数(大于32M时使用)

24H

4

FAT占的扇区数(大于32M时使用)

28H

2

扩展标记

2AH

2

版本,一般为0

2CH

4

根目录的首簇号

30H

2

文件系统整体信息扇区号

32H

2

DBR备份所在的扇区号

34H

12

保留,固定为0

40H

1

BIOS驱动器号

41H

1

不使用,一般为0

42H

1

扩展引导标记

43H

4

卷序列号

47H

11

卷标

52H

8

文件系统类型名,固定为”FAT32   ”

 

FAT32文件系统在DBR的保留扇区中一个文件系统信息扇区,用以记录数据区中空闲簇的数量及下一个空闲簇的簇号,该扇区一般在分区的LAB1扇区,也就是紧跟着DBR后的一个扇区,其内如下:

 

褐色:扩展引导标签,为52 52 61 41ASCII”RRaA”

青色:文件系统信息签名,为72 72 41 61ASCII”rrAa”

蓝色:空闲簇的数量,(1FBB0)=129968,每个簇1K,约等于127MB,即D盘的大小

紫色:下一个空闲簇的簇号

黄色:结束标记

其他字节:不使用,填充0

 

由于FAT紧跟在DBR的保留扇区之后,所以定位到最后一个保留扇区,那么下一个扇区就是FAT啦!

在上面的DBR图中可以找到保留扇区的个数为20H=3220 00是小端表示法),所以DBR往后32个扇区就是首要FAT啦,如图:

 

 

FAT4字节(32位)为一个表项,每个表项值的含义:

0x0000 0000

空闲簇,可用簇

0x0000 0001

保留簇

0x0000 0002 ~ 0x0FFF FFEF

该簇已用,其值指向下一个簇号

0x0FFF FFF0 ~ 0X0FFF FFF6

这些值保留,不使用

0x0FFF FFF7

坏簇,当一个簇中有一个扇区损坏(如物理损坏、病毒感染)时称为坏簇,这个簇将不被FAT32使用

0x0FFF FFF8 ~ 0x0FFF FFFF

文件的最后一个簇

每个表项的值对应了相应簇的使用情况,如2号表项对应了2号簇的使用情况,3号表项对应了3号簇的使用情况,注意的是,最开头的两个表项是不使用的,它们代表FAT的表头,其值是固定的0xFFF FFF80xFFFF FFFF,所以!FAT32中不存在0号簇和1号簇,第1个簇是2号簇!画张图:

 

 

如果该簇是文件的最后一簇,填入的值为0x0FFFFFFF,如果该簇不是文件的最后一簇,则填入的值为该文件占用的下一簇号所以可以看FAT32文件系统中文件是以簇链表的形式保存起来的)。

2号表项存储的是2号簇的使用情况,一般2(也就是文件系统的第1个簇)存储的是文件系统的根目录虽然在FAT32中,根目录的位置不再硬性固定,可以存储在分区内可寻址的任意簇内,不过通常根目录是最早建立的格式化时)目录所以基本上都是根目录首簇紧邻FAT2,占簇区顺序上的第1个簇(即2号簇)同时,FAT32将根目录当做普通的数据文件,所有没有了目录数的限制,在需要的时候可以分配空簇这一项2号表项)的值为0x0FFFFFFF ,说明当前根目录占了1个簇的大小

现在来分析数据区,数据区是紧接在FAT2之后的,所以在DBR往后(保留扇区+FAT1占用的扇区+FAT2占用的扇区)个扇区就是数据区啦,如图(这是数据区的第一个扇区,也是第一个簇的前半部分):

 

发现前11字节是我们的卷标!

 

 

而在BPB中卷标那项的值永远是”NO NAME    ”,也就是说卷标被移动到了数据区的前11字节,而且FAT32卷标最长11字节(因为BPB中已经规定了),而NTFS已经突破了这个限制。

其实,卷标是根目录下的第一个文件!

 

现在来分析一下FAT32下文件和目录之间是如何组织的,如何存储的,如何保存属性的:

先低级格式化D盘,以确保分区干净(指的是数据区全填充为0),

 

 

低级格式化完成(如果分区较大,低格的速度会变慢,耐心等待)之后,查看一个首要FAT表,

 

 

有一个表项,它的值为FFF FFFFH,意思就是结束簇,这就是我们的根目录啦,再查看一个根目录所在的起始簇,

 

 

发现前两行(32字节)有数据,后面全是0,然后我们在D盘(根目录)下粘贴一个空文件(在其他盘(如C盘)新建一个文本文件,然后复制到D盘,下面会讲为什么不能直接在D盘新建文件,而非要从其他盘复制),

 

 

再去首要FAT中查看变化,发现没有变化,看起来新建的文件不占表项,再去根目录所在簇查看一下,

 

 

发现!多了2行(32字节),这就是我们刚刚新建(其实是粘贴)的空文件A.TXT啦,现在我们要引入一个FAT32下短文件目录项概念了,来个表格,

字节偏移

字节数

说明

0H

8

文件名

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Windows Ping | Tracert 's B.. 下一篇[windows]c盘瘦身、系统盘清理临..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目