FAT12 简介

一个 FAT12 文件系统软盘映象分为四个部分:引导扇区(零扇区),文件分配表 FAT,根目录项目,文件数据。
启动扇区是 BIOS 所需要的,位于文件系统的最开始部分,即第一个扇区。准确的说 BIOS 只要求扇区结尾两个字节为 55h 和 AAh 就确定该设备可以引导,并从扇区开头位置执行代码。
FAT 文件系统启动扇区结构如下:

名称            位置 大小 说明
BS_jmpBoot      0    3    一个跳转指令,用于将执行代码跳过下面的扇区信息。
BS_OEMName      3    8    只是文件系统的描述信息
BPB_BytesPerSec 11   2    扇区大小(字节),应为 512
BPB_secPerClus  13   1    簇的扇区数,应为 2 的幂,FAT12 为 1
BPB_RsvdSecCnt  14   2    保留扇区,FAT12/16 应为 1
BPB_NumFATs     16   1    FAT 结构数目,一般为 2
BPB_RootEntCnt  17   2    根目录项目数,FAT12 为 224
BPB_TotSec16    19   2    扇区总数,1.44M 软盘为 2880
BPB_Media       21   1    设备类型,1.44M 软盘为 F0h
BPB_FATSz16     22   2    FAT 占用扇区数,9
BPB_SecPerTrk   24   2    磁道扇区数,18
BPB_NumHeads    26   2    磁头数,2
BPB_HiddSec     28   4    隐藏扇区,默认为 0
BPB_TotSec32    32   4    FAT32 使用,0
--下面的内容为 FAT12/16 所有,和 FAT32 不同——
BS_DrvNum       36   1    MS-DOS 使用,0
BS_Reserved1    37   1    Windows NT 使用,0
BS_BootSig      38   1    附加的可启动标志,29h
BS_VolID        39   4    卷标序列号,00000000h
BS_VolLab       43   11   卷标,11 字节,必须用空格 20h 补齐
BS_FilSysType   54   8    文件系统标志,"FAT12   "

这个数据结构之后就是引导代码了,BS_jmpBoot 的内容一般是 EBh 或者 E9h 跳转指令,即跳到结构数据之后。这段代码不能占用扇区最后两个字节。也就是说只有 512 – 62 – 2 = 448 字节容量。
启动扇区最后两个字节分别为 55h AAh。
启动扇区后是文件分配表 FAT,起始位置看保留扇区 BPB_RsvdSecCnt 的值,其扇区大小为 BPB_FATSz16 和 BPB_NumFATs 的乘积。
每个 FAT12 登记项包含三位 16 进制的字符,即 1.5 个字节,2 个项目占用 3 个字节。每一个登记项按顺序对应文件数据区的一个簇。12 位数据含意如下:
000:这个簇是未使用的。
FF0-FF7:标识保留的簇。FF7 表明当前是坏簇。
FF8-FFF:标识当前簇是文件的最后一个簇,标明文件的结束。
XXX:文件的一个簇号,指向本簇后面的簇,文件的第一个簇保存在目录登记项中。
对于 1.44M 软盘一般有 9 个扇区也就是 9 x 512 / 1.5 = 3072 个登记项,即 3072 个簇,而 1.44M 软盘实际只拥有 2880 个文件簇(每簇只有一个扇区)。
FAT 一般会有两个,其中一个用于备份。
对于 FAT12/16 文件系统,FAT 文件分配表之后就是根目录项目,其大小为 RootDirSectors = ((BPB_RootEntCnt * 32) + ( BPB_BytePerSec – 1)) / BPB_BytePerSec 个扇区。由这个计算公式可以得知每个项目占用 32 个字节,即文件目录数据结构,内容如下:

名称             位置 大小 说明
DIR_Name         0    11   文件名称
DIR_Attr         11   1    文件属性
DIR_NtRes        12   1    Windows NT 保留
DIR_CrtTimeTenth 13   1    文件创建时间毫秒数,0-199
DIR_CrtTime      14   2    创建时间
DIR_CrtDate      16   2    创建日期
DIR_LstAccDate   18   2    最后访问日期
DIR_FstClusHI    20   2    第一个簇的高地址
DIR_WrtTime      22   2    最后修改时间
DIR_WrtDate      24   2    最后修改日期
DIR_FstClusLO    26   2    第一个簇的低地址
DIR_FileSize     28   4    文件大小

详细说明:
文件名称 DIR_Name 为 8.3 格式,共占用 8 + 3 = 11 个字节,不保存 8.3 中间的 . 号。空字符 20h 作为结束(空)字符。(8.3 后面的 3 个扩展名字符永远在 11 字节的最后三个字节,不管前面的 8 是否有 8 个字符。)
对于 DIR_Name 第一个字符 DIR_Name[0] = E5h 时,表明该项是被删除的(空项),00h 也标识空项,而且该空项后均为空项。由于双字节字符使用了 E5h 所以 05h 用来替代 DIR_Name[0] 出现的正常 E5h。DIR_Name[0] 不能为 20h。
另,对于除根目录外的其他子目录,其目录下均有两个默认目录项:”.” DIR_Name[0] = 2Eh 即字符 ‘.’ 表示当前目录项目和 “..” DIR_Name[1] = 2Eh 表示上一层目录项目。这两个目录用于指向该子目录本身 “.” 和其父目录 “..”。即文件簇是指向目录的起始簇。如果指向的是根目录,簇号为 0。
文件属性分为:

ATTR_READ_ONLY 01h 只读
ATTR_HIDDEN    02h 隐藏
ATTR_SYSTEM    04h 系统
ATTR_DURECTORY 10h 目录
ATTR_ARCHIVE   20h 存档
ATTR_VOLUME_ID 08h 卷标

除卷标外,各属性可以同时拥有。并且卷标项目只存在根目录中。
日期格式为:
位 0-4:日,为 1-31
位 5-8:月,为 1-12
位 9-15:年,0-127 分别表示 1980-2107 年
时间格式为:
位 0-4:秒,0-29 分别表示 0-58 秒
位 5-10:分钟,0-59
位 11-15:小时,0-23
对于文件数据区,按簇排列,直接存放文件或子目录项的每一簇内容。

发表评论

%d 博主赞过: