EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

FAT12 文件系统

起源

FAT(File Allocation Table)文件配置表。用来记录文件所在位置的表格。假若丢失文件分配表,那么硬盘上的数据就会因无法定位而无法使用。

  • 在 DOS v1.0 时代就引入了,是最基本的文件系统之一。
  • FAT 家族:FAT12、FAT16、FAT32、ExFAT、VFAT
  • 12 位地址,最大容量 16MB
  • 为软盘设计的文件系统

FAT 结构

  • FAT 文件系统把存储介质看成一维的数组,基本单位是簇(cluster)
    • 存储介质被划分为 3 个区域:boot record、FAT、directory and data area
  • 一个簇包含一个扇区,大小为 512B

Boot record

引导扇区包含了数据和代码,数据被称为 BPB(BIOS Parameter Block)。

File Allocation Table

  • FAT1 和 FAT2 互为备份。
  • 文件分配表被划分为紧密排列的若干个表项,每个表项都与数据区中的一个簇相对应,而且表项的序号也是与簇号一一对应的。
  • 每 12 位成为一个 FAT 项(FATEntry),代表一个簇。所以 2 个 FAT 项会占用 3 个字节。
  • 在 1.44M 软盘上,FAT 前三个字节的值是固定的 0xF0、0xFF、0xFF,用于表示这是一个应用在 1.44M 软盘上的 FAT12 文件系统。本来序号为 0 和 1 的 FAT 表项应该对应于簇 0 和簇 1,但是由于这两个表项被设置成了固定值,簇 0 和簇 1 就没有存在的意义了,所以数据区就起始于簇 2。
  • FAT 项的值代表文件的下一个簇号:
    • 值大于或等于 0xFF8,表示当前簇已经是本文件的最后一个簇
    • 值为 0xFF7,表示它是一个坏簇

Directory area

根目录区由目录项(entry)组成,一个目录项占 32 个字节。

如果文件名过长,在原本的目录项后面会立即跟一个 LFN 项,同样也是 32 个字节。

Data area

数据区的第一个簇的簇号是 2,为什么?

数据区开始扇区号=根目录开始扇区号+根目录所占扇区数。

若为目录,格式同根目录项。

Reference

制作 FAT12 镜像

Linux

  1. 在当前目录(.)创建一个新的软盘镜像 a.img
1
mkfs.fat -C a.img 1440
  1. 在当前目录下创建一个新目录 ./mount 作为挂载点
1
mkdir mount
  1. 将镜像 ./a.img 挂载到 ./mount
1
sudo mount a.img mount