Introduction

Format 格式化时,已对磁盘建立了一个根目录 FDT(File Directory Table)。

  • 在根目录下用户可以创建不同子目录或文件 根目录下的所有文件及其子目录有一个目录登记项。The directory entry of directory indicated the root directory address and its length is 0 byte. The directory entry of files indicates the data address.
  • 根目录以及各个子目录都有自己的 FDT(文件目录表)。
  • DOS 中用“[盘符:] ”表示根目录
  • 注意: 我们讨论的默认是 x86, 采用小端模式,高字节高地址存储。

由于 FAT16 与 FAT32 有些区别,所以下面我们分开讲述。

FAT16's FDT

在 FAT16 分区格式中,FDT 表的长度是固定的,为 32 个扇区

  • 每个目录登记项 32 个字节,分 8 个区域,提供文件目录信息。
  • 最多保存 512 个文件或子目录。
  • 扇区个数(32)*每个扇区大小(512)=每个目录项大小(32 字节)*目录项最大个数(512)

Layout

FAT16's FDT

下面介绍一些此格式中重要的部分:

  1. 文件状态: 0 字节偏移 第一字节(0 号字节),表示当前文件的状态。 | 值 | 含义 | | ------- | ---------------------- | | 00H | 目录项空表项(未使用) | | E5H | 曾使用过,但已删除 | | 2EH | "." 当前目录 | | 2EH 2EH | ".." 上一级目录 |

  2. 属性字节: 11 字节偏移

    1. 属性字节中是比特位对应属性 多种比特位的值表示其有多种属性,例如: 系统隐含常常和文件或目录一起存在。 示例:

      1. 系统隐含文件: 0010 0110H = 26
      2. 系统隐含子目录: 0001 0110H = 16 常见属性字节与值: | 值 | 类型 | | --- | -------------- | | 20 | 档案(文件) | | 10 | 子目录 | | 08 | 卷标 | | 16 | 系统隐含子目录 | | 26 | 系统隐含文件 |
    2. 卷标

      • 是一个磁盘的一个标识,不唯一。由格式化自动生成或人为设定。仅仅是一个区别于其他磁盘的标识而已。
      • 卷标也占用一个目录登记项
      • 可以看出卷标,子目录和文件用的是不同比特位,所以计算文件个数的时候不要算卷标,子目录哦
    3. 子目录

      • DOS 采用层次目录,树型目录结构。子目录和文件一样都有目录登记项,子目录的目录名和文件名表示方式基本一样,目录登记项中:日期、时间、起始簇表示方式一样, 只有属性和长度表示不同,长度固定为 0。
      • 根目录由 DBR 确定,而子目录由根目录下的目录登记项确定,如果我们要分析子目录下的东西,需要去子目录的 FDT 去看。
      • 系统通过 ... 实现目录间的双向联系,使目录能在目录之间进行切换
      • 子目录比根目录多两个目录项,即 ..., . 表示当前子目录, .. 表示当前子目录的父目录 sub-directory
    4. 文件首簇号

    5. 文件长度

剩余扇区数计算

FAT16

系统在分区时会以柱面为分隔面,将同一柱面的扇区划分在一个分区内。划分 5 个区域的过程,容易出现 DATA 扇区不是一个整数,即有少于一个簇的扇区

FAT16 DBR 根据 DBR 知道,每簇 32 个扇区, 保留扇区 4 个,扇区总数 1060227,此外,FDT 大小为 32 个扇区。

DATA 区的扇区数(包含剩余扇区) = 1060227–4–130x2–32 = 1059931

DATA 区的簇数(包含剩余扇区) = 1059931 / 32 = 33122.84375 约等于 33122

那么,剩余扇区数 = 1059931-33122×32 = 0.84375 x 32 = 27 即剩余扇区数为 27

FAT32's Directory

FAT32 中目录不再单独占有一块区域,可认为是数据区的一部分, 其大小可变,不再像 FAT16 一样固定扇区了。此外,根目录改成了根目录文件。

  • 根目录文件数据不受 512 个限制
  • 根目录初始定为 1 个簇的大小,若空间不够,FAT 为根目录追加新的簇
  • 原则上 FAT32 允许根目录位于数据区中的任何位置,通常位于 2 号簇。
  • 所有簇从 2 号开始依次编号。2 号簇不是位于文件系统开始处,而是位于数据区,寻找 2 号簇方法比较繁琐。
  • 数据区以前的区域不能使用 FAT 表管理,因此只能使用扇区地址
  • FAT32 目录区的文件目录项包括:
    1. 文件目录项
    2. 子目录项
    3. 卷标项(仅根目录有)
    4. 已删除目录项

FAT32 的目录登记项通过利用 FAT16 的目录登记项中的保留未用部分,实现了扩容。具体见下图:

FAT32 directory entry

图中我用绿色深线框选的便是原来在 FAT16 中的保留未用部分。 注意: FAT32 的目录登记项中簇号由两部分组成: 起始簇号的高 16 位和起始簇号的低 16 位

长文件名

FAT32 支持长文件名。

长文件名的实现:

  • 除一些磁盘工具外,多数程序通过操作系统获取文件名和目录名
  • 若设置文件属性为 0FH,DOS 和 Windows 3.x 会忽略该目录项
  • 解决长文件名与 DOS,Win 3.x 兼容性问题

Windows95 系统中,文件或目录设计存储两个名字,即短文件名和长文件名。其中长文件名对应的短文件名 处理原则:

  1. 取长文件名前 6 个字符加“~1”,扩展名不限
  2. 若已存在该名字,则“~”后的数字自动增加
  3. 若有 DOS,Win 3.x 非法字符,用 “_” 替代

这就意味着如果一个文件或者目录的名字过长,他们的目录登记项就至少有 4*16 = 64 字节的长度,其中,短文件名部分格式与之前介绍的一致。

长文件名部分,我们需要关注的有以下几部分: long file name part

  1. 长文件名部分也是以 32 个字节为一个内部小单位,进行标识。
  2. 0 号字节(第一个字节) 1 号比特(从 0 开始)为 1 表示这是长文件的最后一个登记项(也就是这个长文件名目录登记项到此结束) 3-7 号比特,表示这是长文件名目录部分的第几部分,也就是顺序号。
  3. 11 号字节(第 12 个字节) 属性字节为 "0F" 表示该项为长文件名
  4. 31 号字节(第 14 个字节) 同一文件标号,该字节相同表示这是同一个文件的长文件名部分。

下面我们详细地分析一个长文件名: a long file name directory entry

重要部分已标识,下面一一分析。

  1. 最左侧一列。

    我们可以看到结束处为: 43H = 0100 0011B, 即: 1 号比特的 "1" 标识长文件名结束,后面五个字节为长文件名目录登记项的长文件名部分的顺序号,从 1 开始。我们从下向上看,可以看到 1 2 3 说明长文件名部分有 3 个,也就是该长文件名目录登记项大小 3*32 + 32 = 128 字节

  2. “0F” 作为长文件名部分的标识符。

  3. “08” 同一个文件的标识符

    也就是说 32 个字节小单位的对应位置上的字节相同,说明它们是同一个长文件名部分。

  4. 短文件名部分

    再强调一下:起始簇号是位于两个部分,要连起来即可。

  5. 长文件名目录登记项的识别?

    它区别于普通的 FAT32 短文件名目录登记项的特征有以下三点:

    1. 每 32 个字节的第一个字节的 3-7 位的值,即:顺序号
    2. "0F" 长文件名部分的标志
    3. 同一文件标识符,一行的倒数第三个字节
    4. winhex 右侧栏字符中的波浪线
  6. 根据右侧字符栏看文件名

    由于格式中一些字节的影响,太过复杂的长文件名看右侧字符栏应该读不太准。不过,想来,考试或平时只需要看些简单的或者简单了解一下名字而已。

    以上图的长文件名为例子: 短文件名部分,只有第一行读取短文件名,这里是: 007286~1GIF 长文件名部分(完整的文件名),每两行(32 个字节)为一个单位。读法: 单元间由下到上,单元内从上到下,从左往右。 这里是: 007286Telylgc 8j3iqlxmg307s 0d54qw.gif 读取长文件名时,要注意长文件结束字节(这里为 43) 的字符影响,一般该行第一个字符去掉。

长文件名实现注意事项:

  • 长文件名占用较多的目录登记项,目录登记项数据一般为 512 个
  • 在根目录下最多能存储 46 个这样的长文件或目录
  • 使用 16 位应用程序时,更改文件名,对应的长文件名将丢失
  • 长文件名更名或删除时,长文件名将丢失,长文件名依附的短文件名存在
  • 频繁创建和删除长文件名,会造成大量磁盘碎片 避免方式
    1. 不在根目录下创建长文件名
    2. 磁盘碎片整理程序回收丢失的目录登记项

未完待续..

参考资料

  1. data recovery FDT