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
对于文件数据区,按簇排列,直接存放文件或子目录项的每一簇内容。
发表评论