文章目錄
FAT32文件系統詳細分析 (續FAT文件系統詳解)
1. 前言
2. 格式化SD nand/SD卡
3. FAT32文件系統分析
3.1 保留區分析
3.1.1 BPB(BIOS Parameter Block) 及BS區分析
3.1.2 FSInfo 結構扇區分析
3.1.3 引導扇區剩余扇區
3.1.4 備份引導扇區
3.1.5 保留區剩余區域
3.2 分區偏移及大小計算
3.3 FAT區分析:
3.3.1 FAT1
3.3.2 FAT2
3.4 數據區分析:
4. 總結
1. 前言
續上一篇文章 : FATFS文件系統詳解:關于如SD卡、SD nand、spi nor flash等眾多存儲設備
在上一篇文章,我們已經對FAT文件系統有了一個詳細的介紹,但由于FAT文件系統由歷史發展,存在FAT12/16/32三種系統,在上一篇文章中采用的是FAT16系統作為實例進行的分析,而FAT32系統存在些許差異,且FAT32文件系統在當前應用廣泛,因此特補充此篇博文,完善FAT32的示例分析。
2. 格式化SD nand/SD卡
申請到雷龍發展代理的CS創世 貼片 SD Card (SD NAND) 樣品,做出測試,有1Gb,4Gb,32Gb,64Gb的容量可選,我這里申請到的是兩片32Gb的芯片和測試板.
2.1 格式化SD nand / SD卡,強制采用FAT32格式,分配每個簇大小為2048Byte,同時為了避免其他原有數據干擾,我們此處取消快速格式化。
2.2 使用 WinHex 打開分析
3. FAT32文件系統分析
FAT文件系統布局圖如下,和FAT16上有些許差別:
3.1 保留區分析
保留區分為引導扇區、備份引導扇區及其他字段,具體數據段分析如下。
3.1.1 BPB(BIOS Parameter Block) 及BS區分析
BPB及BS參數內容數據如下:
- EB 58 90 :BS_JmpBoot,跳轉指令
- 4D 53 44 4F 53 35 2E 30:BS_OEMName,MSDOS 5.0,一個名字,指示創建此卷的操作系統,無其他作用`
- 00 02:BPB_BytsPerSec,扇區大小 512 字節
- 04:BPB_SecPerClus,每次操作的最小扇區數,簇 Cluster,4 (與格式化時選擇的大小匹配 2048 = 512 * 4)
- 16 11:BPB_RsvdSecCnt,保留區的扇區數,0x1116=4374 (通過此可計算,FAT區起始地址為 4374 * 512 = 0x22 2C00)
- 02:BPB_NumFATs,FATs的個數,2(一般此值為2,多一個用來做冗余備份,解決系統異常導致第一個損壞時,增大恢復的可能性,表示FAT區有兩個FATs備份)
- 00 00:BPB_RootEntCnt,0,在FAT12/16系統中,此字段表示根目錄中32字節目錄條目數量,設置此值時需注意對齊,為了最大的兼容性,FAT16系統上此值應設置為512,FAT32系統上此值應設置為0
- 00 00:BPB_TotSec16,16位大小區域描述FAT卷扇區總數,0。當FAT12/16系統扇區數 ≥0x10000(65536)時,此字段應設置為0,真實值存放在 BPB_TotSec32 字段;對于FAT32系統,此值必須為0。(此處由于我們的總扇區數=118.510241024/512 = 242688 > 65536,所以此字段為0)
- F8:BPB_Media 媒體類型
- 00 00:BPB_FATSz16,00,一個FAT占用的扇區數,此字段僅在FAT12/16系統使用;FAT32系統,此字段必須為0,使用BPB_FATSz32字段替代。
- 3F 00:BPB_SecPerTrk,每個磁道的扇區數,此字段僅與具有幾何形狀且僅用于 IBM PC 的磁盤 BIOS 的介質相關,不用管。
- FF 00:BPB_NumHeads,頭數量,此字段僅與具有幾何形狀且僅用于 IBM PC 的磁盤 BIOS 的介質相關,不用管。
- 00 00 00 00:BPB_HiddSec,0,FAT 卷之前的隱藏物理扇區數(當磁盤被分區之后,當前分區并不一定是從扇區頭開始的)
- 00 08 0F 00:BPB_TotSec32,0x0F0800 = 985088(整個卷空間大小),32位大小區域描述FAT卷扇區總數。 FAT12/16系統,扇區總數小于0x10000時,此字段必須為0,真實值存放在BPB_FATSz16;FAT32系統,此字段一直有效。(481M = 512 * 985088)
以上是FAT12/16/32公共字段,接下來是FAT32獨有字段
- 75 07 00 00:BPB_FATSz32,1909,一個FAT占用的扇區數,FAT區總大小等于 BPB_FATSz?? * BPB_NumFATs 扇區。(由此可計算FAT區總大小:1909 * 2 = 3818扇區 = 3818 * 512Byte = 0x1D D400 Byte)
- 00 00: BPB_ExtFlags,擴展標識字段,bit7=0,表示所有FAT都是鏡像的和活躍的;bit7=1,表示只有bit3-0表示的FAT是有效的。
- 00 00:BPB_FSVer:FAT32版本,高字節是主版本號,低字節是次版本號。
- 02 00 00 00:BPB_RootClus,2, 根目錄的第一個簇號,此值通常為2,因為前兩個簇一般用于保留。
- 01 00:BPB_FSInfo,1,FSInfo結構扇區與FAT32卷頂部的偏移扇區值。此值通常為1,因為其通常位于引導扇區旁邊。
- 06 00:BPB_BkBootSec,6, 備份引導扇區與FAT32卷頂部的偏移扇區值。此值通常為6,考慮最大的兼容性,此值不建議為其他值。
- 00 00 00 00 00 00 00 00 00 00 00 00:BPB_Reserved,0,保留
- 80:BS_DrvNum,IBM PC 的磁盤 BIOS 使用的驅動器號,00h代表軟盤,80h代表固定磁盤
- 00:BS_Reserved,保留字段,0
- 29:BS_BootSig,擴展引導簽名,表示以下存在三個字段
- 30 D1 B5 78:BS_VolID,與 BS_VolLab 一起構成卷序列號,一般在格式化的時候結合時間生成
- 4E 4F 20 4E 41 4D 45 20 20 20 20:(解析為:"NO NAME “),BS_VolLab,11byte卷標,當卷標不存在時,此值應設置為"NO NAME”
- 46 41 54 33 32 20 20 20:BS_FilSysType,始終為"FAT32 ",對FAT類型的確定沒有任何影響。
- 33 C9 ... B9 01 00 00:BS_BootCode32,引導啟動程序,與平臺有關,不使用時填充為0
- BS_BootSign:0xAA55,引導簽名,指示這是一個有效的引導扇區當扇區大小大于512字節時,剩余的字段應全部使用0x0填充。
3.1.2 FSInfo 結構扇區分析
FSInfo 數據結構為FAT32系統所特有,其目的是記錄FAT32系統上剩余的簇數量以及下一個空閑簇數據;以避免掃描整個磁盤搜索導致的時間浪費。
FSInfo數據偏移可從引導扇區內的 BPB_FSInfo 參數獲取,此處為 1,因此 FSInfo 數據偏移為1個扇區,對應512Byte,0x200地址處。FSInfo數據結構如下:
內容如下:
3.1.3 引導扇區剩余扇區
FAT32引導扇區總共有三個512Byte的扇區構成。BPB、BS、FSInfo字段已使用了2個扇區,還剩有一個扇區未使用,字段為0,如下圖所示,需要注意的是,此扇區在偏移值510處依舊存在尾部簽名0xAA55。
引導扇區剩余字段,為非有效字段,采用0x00填充。
3.1.4 備份引導扇區
相比FAT12/16,FAT32系統上存在引導扇區的備份,此塊區域偏移參考引導扇區內BPB_BkBootSec字段,當前引導扇區內此參數值為6, 因此在當前文件系統內,備份引導扇區的偏移為 6號扇區,對應偏移地址為 BPB_BkBootSec * BPB_BytsPerSec = 6 * 512Byte = 3072Byte = 0xC00
3.1.5 保留區剩余區域
在FAT32系統中,保留區除了 BPB區域、FSInfo區域以及這兩個區域的備份區域外,還有一部分區域,目前我沒找到此區域的作用,我理解為此塊區域是作為某種引導程序,數據內容如下:
關于此塊區域,歡迎大家在評論區討論!
此外,還有一處區域的存在也歡迎大家討論,即FSInfo扇區后面的一個扇區,只有看到尾部簽名,其他數據為空,目前也未找到此處有關說明,后續清楚后會在此補充,亦歡迎大家在評論區討論!
3.2 分區偏移及大小計算
知道BPB參數內容之后,便可以進行分區偏移及大小計算了!
各分區偏移地址及大小如下:
關于FAT區,通常存在一個以上的FAT,如此處所格式化的sd卡便存在兩個FAT,對應的偏移地址和大小如下:
注意:在FAT32系統中,根目錄區不存在,但依舊存在根目錄,不過是根目錄作為數據區的一部分!
3.3 FAT區分析:
FAT32系統與FAT12/16系統在FAT區數據一個顯著差別是:FAT32每條FAT條目占32bit,FAT16占16個bit,FAT12占12bit。關于此部分更詳細描述,可參考上一篇:FAT文件系統詳解(點擊跳轉!) 的 4.3 章節!
3.3.1 FAT1
FAT1偏移地址:0x22 2C00
數據內容如下:
3.3.2 FAT2
FAT2是FAT1的備份,偏移地址:0x31 1600
數據內容與FAT1一致,如下:
3.4 數據區分析:
偏移地址:0x40 0000
由參數BPB_RootClus可知,數據區第一個簇是2號簇。
打開數據區的第一個簇,里面存放的內容便是根目錄的內容!這也就是為什么FAT32沒有根目錄區,但依舊存在根目錄的實現方式。數據內容如下:
之后我們看到3號簇的內容:
數據字段如下圖所示,由于在上一篇博文中已對長短文件名每個字段進行過細致分析,此處不再做過度分析,僅抽取關鍵字段進行分析,如下圖所示:
之后切換到4號簇和5號簇,可以查看到對應數據:
從6號簇開始便沒有在使用,均為空閑簇,對應上 FSInfo 結構內 FSI_Nxt_Free 字段的內容。
4. 總結
相比FAT16系統,FAT32文件系統在保留區有了更多的設計:
1)增加了引導扇區的備份,異常掉電等情況下可恢復性更強;
2)增加了FSInfo結構,對于大容量flash訪問將更加高效;
此外FAT32系統取消了根目錄區,將根目錄移至數據區,根目錄與普通目錄本來就沒有什么區別,確實也不用單獨分一個區存放,提高了一致性。
關于數據的存儲思想,依舊保持不變:FAT區內的FAT條目通過簇鏈記錄扇區使用情況及文件占用的扇區情況;數據區內目錄和文件都作為文件,通過目錄這一類特殊文件,描述文件屬性以及實際文件內容存放的簇的方式,將整個文件管理起來。
綜上,便是FAT32格式文件系統的詳細解析,歡迎大家評論區進行積極討論與反饋!!!
-
NAND
+關注
關注
16文章
1690瀏覽量
136459 -
SD卡
+關注
關注
2文章
566瀏覽量
64108 -
FAT32
+關注
關注
0文章
33瀏覽量
13829 -
TF卡
+關注
關注
2文章
81瀏覽量
12246
發布評論請先 登錄
相關推薦
評論