【一、FAT概述】

FAT(File Allocation Table)是一种由微软发明并拥有部分专利的文件系统,供MS-DOS使用,也是所有非NT核心的微软窗口使用的文件系统。FAT是“文件分配表”的意思,顾名思义,就是用来记录文件所在位置的表格,它对于硬盘的使用是非常重要的,假若丢失文件分配表,那么硬盘上的数据就会因无法定位而不能使用了。

FAT文件系统考虑当时电脑性能有限,所以未被复杂化,因此几乎所有个人电脑的操作系统都支持。其中我们接触最多的是FAT16、FAT32文件系统。

FAT有一个严重的缺点:当文件删除后写入新数据,FAT不会将文件整理成完整片段再写入,长期使用后会使文件数据变得逐渐分散,而减慢了读写速度。碎片整理是一种解决方法,但必须经常重组来保持FAT文件系统的效率。

【二、FAT16与FAT32介绍】

FAT16使用了16位的空间来表示每个扇区(Sector)配置文件的情形,故称之为FAT16;FAT32同理。

FAT16由于受到先天的限制,因此每超过一定容量的分区之后,它所使用的簇(Cluster)大小就必须扩增,以适应更大的磁盘空间。所谓簇就是磁盘空间的配置单位,就像图书馆内一格一格的书架一样。每个要存到磁盘的文件都必须配置足够数量的簇,才能存放到磁盘中。FAT16各分区与簇大小的关系如下表:

分区大小 FAT16簇大小
16MB-127MB 2KB
127MB-255MB 4KB
256MB-511MB 8KB
512MB-1023MB 16KB
1024MB-2047MB 32KB

FAT32文件系统使用了32bit宽的簇地址,所以称为FAT32。但是值得注意的一点是,在微软件的文件系统中只使用了低28位,最大容量为2^28*1024*32,约8.7TB的空量。FAT32各分区与簇大小的关系如下表:

分区大小 FAT32簇大小
32MB-259MB 512B
260MB-8GB 4KB
8GB-16GB 8KB
16GB-32GB 16KB
32GB以上 32KB

同FAT16相比,FAT32主要具有以下特点:
1. FAT32最大的优点是可以支持的磁盘大小达到2TB(2048GB),但是不能支持小于512MB的分区。
2. 由于采用了更小的簇,FAT32文件系统可以更有效率地保存信息。如两个分区大小都为2GB,一个分区采用了FAT16文件系统,另一个分区采用了FAT32文件系统。采用FAT16的分区的簇大小为32KB,而FAT32分区的簇只有4KB的大小。这样FAT32就比FAT16的存储效率要高很多。

有一点需要注意的是,FAT32 将记录簇链的二进制位数扩展到了32 位,32 位二进制位的簇链决定了FAT表最大可以寻址2T个簇。这样即使簇的大小为1 扇区,理论上仍然能够寻址1TB范围内的分区。但实际中FAT32 是不能寻址这样大的空间的,随着分区空间大小的增加,FAT表的记录数会变得 臃肿不堪,严重影响系统的性能。所以在实际中通常不格式化超过32GB的FAT32 分区。WIN2000及之上的OS已经不直接支持对超过32GB的分区格式化成FAT32。

【三、FAT文件系统结构】

主引导区 文件
分配表#1
文件
分配表#2
根目录 其他所有数据...
剩下磁盘空间

一个FAT文件系统包括四个不同的部分。

  1. 保留扇区,位于最开始的位置。第一个保留扇区是引导区(分区启动记录)。它包括一个称为基本输入输出参数块的区域(包括一些基本的文件系统信息尤其是它的类型和其它指向其它扇区的指针),通常包括操作系统的启动调用代码。保留扇区的总数记录在引导扇区中的一个参数中。引导扇区中的重要信息可以被DOS和OS/2中称为驱动器参数块的操作系统结构访问。

  2. FAT区域。它包含有两份文件分配表,这是出于系统冗余考虑,尽管它很少使用,即使是磁盘修复工具也很少使用它。它是分区信息的映射表,指示簇是如何存储的。

  3. 根目录区域。它是在根目录中存储文件和目录信息的目录表。在FAT32下它可以存在分区中的任何位置,但是在早期的版本中它永远紧随FAT区域之后。

  4. 数据区域。这是实际的文件和目录数据存储的区域,它占据了分区的绝大部分。通过简单地在FAT中添加文件链接的个数可以任意增加文件大小和子目录个数(只要有空簇存在)。然而需要注意的是每个簇只能被一个文件占有,这样的话如果在32KB大小的簇中有一个1KB大小的文件,那么31KB的空间就浪费掉了。

【四、文件系统引导原理】

4.1 MBR(master boot record)扇区:

说,电脑启动分几步:

(1) 按下计算机power键以后,开始执行主板bios程序。

(2) 进行完一系列检测和配置以后, 开始按bios中设定的系统引导顺序引导系统。

(3)假定现在是硬盘,Bios执行完自己的程序后把执行权交给硬盘。

(4) 交给硬盘后执行存储硬盘上的系统程序。

这里问:Bios执行完自己的程序后如何把执行权交给硬盘呢?交给硬盘后又执行存储在哪里的程序呢?

其实,称为mbr的一段代码起着举足轻重的作用。MBR(master boot record), 即主引导记录,有时也称主引导扇区。位于整个硬盘的0柱面0磁头1扇区(可以看作是硬盘的第一个扇区),bios在执行自己固有的程序以后就会jump到mbr中的第一条指令。将系统的控制权交由mbr来执行。

在总共512byte的主引导记录中,

a, MBR的引导程序占了其中的前446 个字节(0x0h~0x1BDH),

b, 随后的64个字节(0x1BEH~0x1FDH)为DPT(Disk PartitionTable,硬盘分区表),

c, 最后的两个字节“55 AA”(0x1FEH~0x1FFH)是分区有效结束标志。

MBR不随操作系统的不同而不同,意即不同的操作系统可能会存在相同的MBR,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。

我们来欣赏一段mbr。下面是用winhex查看的一块SanDisk U盘的mbr(手边现在没有SSD了,拿U盘来顶一下)。

你的硬盘的MBR 引导代码可能并非这样。不过即使不同,所执行的功能大体是一样的。

我们看DPT 部分。操作系统为了便于用户对磁盘的管理。加入了磁盘分区的概念。即将一块磁盘逻辑划分为几块。

在DPT 共64 个字节中,以16个字节为分区表项单位描述一个分区的属性。也就是说,第一个分区表项描述一个分区的属性,一般为基本分区。第二个分区表项描述除基本分区外的其余空间,一般而言,就是我们所说的扩展分区。

因为这块U盘只有一个分区,所以我们只在上图中DPT的前16个字节看到有效数据。这里面有两个比较关键的数据,

(1) 0x01C6-0x01C9(DWORD): 0x148F00代表相对扇区数(Relative Sectors) 从该磁盘的开始到该分区的开始的位移量,以扇区来计算。

(2) 0x01CA-0x01CD(DWORD): 0x037FEC24代表总扇区数(Total Sectors) 该分区中的扇区总数。通过这个参数可以计算分区的容量。

也可以在Winhex里面直接查看:

喜欢算术的童鞋们可以自己算算,然后与Winhex自行计算的结果是否一致。

4.2 扩展分区

扩展分区中的每个逻辑驱动器都存在一个类似于MBR的扩展引导记录( Extended Boot Record, EBR),也有人称之为虚拟mbr或扩展mbr,意思是一样的。扩展引导记录包括一个扩展分区表和该扇区的标签。扩展引导记录将记录只包含扩展分区中每个逻辑驱动器的第一个柱面的第一面的信息。一个逻辑驱动器中的引导扇区一般位于相对扇区32 或63。但是,如果磁盘上没有扩展分区,那么就不会有扩展引导记录和逻辑驱动器。

通过一幅4分区的磁盘结构图可以看到磁盘的大致组织形式。

【五、FAT分区原理】

从前面的磁盘结构图可以看到基本分区有两部分组成:引导扇区+数据区。这部分我们着重研究FAT 格式分区内数据是如何存储的。

下面依次解释DBR、FAT1、FAT2、根目录、数据区、剩余扇区的概念。

5.1 DBR

DBR区(DOS BOOT RECORD)即操作系统引导记录区的意思,通常占用分区的第0扇区共512 个字节(特殊情况也要占用其它保留扇区,我们先说第0 扇)。

在这512 个字节中,其实又是由跳转指令,厂商标志和操作系统版本号,BPB(BIOS Parameter Block),扩展BPB,OS引导程序,结束标志几部分组成。

下面以用的最多的FAT32 为例说明分区DBR各字节的含义(这里还是拿U盘顶一下):

0x00: 3个字节,代表跳转指令;

0x03: 8个字节,代表厂商标志和OS版本号;

0x0B: 53个字节,代表BPB;

0x40: 26个字节,代表扩展BPB;

0x5A: 420个字节,代表引导程序代码;

0x1FE: 2个字节,代表有效结束标志;

MBR将CPU执行转移给引导扇区,因此,引导扇区的前三个字节必须是合法的可执行的基于x86 的CPU指令。这通常是一条跳转指令,该指令负责跳过接下来的几个不可执行的字节(BPB和扩展BPB),跳到操作系统引导代码部分。

跳转指令之后是8 字节长的OEM ID,它是一个字符串, OEM ID标识了格式化该分区的操作系统的名称和版本号。

DBR的偏移0x5A开始的数据为操作系统引导代码。这是由偏移0x00 开始的跳转指令所指向的。在上图中所列出的跳转指令"EB 58 90" 清楚地指明了OS引导代码的偏移位置。如EB 58,即跳转到58h处,紧接着跳转指令的是一条空指令NOP(90),即开始于0x5A。此段指令在不同的操作系统上和不同的引导方式上,其内容也是不同的。

注:FAT16的跳转指令=EB 3C 90(FAT16现在基本不用了,在这里就不详细介绍了), NTFS的跳转指令=EB 52 90(NTFS后续会介绍)

5.2 保留扇区

在上述FAT文件系统DBR的偏移0x0E 处,用2 个字节存储保留扇区的数目。所谓保留扇区(有时候会叫系统扇区,隐藏扇区), 是指从分区DBR扇区开始的仅为系统所有的扇区,包括DBR扇区。在FAT16 文件系统中,保留扇区的数据通常设置为1,即仅仅DBR 扇区。而在FAT32 中,保留扇区的数据通常取为32,有时候用Partition Magic 分过的FAT32 分区会设置36 个保留扇区,有的工具可能会设置63 个保留扇区。

FAT32 中的保留扇区除了磁盘总第0扇区用作DBR,总第2扇区(win98系统)或总第0xC 扇区(win2000,winxp)用作OS 引导代码扩展部分外,其余扇区都不参与操作系统管理与磁盘数据管理,通常情况下是没作用的。

操作系统之所以在FAT32 中设置保留扇区,是为了对DBR作备份或留待以后升级时用。FAT32中,DBR 偏移0x32 占2 字节的数据 指明了DBR备份扇区所在,一般为0x06,即第6扇区。当FAT32 分区DBR扇区被破坏导致分区无法访问时。可以用第6扇区的原备份替换第0扇区来找回数据。

5.3 FAT表和数据的存储原则。
FAT 表(File Allocation Table 文件分配表),是Microsoft 在FAT 文件系统中用于硬盘数据(文件)索引和定位引进的一种链式结构。假如把硬盘比作一本书,FAT 表可以认为相当于书中的目录,而文件就是各个章节的内容。但FAT 表的表示方法却与目录有很大的不同。

在FAT文件系统中,文件的存储依照FAT 表制定的簇链式数据结构来进行。同时,FAT文件系统将组织数据时使用的目录也抽象为文件,以简化对数据的管理。

FAT的形成过程是:硬盘格式化后,用户文件以簇为单位存放于DATA区中,每个文件至少一簇,有的多簇,簇号不连续,但是会形成链,这个链就记录在FAT中。

下面为FAT16 Vs FAT32的组织形式对比:

a, FAT16的组织形式:

b, FAT32的组织形式:

下面为FAT16 Vs FAT32中簇号取值以及含义:

FDT(File Directory Table)表即为文件目录表,也称为根目录区或ROOT区。用格式化命令(FORMAT)对硬盘(或逻辑盘)进行格式化的时候,就已经为整个硬盘建立了一个根目录FDT。FDT位于第二个FAT表之后,只有当FAT表不能定位文件在硬盘中的位置时,FAT才需和FDT配合以便能准确定位文件的位置。

FDT的具体定义如下:

六、实例:FAT32中查看文件FDT,FAT

首先现在U盘里面新建一个名为“test”的.txt文档,写入一部分内容如下图:

接下来,将会依次进行以下步骤:

(1) 首先Winhex打开U盘,找到MBR。
(2) 其次找到DBR,

(3) 由DBR(BPB)计算FAT首地址。
(4) 由DBR及FAT推算出FDT位置。
(5) 从FDT中查找文件起始簇号。
(6) 按照簇号计算FAT中的位置。
(7) 按照簇链的结构依次找到该文件所在各个扇区,并读出其内容。

具体如下:
(1) 首先Winhex打开U盘,找到MBR,

偏移0x1C6h~0x1C9h处计算出: 本分区开始扇区=0x00148F00=1347328, 也是DBR扇区,

(2) 其次找到DBR,

(3) 由DBR(BPB)计算FAT首地址。

偏移0x0Dh处计算出: 每簇包含扇区数=0x20h=32,

偏移0x0Eh~0x0Fh处计算出: 保留扇区数=0x0020h=32,

偏移0x1Ch~0x1Fh处计算出: 隐藏扇区=0x00148F00=1347328,

偏移0x24h~0x27h处计算出: 每个FAT包含的扇区数=0x00003800=14336,

偏移0x2Ch~0x2Dh处计算出: 根目录起始簇=0x002h=2号簇,

FAT1起始扇区=DBR扇区+保留扇区数

=1347328+32=1347360

FAT2起始扇区=DBR扇区+保留扇区数+每个FAT包含的扇区数

=1347328+32+14336=1361696

根目录起始扇区 = DBR扇区+保留扇区数 + 一个FAT的扇区数 * FAT表个数 + (起始簇号-2) * 每簇的扇区数= 1347328+32+14336*2+(2-2)*32= 1376032

FAT32没有独立的根目录区,它的根目录放在数据区,

所以,DATA区起始位置=根目录起始扇区=1376032

(4) 由DBR及FAT推算出FDT位置。

利用Winhex 跳转功能,跳转至扇区1376032,即FDT所在位置,

(5) 从FDT中查找文件起始簇号。

上面第(4)步找到了FDT的起始位置,现在要先找到“test.txt”所在的FDT位置,如下图:

根据FDT的具体定义,我们可以得到:

文件簇号=0x00061836=399414,

(6) 按照簇号计算FAT中的位置。

根据第(5)步计算得到的簇号,我们可以得到:

文件簇号起始扇区=DATA区起始扇区+(簇号-2)*每个簇中包含的扇区数=1376032 + (399414-2) * 32=14157216

(7) 按照簇链的结构依次找到该文件所在各个扇区,并读出其内容。

利用Winhex的跳转功能,跳转至扇区14157216,如下图:

历尽千辛万苦,终于定位到我们最初见的文件啦~是不是很有成就感呢~

感兴趣的话,自己一定要尝试一下哦,会有很大的收获~

硬盘文件系统系列之FAT相关推荐

  1. 文件系统系列专题之 Btrfs

    一.Btrfs概述 Btrfs(B-tree 文件系统,通常念成 Butter FS,Better FS或B-tree FS),一种支持写入时复制(COW)的文件系统,运行在 Linux 操作系统上. ...

  2. (2021) 25 [持久化] 文件系统实现:FAT和UNIX文件系统

    (2021) 25 [持久化] 文件系统实现:FAT和UNIX文件系统 南京大学操作系统课蒋炎岩老师网络课程笔记. 视频:https://www.bilibili.com/video/BV1HN411 ...

  3. 常用存储芯片-笔记本上固态硬盘PTS11系列推荐

    在存储领域中,除了存储颗粒之外,还有一种极其重要的芯片:存储控制芯片.存储控制芯片是CPU与存储器之间数据交换的中介,决定了存储器最大容量.存取速度等多个重要参数.特别是在AI.5G.自动驾驶时代,对 ...

  4. 采用链接分配方式进行外存分配时,可采用的两种形式及其特点。假定磁盘块大小为4K,对于128G的硬盘,其文件分配表FAT需占用多少存储空间?

    采用链接分配方式进行外存分配时,可采用的两种形式及其特点.假定磁盘块大小为4K,对于128G的硬盘,其文件分配表FAT需占用多少存储空间? 隐式链接:除文件的最后一个盘快外,每个盘快中都存有指向下一个 ...

  5. linux 挂载硬盘_Linux系列教程(十八)——Linux文件系统管理之文件系统常用命令...

    大家好,我是可乐,一个专注原创,乐于分享的程序猿.本系列教程持续更新,可以微信搜索「 IT可乐 」第一时间阅读.回复<电子书>有我为大家特别筛选的海量免费书籍资料 通过前面两篇博客,我们介 ...

  6. Linux 硬盘/文件系统的管理

    一.硬盘管理 1.硬件设备与文件名的对应关系 (1)在Linux系统中,每个设备都被当初一个文件来对待 (2)各种设备在Linux中的文件名: 2.查看硬盘详细信息:fdisk -l 硬盘文件名 第一 ...

  7. SSD固态硬盘文件系统选择与性能优化

    最近由于工作需要,对ext3, ext4, reiserfs, reiser4, xfs, jfs, btrfs, nilfs2, logfs多种文件系统在SSD固态硬盘上的性能进行了全面的测试评估与 ...

  8. linux把文件系统格式化成fat

    网上查的mkfs -t ext4 /dev/sdb1似乎不支持fat: sudo mkfs.vfat -F 32 /dev/sdb1 (12,16,32) 格式化成extfat: sudo apt i ...

  9. IO存储,硬盘,文件系统相关常识总结

    目录 1.文件操作----IO 2.硬盘 3. 文件 3.1 文本文件 3.2 二进制文件 4.路径 4.1 相对路径 4.1.1 基准目录 4.2 绝对路径 1.文件操作----IO I指的是Inp ...

  10. 机械硬盘文件系统RAW要怎样办啊

    文件系统RAW说明这个盘的文件系统结构损坏了.在平时如果数据不重要,那么可以直接格式化就能用了.但是有的时候里面的数据很重要,那么就必须先恢复出数据再格式化.具体恢复方法可以看正文了解(不格式化的恢复 ...

最新文章

  1. WMI技术介绍和应用——查询文件夹信息
  2. 从此以后,江湖有了它的传说!
  3. python数据分析从入门到精通电子工业出版社_荐书丨Python数据分析从入门到精通...
  4. python一个月能学成嘛-Python 从入门到精通:一个月就够了!
  5. 垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
  6. Html 教程 (5) 表格标签
  7. 不允许使用不完整的类型_河南:限速标志不达标,坚决不允许通车!
  8. matlab 主成分 分类,matlab主成分分析
  9. http响应协议分析
  10. javascript闭包—围观大神如何解释闭包
  11. C# 泛型多种参数类型与多重约束 示例
  12. mysql里面的页面筛选_【mysql】像很多网站(比如电商)里的筛选功能一般是如何实现的?...
  13. MySQL Spatial Extensions 地理信息
  14. CentOS 6.5 + Nginx 1.8.0 + PHP 5.6(with PHP-FPM) 负载均衡源码安装 之 (三)Nginx负载均衡配置...
  15. Android WebView中那些不得不解决的坑~~
  16. 验证性因子分析(一)
  17. 苹果appstore中兑换码的使用方法
  18. mysql database alias_mysql小结——基础篇
  19. zoho邮箱收费和免费区别_集成MS Office和您的Zoho在线帐户
  20. 同步器Synchronizer

热门文章

  1. java代码格式化的快捷键设置_如何使用VS中的快捷键快速格式化代码使好看,整齐...
  2. 商务与经济统计 --假设检验
  3. Unexpandable Clocks不可扩展时钟 UG903
  4. 《shard 入门精要》冯乐乐
  5. 文档型数据库Mongodb
  6. 【IOS逆向】基本环境配置和脱壳初体验
  7. 数据采集集成-网络数据采集(一)
  8. java jbutton 禁用_java – 在后台作业时禁用JButton,以避免多次单击
  9. u8转完看不到菜单_进入软件后所有菜单栏都不显示
  10. API接口性能测试应该关注哪些指标