热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

《NTFS文件系统扇区存储探秘》——1.4文件分配表FAT

本节书摘来自异步社区《NTFS文件系统扇区存储探秘》一书中的第1章,第1.4节,作者:宋群生,宋亚琼著,更多章节内容可以访问

本节书摘来自异步社区《NTFS文件系统扇区存储探秘》一书中的第1章,第1.4节,作者:宋群生 , 宋亚琼著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.4 文件分配表FAT

NTFS文件系统扇区存储探秘
FAT文件系统在管理磁盘上的用户文件时,使用了文件分配表的管理方式。不过系统引导所需要的数据,不在文件分配表的管理范围之内。在这一点上与NTFS文件系统的存储方式是完全不相同的,NTFS文件系统将磁盘上的所有事物都看作文件,不管是用户的还是系统的。

文件分配表在FAT文件系统中占有非常重要的地位,对文件的所有操作,包括读、写、修改和复制,都要依赖于文件分配表中的有关记录。正因为如此,当初设计者将文件分配表作了两份相同的拷贝存储在磁盘上。

1.4.1 扇区分簇管理
操作系统或应用程序在将数据写入一个磁盘文件时,必须在磁盘上找到可以使用的未用扇区。反过来要将数据从磁盘文件中读出时,也要在磁盘上找到已经储存了相应数据的有关扇区。要查找扇区必须知道扇区的地址,文件分配表FAT就是记录扇区地址的。

因为硬盘的扇区非常多,如果将每个扇区的地址都记录在文件分配表里,势必造成文件分配表体积庞大,查找时效率将会很低。为解决这个问题,采用了将扇区分组管理的方法。分组的过程称作扇区分簇,是由高级格式化程序在格式化磁盘时完成的。

扇区分簇以后,将每个簇的地址记录到文件分配表FAT里去。由于一个簇能包含很多扇区,所以文件分配表的体积减小了,查找的速度就提高了。

一个簇能包含多少扇区,是由文件系统和分区的大小决定的,在使用FAT16和FAT32两种文件系统时,分区大小和簇大小以及每簇扇区数的关系见表1-4。
screenshot

1.4.2 簇链和文件检索过程
当使用一个新格式化的逻辑驱动器时,文件数据存放的簇号是连续的。使用一段时间以后,由于经常对文件进行删除、拷贝和修改操作,每个文件分配的簇号就不一定是连续的了。为了确保在存取文件时能够检索到所有连续或不连续的扇区地址,文件分配表采用了“簇链”的记录方式。

当需要从磁盘上读取一个文件时,首先从文件目录表中找到该文件的目录登记项。继而从目录登记项的有关字段,查到分配给该文件的第一个簇号,根据第一簇号的内容可以计算出两组数据。

其中一组数据指出了文件在数据区DATA里的第一簇扇区首地址,从第一簇扇区首地址开始,数据是连续存放的,连续存放多少个扇区由分区格式和分区大小决定,表1-4中列出了它们的对应关系。

另外一组数据指出了FAT表内簇登记项的地址,如果其值是结束标志“ffffH”(FAT16格式)或“0fffffffH”(FAT32格式),说明文件至此已经结束。如果不是结束标志,则该登记项的值为第二个簇号,据此又可以计算出两组数据,继而确定文件在数据区里第二簇扇区首地址和FAT表内第二个簇登记项的地址。

继续重复上面的过程,就可以得到文件在DATA区里的全部数据,以及文件在FAT表里所有簇登记项的地址。

详细了解文件数据存取的全过程,就可以从遭到破坏、不能启动的硬盘上,利用读取物理硬盘扇区的工具程序把文件数据读出来。

当需要在磁盘上建立一个新文件时,首先顺序检索FAT表,找到第一个可用簇,可用簇登记项的值为“0000H”(FAT16)或“00000000H”(FAT32)。将该簇作为起始簇,写入文件目录表FDT的相关登记项的起始簇字段中。然后继续检索后面的可用簇,找到以后将其簇号写入第一个可用簇项内。

按照以上过程进行下去,将满足文件长度所需的簇数全部找到。使每一个簇项的值指向下一个所需簇项,在最后的簇登记项内写入结束标志“ffffH”(FAT16)或“0fffffffH”(FAT32),于是一条能够检索整个文件的“簇链”就形成了。

当需要对文件进行扩展时,先检索FAT表,找到1可用簇。将簇项的内容置为结束标志,并将文件原来的最后簇项值修改为指向此可用簇。以此类推,直到满足文件的全部扩展要求。

当删除文件时,除了将文件目录表中登记项的第1字节改为e5H,还要把该文件在FAT表的“簇链”中所对应的簇项全部清零,这些被清零的簇项又可以供其他文件使用。不过在删除文件的操作结束以后,目录登记项的其他字段仍然保存完好,只是文件名的第1字节变成了e5H,并且文件存储在扇区里的所有数据仍然存在。这时只要FAT表中被清零的簇项没有被新文件使用,就可以运行相关软件恢复被删除的文件。

FAT表记录了磁盘文件对磁盘使用情况的信息,其中包含所有未分配的、已分配的或标记为坏的盘簇的信息。

FAT表只记录磁盘文件对磁盘的占用信息,对于系统保留的控制信息并不由FAT表中的盘簇表示。这些保留信息包括引导扇区、分区表、FAT表本身占用的扇区以及文件目录表FDT占用的扇区。

1.4.3 FAT表扇区寻址
FAT表在磁盘文件系统中的地位是非常重要的,为了使磁盘文件的操作安全可靠,文件系统的设计者们制订了两个内容相同的FAT表。虽然当第一个FAT表出错时,操作系统并不利用第二个FAT表去修复它,但技术人员可以使用有关的软件,用第二个FAT表去修复它。

当硬盘的系统控制信息遭到轻微的破坏时,可以通过各种方法去修复它。如上面所讲的四部分系统保留信息,在某一部分出现错误时,可以采用从其他计算机上移植的方法,或是采用手工编制扇区数据的方法进行修复。

但是当这些控制信息严重损坏,譬如分区表链和分区引导记录严重损坏时,上述方法就无能为力了。一般来说,在这种情况下只有重新分区、格式化,硬盘上的所有数据也就全部丢失了。

硬盘的系统控制信息遭到破坏时,一般情况下FAT表被破坏的可能性比较小。特别是第2个FAT表一般能够保存完好,因为第2个FAT表很少受到应用程序的访问。这时如果使用物理硬盘扇区的读写技术,就有可能从硬盘上恢复出重要数据来。这种操作的对象是针对整个硬盘,而不用考虑硬盘的分区情况,也不用考虑硬盘上安装的是什么操作系统。

查找FAT表首扇区地址的方法很简单,可以根据FAT表的特征标记,使用查找扇区特征的工具程序进行查找。不管是FAT16文件系统还是FAT32文件系统,每个FAT表的首扇区里前两字节都是F8 FF。



推荐阅读
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 三星W799在2011年的表现堪称经典,以其独特的双屏设计和强大的功能引领了双模手机的潮流。本文详细介绍其配置、功能及锁屏设置。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • CentOS 7 磁盘与文件系统管理指南
    本文详细介绍了磁盘的基本结构、接口类型、分区管理以及文件系统格式化等内容,并提供了实际操作步骤,帮助读者更好地理解和掌握 CentOS 7 中的磁盘与文件系统管理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 本文探讨了如何在发布 XenApp 应用时,通过命令行参数实现启动时的参数传递。特别介绍了静态和动态参数传递的方法,并详细解释了 ICA 文件中两种参数传递方式的区别及安全检查机制。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
author-avatar
lucky2502882647
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有