2024年1月5日发(作者:)

第八章 FAT32文件系统详解

Description:

OS: Microsoft windows 7、Microsoft Professional xp sp3

Software: winhex15.2 SR-10

Hardware: Mega16、Kingston 2G sd card

Author: FGD

Time: 20090808

8.1 Microsoft

比尔·盖茨于2008年6月27日退休了,他在微软同事的心目中是一个什么形象呢?这个当属与他一起共同执掌了微软28年之久的CEO鲍尔默最有话语权了。“他是一个比较内向的小伙子,不太爱说话,但浑身充满了活力,尤其是一到晚上就活跃起来。当时的情况是,经常在我早上醒来时,他才准备睡觉。”鲍尔默在最近接受《华尔街日报》采访时,如此形容比尔·盖茨。鲍尔默说的对,也许只有活力才是成功的最关键因素,这是比尔·盖茨留给大家最好的礼物!

1. Life is unfair, you want to adapt it.

2. The world will not take your self-esteem, but for the self-satisfaction before

you have success.

3. Just returned from the school come out when you can not earn 60,000 U.S.

dollars a month, but will not become any company vice president, also owned a

car until you have won the hand of those that day.

4. If you think school teachers is too harsh, then you have to think back to the

boss.

5. Selling hamburger and not detrimental to your dignity. Your grandparents

had a different understanding to sell hamburger, they called it "opportunity".

6. If you get into difficulties, it is not the fault of your parents, you should not

be the responsibility onto others, and to learn to learn from it.

7. Before you were born, your parents do not like so boring. They look into this

today because these years have been for you to pay bills, to your laundry. So, in

talking to parents, or whatever cleaning your own house?

8. You may no longer host school hours and poor health themselves, but life is

not the case. In some schools had not "fail" concept, the school will continue to

give you the opportunity for you to progress, but real life is not like that.

9. Unlike in the life out of school after a semester of the same school hours,

nor that the summer. No boss to help you find some self-and you must rely on its

own to complete.

10. Many of the scenes on television is not real life. In real life, people must do

their buried in his work, not like TV where my daily dwell in the case of coffee

Lane.

11. Treat your aversion to the people, because there days you will work for such

a person.

8.2 先说说硬盘

【笔者按:这部分知识基本是笔者对《数据重现》一书(作者:马林)读书笔记的整理,要了解详更详细的细节,可参考该书或求助互联网。】

8.2.1 硬盘结构

硬盘基本上由两大部分组成:控制电路板和盘体。

1. 控制电路板

控制电路板是由接口、DSP处理器、ROM、缓存、磁头驱动电路和盘片电机驱动电路等等组成。

2. 盘体

盘体由盘腔、上盖、盘片电机、盘片、磁头、音圈和其他辅助组件组成。

【以上专业名词希望读者可以通过互联网了解】

8.2.2 硬盘接口

1.IDE接口(Integrated Drive Electronics)

2.SCSI接口(Small Computer System Interface)

SCSI硬盘接口有三种,分别是50针(N-Narrow)、68针(W-Wide)和80针(SCA-Single Connector

Attachment)。

3. SATA接口(Serial-ATA)

IDE系列属于Parallel-ATA(并行),SATA是一种新的标准,目前已成为硬盘的主流接口。

4. SAS接口(Serial Attached SCSI)

即串行SCSI接口。

5. IEEE1394接口

IEEE1394并不是硬盘专用接口,但它却可以方便的链接包括硬盘在内的63个不同设备,并支持即插即用和热插拔。在数据传输率方面,IEEE1394可以提供100MB/S、400MB/S、1.2GB/S三档高速传输率,是现在所有硬盘望尘莫及的。

8.2.3 磁道、扇区、柱面

1. 磁道

当磁盘在旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道。每张盘片上的磁道由外向内依次从“0”开始进行编号。虽然磁道的编号是“由外向内依次从“0”开始进行编号”,但这并不意味着“0”磁道是位于磁盘片的最外沿的。固件区的物理位置有的位于比“0”磁道更靠近磁盘片的外缘的磁道上。有的位于磁盘片的中部。

2. 扇区

3. 柱面

磁盘通常由重叠的一组盘片构成。前面提到,每个盘面都被划分为树木相等的磁道,并从外圈的“0”磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区。每个扇区大小为512字节。扇区从“1”开始编号。

开始编号,具有相同编号的磁道形成一个圆柱,这个圆柱我们称之为磁盘的柱面。磁盘上数据的存取是沿柱面进行的,也就是在一个柱面内依次从低号盘片向高号盘片写入,写满一个柱面后再转到下一个柱面。

磁盘的柱面数与一个盘面上的磁道数相等。由于每一个盘面都有自己的磁头,因此,盘面数等于总的磁头数。所谓硬盘的CHS,既是Cylinder(柱面)、Head(磁头)、Sector(扇区)。

8.2.4 硬盘的启动过程

(1)硬盘上电后,DSP首先运行ROM中的程序,部分硬盘会检查各部件的完整性。

(2)然后盘片电机启动,当转速达到预定的转速时,磁头开始运行,定位到盘片的固件区,读取硬盘的固件程序和坏道表,部分硬盘会先将ROM中记忆的系列号与盘片上的进行比较,如果不一致,硬盘会终止初始化工作。

(3)当所有必须的固件正确读出后,磁盘即进入就绪状态,等待接收指令进行数据的读写操作。

8.2.5 硬盘的性能指标

1.硬盘的转速

2.硬盘的数据传输率

3.硬盘缓存

4.平均寻道时间

5.柱面切换时间

6.平均潜伏期

7.平均方位时间

平均潜伏期指的是磁头移动到指定磁道后,还需要多少时间指定的(即要读写的)扇区才会转到磁头(60*1000) / (硬盘转速*2) = 平均潜伏期

平均寻道时间指的是从硬盘接到相应指令开始到磁头转移到指定磁道位置为止所用的平均时间。

缓存是硬盘与外部总线交换数据的场所。

下进行读取或写入的相关操作。换算公式:

8.2.6 寻址方式

所谓寻址方式,大哥比方就好比我们看一本书,要从中找到我们要读的章节,那么要怎样才能纸袋它所在的位置呢?通常我们可以目录中找到它所在的页数,然后找到它。还有一种方法就是将所有章节都进行编号,我们只要知道它章节号,也可以找到它所在位置。

同样,要访问硬盘上的数据,也需要合适的寻址方式方可准确读取数据。硬盘上的寻址方式有两种:

& C/H/S寻址方式

使用Cylinder(柱面)、Head(磁头)、Sector(扇区)三个参数来定位唯一的扇区地址。

&LBA寻址方式

LBA寻址方式即Logic Block Address(逻辑块地址),又称为“线性寻址模式”。

(插入图片)

8.3 数的存储格式

& Big-endian:也被称作“大头位序”或“大端模式”。字节由最高位向最低位依次存放,高位在前,数的存储格式也就是数字的存储顺序。

地位在后。

例如:有一个十六进制数“00 23 0f 4a”:

Big-endian: 00 23 0f 4a

& Little-endian:也被称作“小头位序”或“小端模式”。字节由最低位向最高位依次存放,低位在前,高位在后。

Little-endian: 4a 0f 23 00

在进行数据操作的时候一定要注意大小端存放格式,否则后果就是,你应该知道的。

8.4 DOC分区

8.4.1 概述

说明:虽然我们的存储介质没有分区(你的u盘,sd卡等小容量存储介质肯定没有分区的吧)。但是在文件系统初始化的开始我们必须通过MBR获取分区表项的数据,以获得CHS、LBA参数以及分区大小扇区数,否则就无法知道你文件系统的起始物理扇区号!!!

Microsoft将使用DOC分区体系的磁盘称为“主引导记录(Master Boot recorder, MBR)”磁盘,这是对于使用“全局ID分区表(GUID Partition Table, GPT)磁盘”而言的。

很多人一提到“DOC分区”,就认为只是指windows下使用的分区体系,这是对“DOC分区”的一个理解错误。“DOC分区”并不是以操作系统的不同而划定的分区体系,而是指使用“主引导记录(MBR)”的分区体系。

8.4.2 主引导记录扇区

使用“DOC分区”体系时,磁盘的第一个——也就是0号扇区被称为主引导记录扇区,也称为主引导记录MBR(Master Boot recorder,MBR)。

1. MBR数据结构

MBR由446个字节的引导代码、64字节的主分区(4个)表及两个字节的签名值“55 AA”组成。

我们可以用WinHex打开一个SD卡(Canon的牌子,32MB,文件系统:FAT16)的MBR查看:

(说明,不知为什么,用WinHex无法看到SD卡文件系统以前的扇区数据,也许是笔者没有发现吧!没有WinHex,怎么办?好办!我们可以通过读取SD卡0号扇区的数据,然后用串口发回到计算机的超级终端观察。所以下面的数据是笔者在调试过程中用uart获取的)

分区CHS起始地址分区CHS结束地址

我们可以看到前446字节的数据全是0,怎么回事?我也不知道,可能是因为SD卡不存在系统引导问题,所以将所有数据用0来填充。

接下来的64字节的数据就是我们所关心的重要数据。首先先介绍一下分区表项的数据结构:

分区表项共占用64字节数据,共四个分区表项,图示中用黄色长条标记的是第一个分区表项。

分区表项数据结构

偏移(十六进制) 字节数

00~00 1

描述

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

分区起始CHS地址

分区类型

分区结束CHS地址

分区起始LBA地址(Little-endian顺序)

分区大小扇区数(Little-endian顺序)

01~03 3

04~04 1

05~07 3

08~0B 4

0C~0F 4

说明:

分区起始CHS地址:

第一个字节用于记录分区起始磁头号。

第二个字节的低6位用于记录分区起始扇区号

用10个bit记录分区起始柱面号:第二个字节的高两位作为起始柱面号的高两位,第三个字节的8个bit作为分区起始柱面号的低8位。

现在我们来分析一下上面所示图中的数据:

00-00(00)不可引导

01~03(00 14 01) 该处我们不做分析,因为SD卡不存在柱面问题,有兴趣的朋友可有用WinHex打开一个FAT32的硬盘,然后算算CHS。

04~04(04) 分区标志。这个地方有一张表格(分区标志类型值及其含义),请读者自行上网查询。

05~07(DA 60 03)此处不介绍

08~0B(00 00 00 33)这正是我们要获取的数据,通过计算可知它是51,它很重要,因为它就是我们SD卡上文件系统开始的物理扇区号,我们可以用WinHex打开SD卡查看,在左边的记录中发现,文件系统的DBR起始物理扇区号果真就是51!!!如下图所示:

0C~0F(00 00 ED 4D)60749这就是分区大小的扇区数,可以这么说,SD卡只有一个分区,我们在WinHex中看到的总扇区数即除去MBR(还有隐藏扇区)剩余的扇区总数,在WinHex中同样可知,如上图下方黄色区域标记的一样。

8.4.3 扩展引导记录扇区EBR

MBR扇区只包含4个分区表项,最多只能描述4个分区。大多数用户都会将自己的硬盘分为4个分区甚至更多,那怎么办呢?那就交给扩展引导记录扇区EBR去处理。

由于这里的知识不在我们的讨论范围,有兴趣的读者可以查看《数据重现》一书,上面有详细的介绍。

好了,DOC分区的知识就介绍这么多,感兴趣的读者还可以通过互联网获取更多的知识。知识的获取接下来就开始我们的文件系统之旅,读者有可能看过一遍后有不理解的地方,没关系,继续看第二遍、是一个积累的过程,在积累中提高自己,在积累中丰富自己的生活。

第三遍、第四遍(要知道笔者当时连续用了两个通宵来了解它!!!)„„上网查找资料,有一天,你总会这样感觉到,原来文件系统就那么回事儿,呵呵。好,Let us go!!!

8.5 认识文件系统

8.5.1 FAT文件系统简介

初次接触文件系统,很多读者或许都和笔者有同感:到底文件系统是什么东西???

文件系统就是对数据进行存储与管理的方式。

怎么样?听上去还好理解吧。就好比在我们自己的电脑上,现在我们的硬盘都是几百个G容量,你天天往里面存放各种各样不同的数据,有文档文件,有音乐文件,有视频文件等等等等。想象一下,如果你的电脑没有一个管理数据的好家伙,我的天,那将无法想象!!!你的数据将被乱七八糟的存放着,更要命的是,你根本无法再从硬盘中读取你之前存放的数据,因为你根本不知道它们在哪。有了文件系统,那就简单了,你可以随意将任何文件存放在任何地方,有的文件不想让人一下就看见,行,你把它放到安装windows系统的系统盘目录下,再觉得不爽,好,那就隐藏了它。文件系统会在你把文件存放到某个目录下时记录下你文件的信息(文件存放的起始簇号,文件大小,文件创建、修改、访问、保存的时间等等),当你下次要打开那个文件时,文件系统就根据已知的文件信息去寻找它,找到后,你就又可以读,写,修改,移动你的文件了,并且文件系统会同时更新。

上面的描述是希望让读者对文件系统有一个感官的认识,接下来,我们详细的讲解文件系统。

文件系统是为了长久的存储和访问数据而为用户提供的一种基于文件和目录的存储机制。我们都知道,在使用硬盘存储数据之前,首先要进行分区(当然你也可以不分区),然后对分区(或整个硬盘)进行格式化,其实格式化的过程就是在分区内建立文件系统的过程。一个文件系统由系统结构和按一定规则存放的用户数据组成。日常,我们都有这样的经历,在windows下当我们要格式化一个分区或是其他存储介质时,windows会弹出一个对话框,上面有这样一些选择内容:容量、文件系统、分配单元大小、卷标等等。其中文件系统的下拉菜单中就有几种不同的文件系统共供户选择,一般我们都会选择默认、FAT32或NTFS文件系统,当我们按下格式化按钮后,操作系统就开始为这个分区建立你所选择的文件系统。

文件系统种类繁多,但所有的文件系统都有一定的共性

1. 数据单元

数据在写入磁盘或从磁盘读取数据时每次操作的数据量称为数据单元,它的大小在建立文件系统时确定。数据单元在不同的文件系统中有不同的称呼:例如在FAT和NTFS文件系统中称作“簇(Cluster)”,ExtX中称作“块(Block)”等。一个数据单元由若干个连续的扇区组成,大小总是2的整数次幂个扇区。

2. 坏数据单元

坏数据单元也就是包含缺陷扇区的数据单元。

3. 逻辑文件系统地址

磁盘上的一个扇区在不同的情况下会有不同的地址表达形式。

&每个扇区都会有一个LBA地址,也就是物理地址

&每个物理卷内的扇区又有一个物理卷地址

&在逻辑卷内部的扇区会有一个逻辑卷地址

(以上几个概念比较容易混淆,注意区分)

4. 逻辑文件地址

对于每个文件来说,将它按所在文件系统中的数据单元大小为单位进行分割,分割后的每一个部分由0开始编号,这个编号就是其对应数据单元的逻辑文件地址。一个文件前后相邻的两个数据单元在物理上的存储地址可能是不连续的,但它的逻辑文件地址一定是连续的。

5. 分配策略

【1】第一可用分配策略,即当为一个文件分配了一个存储单元后还要继续为其分配时,操作系统会重新从文件系统的起始处搜索可以使用的空间。

举例说明,加入我们现在有一个文件需要4个储存单元,文件系统内的1、2、3、5、10号储存单元已经有数据放在那了,4、6、7、8、9号储存单元空闲,按照第一分配策略为这个文件的4个部分分配空间时步骤如下:

<1>第一部分分配到4号储存单元,如下图所示:

<2>为文件第一部分分配好储存位置后,又从1号储存单元开始向后寻找空位置,找到6号后分配给文件的第二部分,如下图:

<3>为文件第二部分分配好储存位置后,又从1号储存单元开始向后寻找空位置,恰好这个时候,2号储存单元的文件内容被删除了,就把2号位置分配给文件的第三部分,如下如:

<4>为文件第三部分分配好储存位置后,又从1号储存单元开始向后寻找空位置,找到7号后分配给文件的第四部分,如下图:

至此,这个文件的四个部分就分配好了,这四部分的储存位置就是4-6-2-7。

【2】下一可用分配策略,即为文件分配了一个储存单元后并不再回到卷开始处重新寻找可用空间,而是直接向后进行搜索。以上文件的四个部分利用下一可用分配策略分配的最后结果如下图所示:

【3】最佳分配策略,即在为文件分配空间时,会尽可能找到足够的连续空间以避免其片段化。对于之前的例子使用最佳分配策略时,最后结果如下图:

6. 松弛空间

松弛空间分为两种,一种是数据的结尾与为其分配的空间结束处的未使用部分,还有一种就是位于分区结尾的卷松弛空间。

7. 元数据

任何文件和目录都会有一个名字,我们将其统称为“文件名”。除了文件名外,文件或目录还有其他一些描述信息,如大小,时间信息,是否加密或压缩,储存位置信息等,我们将这些描述信息统称为文件或目录的元数据。

8.6 揭开FAT的神秘面纱

这一节,笔者将尽力用最容易让读者理解的语言和例子来阐述,希望读者阅读这一节一定要细心,务必上机操作。

8.6.1 FAT文件系统概述

FAT(File Allocation Table,文件分配表)文件系统是windows操作系统所使用的一种文件系统,它的发展过程经历了FAT12、FAT16、FAT32三个阶段。

FAT文件系统用“簇”作为数据单元。一个“簇”由一组连续的扇区组成,簇所含的扇区数必须是2的整数次幂。簇的最大值为64个扇区,即32KB。所有簇从2开始进行编号,每个簇都有一个自己的地址编号。用户文件和目录都存储在簇中。

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

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

&FAT文件系统的每一个文件和文件夹都被分配到一个目录项,目录项中记录着文件名、大小、文件内在FAT文件系统中,文件系统的数据记录在“引导扇区中(DBR)”中。引导扇区位于整个文件系统的容起始地址以及其他一些元数据。

0号扇区,是文件系统隐藏区域(也称为保留区)的一部分,我们称其为DBR(DOS Boot Recorder——DOS引导记录)扇区,DBR中记录着文件系统的起始位置、大小、FAT表个数及大小等相关信息。

在FAT文件系统中,同时使用“扇区地址”和“簇地址”两种地址管理方式。这是因为只有存储用户数据的数据区使用簇进行管理(FAT12和FAT16的根目录除外),所有簇都位于数据区。其他文件系统管理数据区域是不以簇进行管理的,这部分区域使用扇区地址进行管理。文件系统的起始扇区为0号扇区。

8.6.2 FAT文件系统的整体布局

如图所示:

说明:

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

【2】

【3】

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

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

接下来的内容就是FAT文件系统的核心内容了!!!

8.6.3 FAT32的保留区

FAT32文件系统的开始部分有一个由若干个扇区组成的保留区,保留区的刀削会记录在DBR扇区中,比较常见的为32、34或38个扇区。

8.6.3.1 引导扇区

引导扇区是FAT32文件系统的第一个扇区,也称为DBR扇区。它包含这样一些文件系统的基本信息:

【1】

【2】

【3】

每扇区字节数

每簇扇区数

保留扇区数

【4】

【5】

【6】

【7】

【8】

FAT表个数

文件系统大小(扇区数)

每个FAT表大小(扇区数)

根目录起始簇号

其他一些附加信息

(DBR扇区中记录文件系统参数的部分也称为BPB(BIOS Parameter Block))

说明:

&引导扇区中的某些参数是至关重要的:【1】、【2】、【3】、【4】、【5】、【6】、【7】等。

我们可以通过每个FAT表的大小扇区数乘以FAT表的个数得到FAT区域的大小;通过保留扇区数和FAT区域的大小就可以得知数据区的起始位置,也就得到了文件系统第一簇的位置。由根目录的簇号和第一簇的位置就可以得到根目录的位置。

引导扇区数据结构及实例讲解:

这个小节笔者将通过讲解一个Kingston 2GB的SD卡的DBR(FAT32文件系统),来向读者详细说明引导扇区数据结构各个参数的含义,先给出几张图片:

第一张图片就是笔者使用的SD卡截图,第二章图片显示的就是通过WinHex获取的DBR数据截图。现在我们来着重分析DBR,请读者务必在阅读完本章节后自行上机实践查看,以加深影响。

具体分析如下:

(首先说明,数据的存储是以小端模式存储的)

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

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

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

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

【5】0x0E~0x0F:2个字节,保留扇区数,704(0x02 C0)。

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

【7】0x11~0x12:2个字节,根目录最多可容纳的目录项数,FAT12/16通常为512。FAT32不使用此处值,置0。

【8】0x13~0x14:2个字节,扇区总数,小于32MB时使用该处存放。超过32MB时使用偏移0x20~0x23字节处的4字节存放。笔者的SD卡容量为2GB,所以不使用该处,置0.

【9】0x15~0x15:1个字节,介质描述符,0xF8表示本地硬盘。

【10】0x16~0x17:2个字节,每个FAT表的大小扇区数(FAT12/16使用,FAT32不使用此处,置0)。

【11】0x18~0x19:2个字节,每磁道扇区数,63(0x00 3F)。

【12】0x1A~0x1B:2个字节磁头数,255(0x00 FF)。

【13】0x1C~0x1F:4个字节,分区前已使用扇区数,137(0x00 00 00 89)。(这个数据要尤其的重视,文件系统初始化的第一步要找的就是这玩意儿。因为我们的SD卡没有分区,默认就是一个分区,这个数据就是相对于MBR(关于MBR的介绍请读者参看8.4小节的DOC 分区)的地址偏移量,MBR的扇区地址才是整个SD卡的物理扇区号为0的那个地址,也就是说文件系统并不是处在整个SD卡最开始的地方,它处在MBR所处的保留区之后,于是我们可以对使用FAT32文件系统的SD卡整体布局给出如下图示)

【14】0x20~0x23:4个字节,文件系统大小扇区数,3841911(0x 00 3A 9F 77)。

【15】0x24~0x27:4个字节,每个FAT表的大小扇区数,3744(0x 00 00 0E A0)。

【16】0x28~0x29:2个字节,标记。

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

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

【19】0x30~0x31:2个字节,FSINFO(文件系统信息扇区)扇区号,1。(上图的标注即用黄色条纹的标注有误,请读者注意)该扇区为操作系统提供关于空簇总数及下一可用簇的信息。

【20】0x32~0x33:2个字节,备份引导扇区的位置,6。(上图的标注即用黄色条纹的标注有误,请读者注意)备份引导扇区总是位于文件系统的6号扇区。

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

【22】0x40~0x40:1个字节,BIOS INT 13H 设备号,0x80。(这个我也不知道什么意思☺)

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

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

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

【26】0x47~0x51:11个字节,卷标(ASCII码),如果建立文件系统的时候指定了卷标,会保存在此。笔者当时没有指定卷表,上图中的YCY是后来指定的。

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

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

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

好了,一个DBR的所有参数都介绍完了,你是否有冲动也看看自己的SD卡的DBR呢?还等什么呢?赶快去看看吧!

其实WinHex中提供了FAT32引导扇区的模板,模板名为“Boot Sector FAT32”。如下图所示:

8.6.3.2 引导代码

FAT文件系统将引导代码与文件形同数据结构融合在一起,而不像Unix文件系统那样各自存在,引导扇区的前三个字节为一个由机器代码构成的跳转指令,以使CPU越过跟在后面的配置数据跳转到配置数据后面的引导代码处。

FAT32文件系统引导扇区的512字节中,90~509字节为引导代码,而FAT12/16则是62~509字节为引导代码。同时,FAT32还可以利用引导扇区后的山区空间存放附加的引导代码。

一个FAT卷即使不是可引导文件文件系统,也会存在引导代码。

8.6.3.3 FSINFO信息扇区

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

1. FSINFO信息扇区结构

大多数的FSINFO信息扇区一般位于文件系统的1号扇区,结构非常简单。

字节偏移(十六进制) 字节数 含义

00~03 4 扩展引导标志“52526141”

04~1E3 480 未使用

1E4~1E7 4 FSINFO签名“72724161”

1E8~1EB 4 空闲簇数

1EC~1EF 4 下一可用簇号

1F0~1FD 14 未使用

1EE~1EF 2 “55 AA”标志

2. FSINFO信息扇区实例

首先附上一幅图如下:

具体分析如下:

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

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

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

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

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

说明:由于笔者的SD卡在收集这些数据时格式化过,里面没有东西,所以导致【4】【5】两项的数据为原始数据。下一可用簇号为2,你知道文件系统数据区的起始扇区号吗?没错,正是2号簇,因为0号和1号FAT表项被系统写入特定的值,不用。详细讲解见下一小节。

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

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

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

它的结尾也会有一个“55 AA”标志。

8.6.4 FAT32的FAT表

8.6.4.1 FAT表概述

位于保留区后的是FAT区,有两个完全相同的FAT(File Allocation Table, 文件分配表)表组成,FAT文件系统的名字也是因此而来。

重要说明:

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

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

3. 由于FAT区紧跟在文件系统保留区后,所以FAT1在文件系统中的位置可以通过引导记录中偏移0x0E~0x0F字节处的“保留扇区数”得到。

4. FAT2紧跟在FAT1之后,它的位置可以通过FAT1的位置加上FAT表的大小扇区数计算出来。

8.6.4.2 FAT表的特性

FAT表由一系列大小相等的FAT表项组成,总的说来FAT表有如下特性:

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

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

3. 如果某个簇未被分配使用,它所对应的FAT表项内的FAT表项值即用0进行填充,表示该FAT表项所对应的簇未被分配。

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

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

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

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

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

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

10. 对文件或目录进行操作时,他们所对应的FAT表项将会被清空,设置为0以表示其所对应的簇处于未分配状态。

8.6.4.3 FAT表的使用

一个文件的起始簇号记录在它的目录项中,该文件的其他簇则用一个簇链结构记录在FAT表中。如果

要寻找一个文件的下一簇,只需要查看该文件的目录项中描述的起始簇号所对应的FAT表项,如果该文件只有一个簇,则此处的值为一个结束标记;如果该文件不止一个簇,则此处的值是它的下一个簇的簇号。

下面我们用一个形象的比喻来说明使用FAT表寻找簇地址的过程:

我们的寝室楼都有各自的标号,而且每个房间都依次进行了编号,只是没有使用0和1两个号码,直接从2号开始。公寓一楼大厅设立了一个大柜子(FAT表),大柜子被分成了很多小格子(FAT表项),所有的小格子(FAT表项)从0开始编号,0号和1号被楼下阿姨保留做特殊之用。从2号开始分配给每个房间(簇)作为信箱,信箱(FAT表项)号与房间(簇)号一一对应,所有的房间(簇)都得到自己的信箱(FAT表项)后,剩余的小格子就闲置不用。

现在呢,我们要来做一个寻宝的游戏:一个宝物被分成了几份放在了几个房间(簇)内,每个房间(簇)放置一份。然后在每个房间对应的信箱中(FAT表项)记录了下一份宝物所在的房间(簇)号,现在我们就去把这件宝物找出来。

第一步:首先公寓管理处(目录项)告诉我们一条线索,宝物的第一份所在的房间(簇)号。假设这个房间(簇)号是5,我们从5号房间(簇)取出第一份,然后去5号信箱(FAT表项)查看一下下一份放在哪个房间(簇)。

第二步:5号信箱(FAT表项)内记录的数字是6,我们就去6号房间(簇)取出第二份,然后去6号信箱(FAT表项)查看。

第三步:6号信箱(FAT表项)内记录的数字是7,我们就去7号房间(簇)取出第三份,然后去7号信箱(FAT表项)查看。

第四步:7号信箱(FAT表项)内记录的数字是8,我们就去8号房间(簇)取出第四份,然后去8号信箱(FAT表项)查看。

第五步; 8号信箱(FAT表项)内记录的数字是9,我们就去9号房间(簇)取出第三份,然后去9号信箱(FAT表项)查看。

第六步:这时发现9号信箱(FAT表项)内的内容是一个结束标记,也就是说后面没有了。这时我们就把所有的宝物找出来了。

下面我们尝试分析一个真实的例子。首先在SD卡的根目录下建立一个名为的文本文件,如下图所示:

FAT1图示如下:

我们现在来尝试读取起始于3号簇的文件:

第一步:由该文件的目录项中得知它的第一簇存储在3号簇,到3号簇读取它的内容后,查看3号FAT表项。

第二步:3号表项内的表项值为4,即存储文件的下一个簇为4号簇,读取4号簇中的内容,查看4号簇对应的4号FAT表项。

第三步:4号表项内的表项值为5,即存储文件的下一个簇为5号簇,读取5号簇中的内容,查看5号簇对应的5号FAT表项。

第四步:5号表项内的表项值为6,即存储文件的下一个簇为6号簇,读取6号簇中的内容,查看6号簇对应的6号FAT表项。

第五步:6号表项内的表项值为7,即存储文件的下一个簇为7号簇,读取7号簇中的内容,查看7号簇对应的7号FAT表项。

第六步:7号表项内的表项值为8,即存储文件的下一个簇为8号簇,读取8号簇中的内容,查看8号簇对应的8号FAT表项。

第七步:8号表项内的表项值为9,即存储文件的下一个簇为9号簇,读取9号簇中的内容,查看9号簇对应的9号FAT表项。

第八步:这时发现9号FAT表项中的值已是结束标志:0x0FFFFFFF,说明9号簇已经是最后一簇了。

8.6.4.4 其他说明

要找一个簇的FAT表项,只要用它的簇号乘以每个FAT表项的字节数即可。Winhex提供了直接跳转到某个指定FAT表项的功能,单击position|go to FAT Entry,即可弹出转到FAT项对话框,在对话框输入目标FAT项号码后单击OK,光标即会在该FAT项的第一个字节上闪烁。

文件系统大小的上限取决于FAT项的大小。簇链中的每个FAT项记录着下一个簇的簇地址,FAT项所能表示的数字有一个上限,这个上限值也就是文件系统中的最大簇号。FAT32文件系统的FAT项只使用了

32bit的28bit,因此只能描述268435456个簇(实际上还要少于这个值,因为这其中还包括用作结束标记和坏簇标志的保留值)。

8.6.5 FAT32的数据区

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

8.6.5.1 根目录

虽然原则上FAT32允许根目录位于数据去的任何位置,但通常情况下它都位于2号簇。

在FAT文件系统中,寻找第一簇(即2号簇)的位置也就是寻找数据区的开始位置,这并不是一件容易的事,因为它不是位于文件系统开始处,而是位于数据区。在数据区前面是保留区域和FAT区域,这两个区域都不使用FAT表进行管理。因此,数据区以前的区域只能使用扇区地址(逻辑卷地址),而无法使用簇地址。

要想定位一个FAT32文件系统的数据起始处,可以通过引导扇区的相关参数计算出来。1.从引导扇区的偏移0x0E~0x0F字节处得到保留扇区。2.从偏移0x10字节处得到FAT表的个数。3.从偏移0x24~0x27字节处得到每个FAT表的大小扇区数。4.利用如下公式计算:

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

要想计算其他已知簇号的扇区号,还要由引导扇区的偏移0x0D字节处查找到每个簇大小扇区数,并1. 定位根目录

使用如下公式计算:

某簇起始扇区号 = 保留扇区数 + 每个FAT表大小扇区数 × FAT表个数 + (该簇簇号 - 2) × 每簇扇区数

2. 根目录分析

根目录在文件系统建立时即已被创建,其目的就是存储目录(也称文件夹)或文件的目录项。每个目录项的大小为32个字节。

文件系统刚被创建时,还没有存储任何数据时,根目录下没有任何内容,文件系统只是为根目录分配了一个簇的空间(通常为2号簇),将结束标记写入该簇对应的FAT表项,表示该簇已经被分配使用。这时候,为根目录分配的空间没有任何内容。但如果在创建文件系统的时候是定了卷标,则会在根目录下为其建立一个卷标目录项,该目录项占用根目录中的第一个目录项位置。

下图显示了刚刚创建的FAT32文件系统的根目录,该文件系统的卷标为“YCY”。

不管是根目录还是子目录下的目录项,都具有以下的基本特性:

1. 为文件或子目录分配的第一个簇的簇号记录在它的目录项中,其他后续簇则由FAT表中的FAT表链进行跟踪。

2. 目录项中除记录子目录或文件起始簇号外,还记录它的名字、大小(子目录没有大小)、时间值

等信息。

3. 每个子目录或文件除具有一个端文件目录项外,还会有长文件名目录项。

4. 短文件名目录项固定占用32字节,长文件名目录项则根据需要占用1个或者若干个32字节。

5. 对于同一个子目录或文件,它的长文件名目录项存放在它的短文件名目录项之前,如果长文件名目录项占用多个32字节,则按倒序存放于段文件名目录项之前。

下面我们在根目录下新建一个子目录“YCY目录”和一个文本文件“”,看看根目录的内容如下:

8.6.5.2 子目录

在FAT32文件系统中,除根目录在创建文件系统时即被建立并分配空间外,其他所有的子目录都是在使用过程中根据需要建立的。新建一个子目录时,在其父目录中为其建立目录项,在空闲空间中为其分配一个簇并对该簇进行清零操作,同时将这个簇号记录在它的目录项中。如果在根目录下创建一个子目录,我们就称这个子目录为根目录的子目录,称根目录为这个子目录的父目录。

创建子目录时,在为其父目录分配的簇中建立目录项,目录项中描述了这个目录的起始簇号。在为子目录建立目录项的同时,也在为子目录分配的簇中,使用前两个目录项描述它与父目录的关系。

下面我们在根目录下建立一个子目录yatou。

我们来看看为其分配的簇中记录了那些内容:

我们看到,虽然该子目录下并没有再建立任何下级子目录和文件,但却在其占用的簇空间中建立了两个目录项,第一个是“.”目录项,它描述该子目录本身的一些信息;第二个是“..”目录项,它描述的是该子目录的父目录(也就是根目录)的相关信息。通过这种方式,就在子目录和父目录之间建立起了联系。在子目录中建立下一级子目录或文件时,为下级子目录或文件建立的目录项将从第三个目录项开始写入。

温馨提示:子目录和根目录不同之处只在于根目录是在创建文件系统时就建立了的,如果没有卷标和内容,分配给根目录的簇空间内没有任何内容。

而子目录实在存储过程中根据需要由用户建立的,随着子目录建立的同时,会在为其分配的簇空间开始处建立两个目录项来描述子目录本身和其父目录的信息,以使字符目录间建立联系。

8.6.5.3 目录项

在FAT32文件系统中,根据结构不同可以讲目录项大致分为四种:卷标目录项、“.”目录项和“..”目录项、短文件名目录项、长文件名目录项。短文件名目录项是最重要的数据结构,其中存放着有关子目录或文件的短文件名、属性、起始簇号、时间值以及内容大小等信息。在FAT32文件系统中,将子目录看作是一种特殊的文件。

1. 短文件名目录项

短文件名目录项是FAT文件系统中非常重要的一种数据结构。之所以称其为短文件名目录项,是因为它所记录的文件名延续了DOS时代的8.3格式,即8个字符的名字加上3个字符的扩展名:

如果文件名不足8个字符,用0x20进行填充。

超过8个字符时则会被截短,因为短文件名目录项中没有足够的空间记录超出的部分。截短的方法是取文件名的前6个字符加上“~1”(如果有同名文件,则会依次递增该数值),然后加上其扩展名。

 如果是子目录,则将扩展名部分用“0x20”进行填充。

为了解决长文件名的问题,FAT文件系统又增加了一种“长文件名”目录项结构。其从windows95开始,不管文件名的长度是否超过8个字符,都会同时为其创建短文件名目录项和长文件名目录项,因为短文件名不区分大小写,而长文件名则是区分大小写的。

2. 端文件名目录项的特性

每个文件或子目录都分配有一个大小为32字节的目录项,用以描述文件或目录的属性。

所有的目录项并不是具有相同的地址,要找到一个目录项的位置只能用分配给文件或子目录的全名进行是搜索。

目录项结构中有一个属性区域,每个文件可以设置7中属性。

每个文件或目录还有四个非关键性属性:

 只读属性

隐藏属性

系统属性

存档属性

建立时间,精确到十分之一

最后访问时间,精确到日

最后修改时间,精确到2秒

每个目录项包括三个时间值,即建立时间、最后访问时间、最后修改时间:

一个目录项是否被分配使用它的第一个字节来描述。对于已经分配使用的目录项,它的第一个字节是文件名的第一个字符,而文件或目录被删除后,它所对应的目录项的第一个字节将被置为0xE5,这就是为什么有的FAT数据恢复工具需要用户自己输入文件名的第一个字符的原因。

3.短文件名目录项的数据结构

每个短文件名目录项占32个字节,数据结构如下图所示:

实际占用的扇区数对应的容量丆并且向上取整后的结果。单位为字节

具体解释如下:

【1】0x00~0x00:1个字节,如果该目录项正在使用中,则为文件名或子目录名的第一个字符。

0x00:说明该目录项未被分配使用。

0xE5:说明该目录项曾经被使用过,但是现在已被删除。目前处于未分配状态

【2】0x01~0x0A:10个字节,文件名的第2至第11个ASCII码,除扩展名外,如果文件的名字不足8个字符则用0x20进行填充。

【3】0x0B~0x0B:1个字节,所描述文件的属性

0x01-只读

0x02-隐藏

0x04-系统文件

0x08-卷标

0x0F-为此值时表示该目录项为长文件名目录项

0x10-目录

0x20-存档

【4】0x0C~0x0C:1字节,保留

【5】0x0D~0x0D:1个字节,文件穿件的时间,精确到创建时刻的十分之一秒

【6】0x0E~0x0F:2个字节,文件创建的时间——时分秒

两个字节的16bit被划分为3个部分:

0~4bit为秒,以2秒为单位,有效值为0~29,可以表示的时刻为0~58

5~10bit为分,有效值为0~59

11~15bit为时,有效值为0~23

下面举例说明:

如上图所示,其子目录项偏移0x0E~0x0F字节处的内容为“A1A9”,我们来计算一下。由于FAT文件系统数据采用的小端存储方式,因此“A1A9”表示成16进制为0xA9A1,换算成2进制就是1010 1001 1010 0001,我们将其分成三部分并计算它的值,如下图所示:

下面我们再回过头来看看丫头这个目录的属性,点击右键选择属性一项可以看到:

可以看到上面的创建时间是21:13:03,在误差允许的范围内。

【7】0x10~0x11:2个字节,文件创立的日期,16bit也划分为三个部分:

0~4bit为日,有效值为1~31

5~10bit为月,有效值为1~12

811~15bit为时,有效值为0~127,这是一个相对于1980年的年数值,也就是说该值加上19809即为文件创建的日期值。该部分笔者就不再举例就计算了,原理和计算创建时间是一样的。请读者自己去计算。

【8】0x12~0x13:2个字节,最后访问日期。

【9】0x14~0x15:2个字节,文件起始簇号的高两个字节。

【10】0x16~0x17:2个字节,文件最后修改的时间。

【11】0x18~0x19:2个字节,文件最后被修改时的日期。

【12】0x1A~0x1B:文件内容起始簇号的低两个字节,与0x14~0x15字节处的高两个字节组成文件内容起始簇号。

【13】0x1C~0x1F:文件内容大小字节数,只对文件有效,子目录的目录项此处全部设置为0。

4.短文件名目录项实例分析

上面我们讲解了短文件名目录项的各参数及其含义,下面我们通过一个具体的实例来分析。首先我们在卷标为ycy的SD卡中再建立一个空的文本文件和一个写有数据的文本文件。即当前SD卡下只有三个文件:yatou(目录)、(空的文本文件)、(写有数据的文本文件)。如下图:

然后用winhex打开ycy,如下图所示:

具体分析如下:

第一个目录项描述的是卷标信息。我们从第二个目录项开始分析,它是的目录项。

它的名字只有3个字符,因此共占用了偏移量0x00~0x02,非分配给文件名部分的0x03~0x0A字节用0x20进行填充。这里需要说明的一点是:如果文件名有汉字,则一个汉字占用两个字节。

0x0B字节处的属性值为20,说明该文件时存档文件。

0x14~0x15字节处的簇号高两位为0x0000,0x1A~0x1B字节处的簇号低两位为0x0003,因此该文件起始于3号簇。

0x1C~0x1F字节处描述的是文件的大小,0x07C8,即1992字节,即1.94k,通过文件属性可知

该值是正确。

其他文件和目录的目录项笔者在这里就不再一一分析了,请读者自行研究。

提示:winhex中提供了FAT短文件名的模板,模板名字为“FAT Directory Entry(Nomal/short entry

format)”,如下图:

5.长文件名目录项

FAT32文件系统在为文件分配短文件名目录项的同时会为其分配长文件名目录项。文件系统在为文件创建长文件名(Long File Name,LFN)类型的目录项时,并没有舍弃原有的短文件名目录项,具有LFN的文件同时也有一个常规的SFN(Short File Name,短文件名)类型目录项。之所以仍然需要SFN,是因为LFN目录项只包含文件的名字,而不包括任何有关时间、大小及起始簇号等信息,这些信息仍然需要用SFN目录项来记录。

6.长文件名目录项特性

如果一个文件的文件名超过了8个字符,则会为其名字截短后为其建立短文件名。将短文件名存储在

LFN和SFN目录项结构在相同位置有一个属性标志字节,LFN目录项使用一个特定的属性值,以说明它是一个长文件名项。

项中的其他字节,使用UTF-16编码(UTF-16是Unicode的其中一个使用方式。 UTF是

Unicode/UCS Transformation Format,即把Unicode转做某种格式的意思),存储13个Unicode字符的文件名,每个字符占用两个字节。

如果文件名长于13个字符,则继续为其分配LFN项,知道够用为止。

所有LFN都包含一个校验和,通过这个校验和将其与相应的SFN项关联起来。

一个文件的所有LFN项按倒序排列在它的SFN项前面,即文件名的第一部分距离SFN是最近的。

短文件名目录项中。长文件名则存放在长文件名目录项中。长文件名目录项有以下的特性:

7.长文件名目录项数据结构

详细解释如下:

【1】0x00~0x00:1个字节,长文件名目录项的序列号,一个文件的第一个长文件名序列号为1,然后依次递增。如果是该文件的最后一个长文件名目录项,则将该目录项的序号与0x40进行“或(OR)运算”的结果写入该位置。如果该长文件名目录项对应的文件或子目录被删除,则将该字节设置成删除标志0xE5。

【2】0x01~0x0A:5个字节,长文件名的第1~5个字符。长文件名使用Unicode码,每个字符需要两个字节的空间。如果文件名结束但还有未使用的字节,则会在文件名后先填充两个字节的“00”,然后开始使用0xFF填充。

【3】0x0B~0x0B:1个字节,长目录项的属性标志,一定是0x0F。

【4】0x0C~0x0C:保留。

【5】0x0D~0x0D:1个字节,校验和。如果一个文件的长文件名需要几个长文件名目录项进行存储,则这些长文件名目录项具有相同的校验和。

【6】0x0E~0x19:12个字节,文件名的第6~11个字符,未使用的字节用0xFF填充。

【7】0x1A~0x1B:2个字节,保留。

【8】0x1C~0x1F:4个字节,文件名的第12~13个字符,未使用的字节用0xFF填充。

8.长文件名目录项实例分析

首先我们在根目录下建立一个名字为“”的文件,然后用winhex来看看它的长文件名目录项,如下图:

上面看的第二幅图就是由“”文件的短文件名目录项和长文件名目录项组成。最下面的一个目录项就是该文件的短文件名目录项,我们可以看到,“”文件名被截断,取出前六个字符“AMP3FO”(注意短文件名是不分大小写的),然后加上“~1”,最后加上它的扩展名。由短文件名向上,是它的长文件名目录项。“”共有39个字符,每个长文件名目录项可以记录13个字符,因此需要3个长文件名目录项。短文件名目录项向上第一个小方框卷定的目录项是它的第一个长文件名目录项,向上依次为2、3号,从每个长文件名目录项的第一个字节可以看出他们的序号。

【1】我们先来看第一个内容:

0x0B字节处的“0F”表示这是一个长文件名目录项。

0x00字节处的“01”表示这是该文件的第一个长文件名目录项。

0x01~0x0A字节处的10个字节为文件名的第1~5个字符“amp3f”。0x0E~0x19子接触的12个字节是文件名的第6~11个字符“oryato”,0x1C~0x1F处的4个字节是文件名的第12~13个字符“um”。

【2】第二个长文件名目录项的第一个字节“02”表示这是该文件的第二个长文件名目录项,各部分字节含义由读者自行分析。

【3】第三个长文件名目录项的第一个字节为“43”,是0x40和0x03进行或运算的结果。说明这是该文件的第3个长文件名目录项,也是最后一个。

【4】 我们分别看3个长文件名目录项0x0D字节处的值——0x8B,这是长文件名目录项的校验和。说明这3个目录项同属一个长文件名目录项。

【5】 Winhex也提供了FAT长文件名目录项的模板,如下图:

(注:以上这张图片似乎有点问题,可能与笔者使用的软件版本有关)

9.“.”目录项和“..”目录项

前面曾经介绍过,一个子目录的起始簇,前两个目录为“.”目录项和“..”目录项,子目录通过这 “.”目录项位于子目录起始簇的第一个目录项位置,它用以表明该簇是一个子目录的起始簇。另外,该目录项实际上是对目录自身的描述,它记录了该子目录时间信息、起始簇号等。需要注意的是,它所记录的起始簇号也就是该子目录目前所处的位置。

 “..”目录项位于子目录起始簇的第二个目录项位置,用于描述该子目录的父目录的相关信息。

两个目录项及它在父目录中的目录项建立起父子目录的联系。

下面分析“yatou”目录,如图:

删除一个目录及其文件时丆要将该目录下的文件名开始出设为E5•C以表示该文件已删除丆否则这个文件虽然不可见丆但是占用了空间両

我们重点看两个目录项的簇号描述部分(被标记部分)

第一个目录项也就是“.”目录项,记录的簇号为4号簇,也正是本子目录所在的簇。

第二个目录项记录的簇号为这个子目录的父目录的起始簇号,如果父目录是根目录,则簇号位置全部设置为0。

10.卷目录项

如果创建文件系统时制定了卷标,则会在根目录下第一个目录项项的位置建立一个卷标目录项:

 卷标名最多允许占用长度为11个字节,也就是为短文件名分配的11个文件名区域,如果卷标

名不足11个字节,则用0x20填充。(由于每个汉字占用2个字节空间,而卷标最多允许11个字节,所以用汉字命名卷标时,卷标的长度不能超过5个汉字)。

卷标目录项结构与普通短文件名目录项结构完全相同,但没有创建时间和访问时间,只有一个最后修改时间。

另外,卷标目录项也没有歧视簇号和大小值,这些字节位置全部这只为0,0x0B字节处的属性值为0x08.

11.目录项中时间值的更新

目录项中有三个之间值:最后访问时间、最后写入时间和建立时间。

【1】

【2】

【3】

写到这里,FAT32文件系统的面纱已被我们窥见大半,剩下的功课就由读者自行去做了。关于FAT12/16文件笔者在文中就不再阐述了,其原理和FAT32基本相同,因为FAT12/16是Microsoft早期的文件系统版本,FAT32是从FAT12/16发展而来,只要大家掌握了FAT32,FAT12/16文件系统就很容易了。

下面,我们来总结一下在FAT文件系统下建立和删除一个文件的步骤,来说明FAT文件系统的工作过1.建立文件

假设现在有一个子目录,它的名字是“smart monkey”,我们要在其下建立一个文件“”。建立时间。当windows为一个“新”文件分配目录项时设置建立时间。

最后写入时间。当windows向文件中写入新的内容时,最后写入时间会被更新。

最后访问日期。这个时间只精确到日期,会经常被更新。

程。

使用的文件系统为FAT32,簇大小为4096字节,我们要建立的文件大小为5000个字节。

步骤1:读取位于卷0号扇区的引导扇区,根据引导扇区中的信息定位FAT表、数据区和根目录的位步骤2:遵照“smart monkey”的位置。查看根目录下的每个目录项,寻找名字为“smart monkey”置。

且具有目录属性的目录项。找到后,查看它的起始簇号为3。

步骤3:读取smart monkey的起始簇(3号簇)的内容,查找每个目录项,直到找到一个为分配的目录项。

步骤4:找到可用项后写入文件名“”,并将文件大小和当前时间写入相应的位置。

步骤5:为文件内容分配簇空间。转到FAT表,寻找空闲的位置。发现4号FAT表项未使用,这就说明4号簇是空闲的。将4号簇分配给文件,并在4号簇的FAT表项内写入结束标记。

步骤6:将簇号4写入文件目录项的起始簇号区域。将文件的钱4096字节写入到4号簇中,还剩下904字节,所以还需要再为其分配一个簇。

2.删除文件

现在我们将前面例子中建立的“smart ”文件删除。

步骤1:从卷0号扇区读取引导扇区,根据引导扇区中的信息定位FAT表、数据区和根目录的位置。

步骤2:在根目录下寻找名字为“smart monkey”且具有目录属性的目录项。

步骤3:由“smart monkey”的目录项中获取它的起始簇号为3,到3号簇查看“smart monkey”的步骤7:在FAT表中继续寻找为分配簇,找到5号簇为空闲未使用(因其FAT表项为0)。

步骤8:将文件第一簇(即4号簇)的FAT表项值改写为5,将文件的最后904字节写入5号簇。

步骤9:在5号簇的FAT表项内写入结束标记。

内容,从中找到文件“”的目录项,提取出它的起始簇号,为4号簇。

步骤4:到FAT表中找到该文件的簇链,确定他飞存储位置为4号簇和5号簇。

步骤5:将4号簇和5号簇的FAT项设置为0.

步骤6:将文件“”的目录项的第一个字节改为0xE5。

由于笔者水平有限,出错在所难免。

gdfgd0218@