一、 FAT 表概述

位置: 紧跟在文件系统的“保留区”之后 ; 有两个数据结构完全相同的FAT(FAT,File Allocation Tbale 文件分配表)组成。

作用: FAT表项,描述文件系统内的簇分配状态,说明文件系统内数据所分配的连续簇的顺序关系(即表明文件或目录的下一簇的序号)。

常规规则:
· 数量: 通常情况下一个FAT 文件系统会有两个FAT 表, 但有时候也会允许只有一个FAT 表, FAT 表的具体个数记录在引导扇区的 偏移 0x10 字节处。
· 位置: 因为FAT区位于文件系统的保留区之后,所以FAT1在文件系统中的位置可以通过引导记录中偏移0x0E~0x0F 字节处的“保留扇区”数得到。
· FAT2 紧跟在FAT1之后, 它的位置可以通过FAT1的位置加上每个FAT 表的大小扇区数获得。

FAT 表中记录了每个文件的簇链结构; FAT 表中记录的与数据区簇对应的表项,从0号标记开始至当前数据区所分配的簇的最大数值,记录簇信息到FAT 项;但是注意:其中 0号~1号簇的值都是操作系统预先不留设定的特殊标记,而数据区的起始簇是2号簇。

二、、FAT 表的特性

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

· FAT32 中每个簇的状态,使用32bit(4字节)记录在FAT表中。 FAT 表中的所有字节位置以
4个字节为单位进行划分;并以所有划分后的位置由0进行地址编号。“0号 和 1号” 地址被系统保留并存储特殊标识内容。从 2号 地址开始,
每个地址对应于数据区的簇号, FAT 表中的地址编号与数据区中的簇号相同。 称FAT 中的这些四字节一组划分的项的地址为 FAT 表项 FAT表项中记录的值为FAT 表项值。(簇编号与簇内内容关系如果 Map中的键-值 关系相同)

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

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

· 当某个簇被分配使用时,那么他所对应的FAT表项的值为文件的下一个存储文件的簇号。 如果该文件结束于该簇,则在它的FAT表项中记录的是一个文件结束标记,对于FAT32 而言,代表文件结束的FAT表项值为0x0FFFFFFF。
· 如果某个簇存在坏扇区,则整个簇会用FAT 表项值 0x0FFFFFF7 标记为坏簇, 不再使用,这个坏簇标记就记录在它所对应的FAT表项中。

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

注意: 可以搜索扇区偏移0字节处的该值(F8FFF0F)以查找FAT表。

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

 

项内容填写规则:

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

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

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

三、 FAT表的使用

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

如果一个簇所对应的FAT表项的表项值为非零, 则表明该簇已经被分配使用了,但是这时表项值可能为两种情况,一个是一个文件的下一个簇号值,也有可能是一个文件的结束标记0x0FFFFFFF,或者是一个坏簇标记0x0FFFFFF7 。
如果要寻找一个文件的下一个簇,只需要查看该文件的目录项中描述的起始簇号所对应的FAT项,如果该文件只有一个簇,则此处的值为一个结束标记0x0FFFFFFF;如果该文件不只一个簇,则此处 的值是它的下一个簇的簇号。

>> 查询簇连接结构模拟步骤:

当我们要寻找某个文件时, 首先从该文件的“目录项”中获取该文件的第一“簇”的簇号,然后根据“第一簇”的“簇号 N”,然后根据N 从FAT区的FAT表找出N簇号所对应的FAT 表项,查看FAT 表项的内容:
若是文件结束,该表项值为 0x0FFFFFFF;
若是没有结束,而该文件的大小超出一个簇,则N所对应的FAT表项的表项值为该文件下一个簇的簇号,然后再找到下一个簇号N+1
所对应的FAT表项,查看其表项值,依次类推,就推出了一个文件在FAT表中的 簇链连接结构; 也或者表项值为 0xFFFFFFF7 坏簇标识。

>> 其他

查找FAT 表项: 要找到一个簇的FAT 表项,只要用他的 簇号乘以每个FAT 表项的字节数即可 。对于FAT32而言,每个FAT 表项占用4个四字节, 如果我们寻找9号簇的表项位置,则用 4*9=36,也就是说位于FAT 表内偏移36(0x24)字节处。

注意:
WinHex 提供了直接跳转到某个指定FAT 表项的功能。

文件系统大小的上限值却绝育FAT 项的大小。 簇链中的每个FAT 项记录着下一个簇的簇地址,FAT
项所能表示的数字有一个上限,这个上限也就是文件系统中的最大簇号。 FAT 32文件系统的FAT 项只使用了32bit 中的28bit
,因此只能描述 268435456个簇(实际上还要考略小于这个值,因为这其中还包含了结束标志及坏簇标志的保留值)。

操作系统通过检测FAT 表中的表项来确定文件系统中的各个簇是否被分配使用。当我们在Windows 下右击某个FAT 分区查看其属性时,显示的已用空间和未用空间就是根据FAT 表统计而来的。

有时我们会遇到,查看属性时发现已用空间并没有减少,但存储的文件却不见了。这是因为某些病毒在某些文件的目录项中写入了删除标记,但并没有清楚FAT 表内的簇链所至。

FAT32 FAT区__FAT表解析的更多相关文章

  1. MBR区、DBR区、FAT区、DIR区和DATA区的区别

    来自:互联网 磁盘上的数据按照其不同的特点和作用大致可分为5部分:MBR区.DBR区.FAT区.DIR区和DATA区.我们来分别介绍一下: (1)MBR区(主引导扇区) MBR(Main Boot R ...

  2. PE格式第九讲,资源表解析

    PE格式第九讲,资源表解析 一丶熟悉Windows管理文件的方法 首先,为什么标题是这个,主要是为了下边讲解资源方便,因为资源结构体很乱.如果直接拿出来讲解,那么就会很晕. 1.windows管理文件 ...

  3. 10月16日上午MySQL数据库作业设计表解析

    作业设计表:多张表存储学生成绩及各种信息 需要从表里面体现: 关于学生的:代号 姓名 性别 年龄 班级 关于课程的:代号 名称 关于老师的:代号 姓名 关于成绩的:例如:闫超--网页--90 要能查看 ...

  4. PE解析器的编写(四)——数据目录表的解析

    在PE结构中最重要的就是区块表和数据目录表,上节已经说明了如何解析区块表,下面就是数据目录表,在数据目录表中一般只关心导入表,导出表和资源这几个部分,但是资源实在是太复杂了,而且在一般的病毒木马中也不 ...

  5. oracle xmltype导入并解析Excel数据 (一)创建表与序

    表说明: T_EXCEL_IMPORT_DATASRC: Excel数据存储表,(使用了xmltype存储Excel数据) 部分字段说明: BUSINESSTYPE: Excel模板类型,一个Exce ...

  6. SD卡中FAT32文件格式快速入门(图文详细介绍)【转】

    本文转自:http://blog.csdn.net/mjx91282041/article/details/8904705 说明: MBR :Master Boot Record ( 主引导记录) D ...

  7. U盘FAT32文件系统

    一.FAT文件系统分为四个部分 参考别人的博客 1.http://blog.163.com/ourhappines@126/blog/static/121363154201311811495492/ ...

  8. SD卡FAT32文件系统格式

    一.声明 1.本文来源和主旨 2.本文测试环境 二.SD卡FAT文件系统 1.SD卡FAT32文件系统的整体布局 2.FAT文件系统简介 ① 文件分配表 ② 目录项 三.DBR(DOS BOOT RE ...

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

    说明: MBR :Master Boot Record ( 主引导记录) DBR :DOS Boot Record ( 引导扇区) FAT :File Allocation Table ( 文件分配表 ...

随机推荐

  1. 【leetcode】Palindrome Number

    题目简述: Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could n ...

  2. 全局变量 HInstance 到底是在什么时候赋值的?

    在学习 资源文件 和 钩子函数 时, 经常用到当前模块句柄(HInstance)这个全局变量. 今天特别想知道, 它到底是在什么时候给赋值的. 输入 HInstance; "Ctrl+鼠标& ...

  3. JS传递对象数组为参数给后端,后端获取

    前端JS代码: var conditons = []; var test1 = new Object(); test1.name="1"; test1.id="2&quo ...

  4. js中关于value的一个小知识点(value既是属性也是变量)

    今天在学习input的value值时,发现这么一个小知识点,以前理解不太透彻. [1]以下这种情况是常见情况,会弹出“测试内容” <input type="button" v ...

  5. JMS中的消息通信模型

    1. MQ简介: 消息队列(Message Queue,简称MQ),是应用程序与应用程序之间的一种通信方法.应用程序通过发送和检索出入列队的针对应用程序的数据 - 消息来通信,而无需专用连接来链接它们 ...

  6. 35-less 简明笔记

    分屏显示文本文件 less [options] [file-list] less与more类似,但比more更加完善 例如:在显示一屏文本之后,less将显示提示副等待下一条命令的输入;可以向前或向后 ...

  7. U3D自定义Inspector项未触发保存事件的解决方案

    1.问题描述与解决方案 1.1.说明 应该只有起步做U3D编辑器插件的部分同行需要了解本文. 该问题源于在做UI插件的时候,发现Inspector面板上手动修改值后,没有触发U3D编辑器本身的修改事件 ...

  8. mysql中char,varchar与text类型的区别和选用

    关于char,varchar与text平时没有太在意,一般来说,可能现在大家都是用varchar.但是当要存储的内容比较大时,究竟是选择varchar还是text呢?不知道...... 于是去查阅了一 ...

  9. 怎么样 解决nginx负载均衡的session共享问题呢

    php服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态,下面提供了几种方式来解决ses ...

  10. Capturing Audio &amp; Video in HTML5

    使用HTML5抓取 Audio & Video 原文地址: http://www.html5rocks.com/en/tutorials/getusermedia/intro/ 本地化的文章: ...