FAT12
FAT12
FAT12是DOS時代就開始使用的文件系統(File System),直到2009年仍然在軟盤上使用。
• 引導扇區(Boot Sector)
• 位於第一個扇區,在軟盤上就是0柱面(磁軌)0磁頭1扇區。
• 文件分配表(FAT)
• 緊接著引導扇區的是兩個完全相同的FAT表,每個FAT表佔用9個扇區
• 根目錄區
• FAT表之後是根目錄區,根目錄區長度不固定
• 數據區
• 根目錄後面就是數據區
格式如下:
名稱 | 偏移 | 長度 | 內容 | 軟盤參考值 |
BS_jmpBoot | 3 | jmp LABEL_START nop | ||
BS_OEMName | 3 | 8 | 廠商名 | 'ForrestY' |
BPB_BytsPerSec | 11 | 2 | 每扇區位元組數 | 0x200(即十進位512) |
BPB_SecPerClus | 13 | 1 | 每簇扇區數 | 0x01 |
BPB_RsvdSecCnt | 14 | 2 | Boot記錄佔用多少扇區 | 0x01 |
BPB_NumFATs | 16 | 1 | 共有多少FAT表 | 0x02 |
BPB_RootEntCnt | 17 | 2 | 根目錄文件數最大值 | 0xE0 (224) |
BPB_TotSec16 | 19 | 2 | 扇區總數 | 0xB40(2880) |
BPB_Media | 21 | 1 | 介質描述符 | 0xF0 |
BPB_FATSz16 | 22 | 2 | 每FAT扇區數 | 0x09 |
BPB_SecPerTrk | 24 | 2 | 每磁軌扇區數 | 0x12 |
BPB_NumHeads | 26 | 2 | 磁頭數 | 0x02 |
BPB_HiddSec | 28 | 4 | 隱藏扇區數 | |
BPB_TotSec32 | 32 | 4 | 如果BPB_TotSec16是0,由這個值記錄扇區數 | 0xB40(2880) |
BS_DrvNum | 36 | 1 | 中斷13的驅動器號 | |
BS_Reserved1 | 37 | 1 | 未使用 | |
BS_BootSig | 38 | 1 | 擴展引導標記 | 0x29 |
BS_VolD | 39 | 4 | 卷序列號 | |
BS_VolLab | 43 | 11 | 卷標 | 'OrangeS0.02' |
BS_FileSysType | 54 | 8 | 文件系統類型 | 'FAT12' |
引導代碼 | 62 | 448 | 引導代碼、數據及其他填充字元等 | |
結束標誌 | 510 | 2 | 0xAA55 |
它包含有兩份文件分配表,這是出於系統冗餘考慮,儘管它很少使用,即使是磁碟修復工具也很少使用它。它是分區信息的映射表,指示簇是如何存儲的。
每個FAT項佔12bit,這也所被成為FAT12的原因,FAT項的值代表的是文件下一個簇號,但如果值大於等於0xFF8,則表示當前簇已經是本文件的最後一個簇。如果值是0xFF7,表示它是一個壞簇。
一個FAT項可能跨越兩個扇區,編碼實現的過程要考慮在內。
根目錄區位於第二個FAT表之後,開始扇區號為19,它由若干個目錄條目(Directory Entry)組成,條目最多有BPB_RootEntCnt個。每個條目佔用32個位元組,它的格式如下:
名稱 | 偏移 | 長度 | 描述 |
DIR_Name | 0xB | 文件名8位元組,擴展名3位元組 | |
DIR_Attr | 0xB | 1 | 文件屬性 |
保留 | 0xC | 10 | |
DIR_WrtTime | 0x16 | 2 | 最後修改時間 |
DIR_WrtDate | 0x18 | 2 | 最後修改日期 |
DIR_FstClus | 0x1A | 2 | 此條目對應的開始簇號 |
DIR_FileSize | 0x1C | 4 | 文件大小 |
數據區在根目錄區后,數據區開始扇區號為根目錄區起始扇區號+根目錄區大小,即19+BPB_RootEntCnt * 32 / BPB_BytsPerSec。