卓一笔记---FAT12系统介绍
FAT12是DOS时代就开始使用的文件系统(File System),直到2009年仍然在软盘上使用。 具体结构如下图:
-
引导扇区(Boot Sector)
-
文件分配表(FAT)
紧接着引导扇区的是两个完全相同的FAT表,每个FAT表占用9个扇区,数据区的物理映射图,FAT中每个条目占用12字节,该条目代表文件在数据区中的扇区编号,每个条目和数据区中的扇区编号一一对应。
-
根目录区
FAT表之后是根目录区,根目录区长度不固定。文件路径(文件名)存放的位置。根目录区每一个条目占用32字节,存放着文件的名称、大小、数据区起始扇区号等信息。
-
数据区
1)引导扇区:
引导扇区是软盘的第0个扇区,在这个扇区中有一个很重要的数据结构叫BPB(BIOS Parameter Block),下面是引导扇区格式,其中BPB_开头的属于BPB,以BS_开头的只是BOOT Sector的一部分,不属于BPB。
名称 | 开始字节 | 长度 | 内容 | 参考值 |
BS_jmpBOOT | 0 | 3 | 一个短跳转指令 | jmp Label_07c00H nop |
BS_OEMName | 3 | 8 | 厂商名 | 'QingFeng' |
BPB_BytesPerSec | 11 | 2 | 每扇区字节数(Bytes/Sector) | 0x200 |
BPB_SecPerClus | 13 | 1 | 每簇扇区数(Sector/Cluster) | 0x1 |
BPB_ResvdSecCnt | 14 | 2 | Boot记录占用多少扇区 | ox1 |
BPB_NumFATs | 16 | 1 | 共有多少FAT表 | 0x2 |
BPB_RootEntCnt | 17 | 2 | 根目录区文件最大数 | 0xE0 |
BPB_TotSec16 | 19 | 2 | 扇区总数 | 0xB40[2*80*18] |
BPB_Media | 21 | 1 | 介质描述符 | 0xF0 |
BPB_FATSz16 | 22 | 2 | 每个FAT表所占扇区数 | 0x9 |
BPB_SecPerTrk | 24 | 2 | 每磁道扇区数(Sector/track) | 0x12 |
BPB_NumHeads | 26 | 2 | 磁头数(面数) | 0x2 |
BPB_HiddSec | 28 | 4 | 隐藏扇区数 | 0 |
BPB_TotSec32 | 32 | 4 | 如果BPB_TotSec16=0,则由这里给出扇区数 | 0 |
BS_DrvNum | 36 | 1 | INT 13H的驱动器号 | 0 |
BS_Reserved1 | 37 | 1 | 保留,未使用 | 0 |
BS_BootSig | 38 | 1 | 扩展引导标记(29h) | 0x29 |
BS_VolID | 39 | 4 | 卷*** | 0 |
BS_VolLab | 43 | 11 | 卷标 | 'QingFeng' |
BS_FileSysType | 54 | 8 | 文件系统类型 | 'FAT12' |
引导代码及其他内容 | 62 | 448 | 引导代码及其他数据 | 引导代码(剩余空间用0填充) |
结束标志0xAA55 | 510 | 2 | 第510字节为0x55,第511字节为0xAA | 0xAA55 |
紧接着引导扇区的是两个完全相同的FAT表,每个占用BPB_FATSz16(0x9)个扇区;
第二个FAT之后就是根目录区的第一个扇区,根目录区后面是数据区。
根目录区中由若干个目录入口(Directory Entry)组成,最多有BPB_RootEntCnt个,所以根目录区大小不固定。
根目录区的位置:引导扇区占1个Sec,两个FAT表共18Sec,所以根目录区开始扇区号为19。
每个Directory Entry占32字节。
2)FAT表条目:
FAT表占1-18扇区,共两个FAT表,FAT1和FAT2,一般FAT2不用,FAT2仅是FAT1的拷贝,每个FAT表占9个扇区,即 (512*9=4608)字节,FAT表由FAT项组成,每个FAT项占12位,共3072个FAT项,去掉两个不用的FAT的项(0和1,这是因为数据区的簇号是从2开始的0和1不用,故对应的FAT表中的0和1也不用),故FAT12功能管理3070个扇区。
要注意的是,由于每个FAT项占12位,包含一个字节和另一个字节的一半。如上图所示连续的3个字节表示两个FAT项,BYTE1是Fat Entry1的低8位,BYTE2的低4位是Fat Entry1的高4位,BYTE2的高4位是Fat Entry2的低4位,BYTE3是Fat Entry2的高8位。
3)根目录条目:
紧跟FAT表的是根目录,从第19个分区开始,它是由若干个目录条目(Directory Entry)组成,条目最多有BPB_RootEntCnt个。由于根目录区的大小依赖于BPB_RootEntCnt的大小,所以长度不固定。
根目录中的每一个条目占用32字节,它的格式如下表所示:
名称 | 开始字节 | 长度 | 内容 |
DIR_Name | 0 | 0xB | 文件名8字节,扩展名3字节 |
DIR_Attr | 0xB | 1 | 文件属性 |
保留位 | 0xC | 10 | 保留 |
DIR_WrtTime | 0x16 | 2 | 最后一次写入的时间 |
DIR_WrtDate | 0x18 | 2 | 最后一次写入的日期 |
DIR_FstClus | 0x1A | 2 | 此文件在数据区和FAT表中的开始簇号 |
DIR_FileSize | 0x1C | 4 | 文件大小 |
4)数据区
需要注意的是数据区的第一个簇号是2,而不是0或者1,(簇号和扇区号在这里是一样的,因为一簇只有一个扇区)