主磁碟結構
- 引導扇區(Boot Sector)
位於第一個扇區,在軟碟上就是0柱面(磁軌)0磁頭1扇區。 - 檔案分配表(FAT)
緊接著引導扇區的是兩個完全相同的FAT表,每個FAT表占用9個扇區 - 根目錄區
FAT表之後是根目錄區,根目錄區長度不固定 - 數據區
根目錄後面就是數據區
FAT12引導扇區的格式
格式如下:名稱 | 偏移 | 長度 | 內容 | 軟碟參考值 |
BS_jmpBoot | 0 | 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 | 隱藏扇區數 | 0 |
BPB_TotSec32 | 32 | 4 | 如果BPB_TotSec16是0,由這個值記錄扇區數 | 0xB40(2880) |
BS_DrvNum | 36 | 1 | 中斷13的驅動器號 | 0 |
BS_Reserved1 | 37 | 1 | 未使用 | 0 |
BS_BootSig | 38 | 1 | 擴展引導標記 | 0x29 |
BS_VolD | 39 | 4 | 卷序列號 | 0 |
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 | 0 | 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 | 檔案大小 |