• 文件分配表


    FAT是DOS、Windows9X系统的文件寻址格式,位于DBR之后。
    在解释文件分配表的概念的时候,我们有必要谈谈簇(Cluster)的概念。文件占用磁盘空间,基本单位不是字节而是簇。一般情况下,软盘每簇是1个扇区,硬盘每簇的扇区数与硬盘的总容量大小有关,可能是4、8、16、32、64……同一个文件的数据并不一定完整地存放在磁盘的一个连续的区域内,而往往会分成若干段,像一条链子一样存放。这种存储方式称为文件的链式存储。由于硬盘上保存着段与段之间的连接信息(即FAT),操作系统在读取文件时,总是能够准确地找到各段的位置并正确读出。
    为了实现文件的链式存储,硬盘上必须准确地记录哪些簇已经被文件占用,还必须为每个已经占用的簇指明存储后继内容的下一个簇的簇号。对一个文件的最后一簇,则要指明本簇无后继簇。这些都是由FAT表来保存的,表中有很多表项,每项记录一个簇的信息。由于FAT对于文件管理的重要性,所以为了安全起见,FAT有一个备份,即在原FAT的后面再建一个同样的FAT。初形成的FAT中所有项都标明为“未占用”,但如果磁盘有局部损坏,那么格式化程序会检测出损坏的簇,在相应的项中标为“坏簇”,以后存文件时就不会再使用这个簇了。FAT的项数与硬盘上的总簇数相当,每一项占用的字节数也要与总簇数相适应,因为其中需要存放簇号。FAT的格式有多种,最为常见的是FAT16和FAT32。
    当一个磁盘Format后,在其逻辑0扇区(即BOOT扇区)后面的几个扇区中存在着一个重要的数据表—文件分配(FAT),文件分配表一式两份,占据扇区的多小凭磁盘类型大小而定。顾名思义,文件分配表是用来表示磁盘问件的空分配信息的。它不对引导区,文件目录的信息进行表示,也不真正存储文件内容。

    我们知道磁盘是由一个一个扇区组成的,若干个扇区合为一个簇,文件存取是以簇为单位的,哪怕这个文件只有1个字节。每个簇在文件分配表中都有对应的表项,簇号即为表项号,每个表项占1.5个字节(磁盘空间在10MB以下)或2个字节(磁盘空间在10MB以上)。为了方便起见,以后所说的表项都是指2个字节的。


    文件分配表结构如1(H表示16进制)
    表1
    第0字节 表头,表磁盘类型。FFH双面软盘,每次道8扇区FEH单面软盘,每磁道8扇区FDH双面软盘,每磁道9扇区FCCH单面软盘,每磁道9扇区FC8H硬盘
    第1~2字节 (表项号1)表示第一簇状态,因第一簇被系统占据,故此两字节为FFFFH
    第3~4字节 (表项号2)表示第二簇状态,若为FFFH表此簇为坏的,DOS已标记为不能用;0000H表示此簇为空,可以用;FFF8H表不能示该簇为文件的最后一簇;其余数字表示文件的下一个簇号,注意高字节在后,低字节在前。
    第5~6字节 (表项号3)表示第三簇状态,同上。


    注意:
    不要把表项内的数字误认为表示当前簇号,而应是该文件的下一个簇的簇号。.高字节在后,低字节在前是一种存储数字方式,读出时应对其进行调整。是如两字节12H,34H,应调整为3412H。
    文件分配表与文件目录(FDT)相配合,可以统一管理整个磁盘的文件。它告诉系统磁盘上哪些簇是坏的或已被使用,哪些簇可以用,并存储每个文件所使用的簇号。它是文件的“总调度师”。
    当DOS写文件时,首先在文件目录中检查是否有相同文件名,若无则使用一个文件目录表项,然后依次检测FAT中的每个表项对应的簇中,同时将该簇号写入文件目录表项相的26-27字节,如文件长度不止一簇,则继续向后寻找可用簇,找到后将其簇号写入上一次找到的表项中,如此直到文件结束,在最后一簇的表项里填上FFF8H,形成单向链表。
    DOS删除文件时只是把文件目录表中的该文件的表项第0个字节改为E5H,表此项已被删除,并在文件分配表中把该文件占用的各簇的表项清0,并释放空间。其文件的内容仍然在盘上,并没有被真正删除,这就是undelete.exe,unerase.exe等一类恢复删除工具能起作用的原因。
    文件分配表在系统中的地位十分重要,用户最好不要去修改它,以免误操作带来严重的后果。


    FAT表的定位
      硬盘分区的主要结构说明:
    (Cylinder柱面/磁道-Side磁头-Sector扇区地址以下简称为?-?-?)
    《主分区》
    名称 地址 长度(扇区)
    主引导记录(Main Boot Record) 0-0-1 1
    系统扇区(System Secotrs) 0-0-2,0-0-63 62
    引导扇区(Boot) 0-1-1 1
    FAT16系统中,此扇区包含BPB(BIOS Parameter Block)表,描述逻辑盘结构组成,包含隐藏扇区数目(从0-1-1开始计算)、FAT扇区数、FAT拷贝数、硬盘磁头总数、根目录表项最大值等。
    FAT32系统中,BPB表的偏移与FAT16不同,但表项基本相同。整个隐藏扇区部分都作为逻辑盘的描述区域。
    隐藏扇区(Hidden Secotrs):
    FAT16 0-1-1 1
    FAT32 0-1-1 32
    文件分配表(File Allocation Table):
    FAT16 0-1-2 根据逻辑盘容量变化
    FAT32 0-1-33 根据逻辑盘容量变化
    说明:
    FAT16的每个表项由2字节(16位)组成,通常每个表项指向的簇包含64个扇区,即32K字节。
    逻辑盘容量最大为2047MB。
    FAT32的每个表项由4字节(32位)组成,通常每个表项指向的簇包含8个扇区,即4K字节。
    逻辑盘容量最小为512MB。
    对于C分区,在MBR的偏移01c2H处,FAT16为06H,FAT32为0CH。
    有关计算公式为:
    每个扇区长度=512字节
    总簇数=逻辑盘容量/簇容量
    总簇数=FAT表长度(字节)/每个表项长度(字节)-2
    FAT表长度=逻辑盘容量/簇容量*每个表项长度
    FAT表的开始由介质描述符+一串“已占用”标志组成:
    FAT16硬盘----F8 FF FF 7F
    FAT32硬盘----F8 FF FF 0F FF FF FF 0F
    每个有效的FAT结构区包含两个完全相同的拷贝:FAT1、FAT2
    文件目录表(File Directory Table),即根目录区,又称为ROOT区:
    紧跟在FAT2的下一个扇区,长度为32个扇区(256个表项)。如果支持长文件名,则每个表项
    为64个字节,其中,前32个字节为长文件链接说明;后32个字节为文件属性说明,包括文件长
    度、起始地址、日期、时间等。如不支持长文件名,则每个表项为32个字节的属性说明。
    数据区(Data Area):
    紧跟在FDT的下一个扇区,直到逻辑盘的结束地址。
    《扩展分区》
    名称 地址 长度(扇区)
    扩展分区(Extend Partition) ?-y-1 1
    系统扇区(System Secotrs) ?-y-2,?-y-63 62
    引导扇区(Boot) ?-(y+1)-1 1
    其后各项与主分区相同……


    FAT表引起的读写故障

    硬盘文件分配表庞大无法手工修复,只能依靠工具。
    FAT表记录着硬盘数据的存储地址,每一个文件都有一组FAT链指定其存放的簇地址。FAT表的损坏意味着文件内容的丢失。庆幸的是DOS系统本身提供了两个FAT表,如果目前使用的FAT表损坏,可用第二个进行覆盖修复。但由于不同规格的磁盘其FAT表的长度及第二个FAT表的地址也是不固定的,所以修复时必须正确查找其正确位置,一些工具软件如NU等本身具有这样的修复功能,使用也非常的方便。采用DEBUG也可实现这种操作,即采用其m命令把第二个FAT表移到第一个表处即可(不建议这样做)。如果第二个FAT表也损坏了,则也无法把硬盘恢复到原来的状态,但文件的数据仍然存放在硬盘的数据区中,可采用CHKDSK或SCANDISK命令进行修复,最终得到*.CHK文件,这便是丢失FAT链的扇区数据。如果是文本文件则可从中提取出完整的或部分的文件内容。

    软盘文件分配FAT表修复

    在运行某个程序时,有时会在屏幕上看到:File allocation table bad,drive A(文件分配表坏)的错误信息,导致程序不能正常运行。
    我们知道,在磁盘中有两个文件分配表:FAT1和FAT2。FAT1用于日常工作,FAT2备用。因此,在FAT1损坏时,可用FAT2表修补。
    具体方法是:运行DEBUG,将FAT2读入缓冲区,用缓冲区的FAT2数据覆盖磁盘中的FAT1。
    例:修复3寸1.44M软盘,在A驱
    在DOS环境下进入debug环境
    在“-”提示符下进行如下操作:
    -L 100 0 0A 9
    -W 100 0 1 9
    -q
    其它类型的软盘的修复方法参照下表进行。
    起止逻辑扇区 5.25"低密 5.25"高密 3.5"低密 3.5"高密
    BOOT区 0 0 0 0
    FAT1 1-2 1-7 1-3 1-9
    FAT2 3-4 8-0EH 4-6 0A-12H
    例如我们要修复5.25"高密软盘的FAT,则需将上述参数改为:
    -L 100 0 8 7
    -W 100 0 1 7
    -q
  • 相关阅读:
    HDU 5213 分块 容斥
    HDU 2298 三分
    HDU 5144 三分
    HDU 5145 分块 莫队
    HDU 3938 并查集
    HDU 3926 并查集 图同构简单判断 STL
    POJ 2431 优先队列
    HDU 1811 拓扑排序 并查集
    HDU 2685 GCD推导
    HDU 4496 并查集 逆向思维
  • 原文地址:https://www.cnblogs.com/top5/p/1757831.html
Copyright © 2020-2023  润新知