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