解剖篇
FAT格式解析
在这里只讲解了FAT12/16的格式,FAT32读者另行拜读别的文章哈。
FAT12的格式分为四大块:Boot 、FAT、Root Directory 、Data(引导区、文件配置区、根目录区、数据区)
Boot 引导区:里面包含了各种启动参数,文件系统的参数。详细的参数如下表格
参数名 | 偏移位置 | 大小(byte) | 描述 |
---|---|---|---|
BS_JmpBoot | 0 | 3 | 引导码,一般是0xEB,0x??,0x90。??是任意值(跳转的位置)。若移植到嵌入式系统的话??可以任意填,无影响 |
BS_OEMName | 3 | 8 | 创建卷的名字,默认是"MSWIN 4.1" |
BPB_BytsPerSec | 11 | 2 | 扇区的大小(Byte) |
BPB_SecPerClus | 13 | 1 | 簇的大小(Sector),即一个簇多少个扇区 |
BPB_RsvdSecCnt | 14 | 2 | 保留区域扇区的个数,结合上图来看更清晰哦 |
BPB_NumFATs | 16 | 1 | FAT区的个数,不是整个FAT系统,是FAT区! |
BPB_RootEntCnt | 17 | 2 | 根目录条目数,能容纳的文件数量,在FAT32中此值必须为0 |
BPB_TotSec16 | 19 | 2 | 扇区总数,在FAT32中此值必须为0 |
BPB_Media | 21 | 1 | 磁盘类型 |
BPB_FATSz16 | 22 | 2 | FAT区占了多少扇区 |
BPB_SecPerTrk | 24 | 2 | 每个轨道的扇区数,与具体介质有关。(一般不用管) |
BPB_NumHeads | 26 | 2 | 磁盘头数量,与具体介质有关。(一般不用管) |
BPB_HiddSec | 28 | 4 | FAT卷隐藏的物理扇区数,取决于平台。若从卷开头就存储,此值为0,如软盘。 |
BPB_TotSec32 | 32 | 4 | 扇区总数(使用FAT32格式时),若不是FAT32,此值为0 |
以上的参数FAT12/16/32都是一样的。 以下参数只适用于FAT12/16 | |||
BS_DrvNum | 36 | 1 | 驱动器号。用于MS-DOS引导,0x00用于软盘、0x80用于固定磁盘。实际上取决于操作系统 |
BS_Reserved1 | 37 | 1 | 保留 |
BS_BootSig | 38 | 1 | 扩展引导签名(0x29)。这是一个签名字节,表示存在以下三个字段。 |
BS_VolID | 39 | 4 | 与BS_VolLab 一起使用的卷序列号,用于跟踪可移动存储上的卷。 |
BS_VolLab | 43 | 11 | 此字段为 11 字节卷标签,它与根目录中记录的卷标签匹配。 |
BS_FilSysType | 54 | 8 | “FAT12”,“FAT16”`或```“FAT”。 |
BS_BootCode | 62 | 448 | 引导程序。它与平台相关,不使用时填充为零。 |
BS_BootSign | 510 | 2 | 0xAA55. 指示这是有效的引导扇区的引导签名。 |
当扇区大小大于512Bytes,扇区的其余空闲部分就填充0
FAT区:因为文件不是存放在一个连续的空间中的,就像一个被打乱的拼图存放到一个区域,我们要按顺序找到文件的各个部分就需要FAT区中的条目了,每个条目会记录下一个部分在哪里,当文件找到开始的簇号,顺着FAT的条目,就能找到文件的各个部分在个位置。由此可见,FAT区的重要性,所以会有FAT备份区,其内容和FAT是一样的。
根目录区:记录文件的属性,文件的起始单元,操作系统通过 根目录+FAT区的信息就可以确定文件在硬盘中的起始位置和文件大小了。
数据区:真正的文件数据就存储在这个区域,数据区占用硬盘空间最大。