欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FAT文件系統(tǒng)的實(shí)例分析

Linux愛(ài)好者 ? 來(lái)源:Linux愛(ài)好者 ? 2023-10-27 15:14 ? 次閱讀

1. 簡(jiǎn)介

在早期計(jì)算機(jī)剛發(fā)展的時(shí)候,那時(shí)候硬盤大小、flash設(shè)備容量都比較小,隨著技術(shù)的不斷迭代更新,硬盤容量越來(lái)越大。在早期,面對(duì)小容量的硬盤/flash,往往采用對(duì)應(yīng)地址存放對(duì)應(yīng)數(shù)據(jù)的方案,由于數(shù)據(jù)量不大,操作起來(lái)尚還可以。但是發(fā)展到今天,隨著硬盤/flash容量不斷增大,存儲(chǔ)的數(shù)據(jù)也越來(lái)越多,早期單一的對(duì)應(yīng)地址存放對(duì)應(yīng)數(shù)據(jù)的方案已經(jīng)無(wú)法滿足我們的需求,操作硬盤/flash會(huì)變得異常的困難復(fù)雜。

因此針對(duì)上述問(wèn)題,一群大佬們便開(kāi)始設(shè)計(jì)文件系統(tǒng)這樣一個(gè)東西,用來(lái)管理硬盤/flash上的數(shù)據(jù)信息,像我們電腦上打開(kāi)文件夾,訪問(wèn)里面的文件,這其實(shí)就是基于文件系統(tǒng)訪問(wèn)電腦硬盤上數(shù)據(jù)的一個(gè)操作。

發(fā)展至今,文件系統(tǒng)已有眾多版本,本文主要分享 關(guān)于FAT文件系統(tǒng)的詳細(xì)設(shè)計(jì), FAT文件系統(tǒng)適用于嵌入式設(shè)備,如SD卡、SD nand、spi nor flash等眾多存儲(chǔ)設(shè)備,同時(shí)基于此文件系統(tǒng)的文件亦能被電腦正常讀取。

2. 基礎(chǔ)概念

在研究文件系統(tǒng)之前,我們需要首先弄清楚關(guān)于內(nèi)存這塊的幾個(gè)基本概念:

2.1.區(qū)分 扇區(qū)、塊、簇的概念

扇區(qū)(sector):flash可操作的最小單元,通常指我們擦除的最小單元大小,以sd nand舉例,通常最小為512Byte

塊(block) 以及 簇(cluster):其實(shí)這是兩個(gè)相同的概念,只是由于歷史原因,在不同系統(tǒng)上的不同稱呼,在windows中稱簇,而在linux中稱塊。一個(gè)簇/塊由多個(gè)扇區(qū)組成,由于一個(gè)扇區(qū)的空間較小,因此文件系統(tǒng)通過(guò)會(huì)將多個(gè)扇區(qū)組合在一起形成一個(gè)簇,并以簇為單位進(jìn)行讀寫操作!一個(gè)簇通??梢杂?2、4、8、… 、2的n次方個(gè)扇區(qū)組成。

2.2.FAT文件系統(tǒng)總共由FAT12、FAT16以及FAT32三個(gè)版本,這是由于隨著存儲(chǔ)技術(shù)不斷發(fā)展,F(xiàn)AT文件系統(tǒng)迭代導(dǎo)致,數(shù)字越大,版本越新,新版本對(duì)老版本完全兼容!

3. FAT文件系統(tǒng)組成介紹

Fat文件系統(tǒng)官方文檔:

FAT文件系統(tǒng)在flash上的布局如下圖所示,總共由四個(gè)區(qū)域組成:

保留區(qū)

FAT區(qū)

根目錄區(qū) (FAT32類型不包含此區(qū)域)

數(shù)據(jù)區(qū)

695c66dc-6d8a-11ee-939d-92fbcf53809c.png

接下來(lái),我們對(duì)一張格式化為FAT格式的SD卡進(jìn)行分析,理解FAT文件系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié):

4. FAT文件系統(tǒng)分析

4.1 采用FAT格式格式化SD nand/sd卡

1.使用win10格式化一張118.5M的SD nand / sd卡,我這里用的是手上的一顆 創(chuàng)世CS 家的sd nand加一塊轉(zhuǎn)接板,和SD卡完全沒(méi)有區(qū)別,且SD nand在穩(wěn)定性上比SD卡具有優(yōu)勢(shì)。

6966d694-6d8a-11ee-939d-92fbcf53809c.jpg

此處由于SD nand(SD卡)大小原因,默認(rèn)采用FAT16進(jìn)行了格式化!因此在下文中我們先以FAT16進(jìn)行分析,之后再重新格式化為FAT32進(jìn)行分析,就很容易懂了!

4.2 引導(dǎo)扇區(qū)分析

1.使用 winhex 工具打開(kāi)對(duì)應(yīng)磁盤,注意需使用管理員權(quán)限運(yùn)行

696e437a-6d8a-11ee-939d-92fbcf53809c.jpg

2.打開(kāi)后我們可以以二進(jìn)制的格式查看SD卡上所有數(shù)據(jù),首先看到第一個(gè)扇區(qū),也就是對(duì)應(yīng)的引導(dǎo)扇區(qū) boot sector,注意引導(dǎo)扇區(qū)位于保留區(qū)!

697b1ce4-6d8a-11ee-939d-92fbcf53809c.png

3.接下來(lái)我們根據(jù)官方文檔 對(duì)引導(dǎo)扇區(qū)進(jìn)行分析

注意,F(xiàn)AT文件系統(tǒng)數(shù)據(jù)均采用小端格式!

a) 首先是FAT12/16/32公共部分,(偏移值 0 - 35):

EB 3C 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)

06 00:BPB_RsvdSecCnt,保留區(qū)的扇區(qū)數(shù),6 (通過(guò)此可計(jì)算,F(xiàn)AT區(qū)起始地址為 6 * 512 = 0xC00)

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 02:BPB_RootEntCnt,512,在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 媒體類型

ED 00:BPB_FATSz16,237,一個(gè)FAT占用的扇區(qū)數(shù),此字段僅在FAT12/16系統(tǒng)使用;FAT32系統(tǒng),此字段必須為0,使用BPB_FATSz32字段替代。FAT區(qū)總大小等于 BPB_FATSz?? * BPB_NumFATs 扇區(qū)(2372512=242688=0x3B400,由此可推算根目錄區(qū)起始地址:0x3B400+0xC00=0x3C000)。

3F 00:BPB_SecPerTrk,每個(gè)磁道的扇區(qū)數(shù),此字段僅與具有幾何形狀且僅用于 IBM PC 的磁盤 BIOS 的介質(zhì)相關(guān),不用管。

FF 00:BPB_NumHeads,頭數(shù)量,此字段僅與具有幾何形狀且僅用于 IBM PC 的磁盤 BIOS 的介質(zhì)相關(guān),不用管。

00 00 00 00:BPB_HiddSec,0,F(xiàn)AT 卷之前的隱藏物理扇區(qū)數(shù)(當(dāng)磁盤被分區(qū)之后,當(dāng)前分區(qū)并不一定是從扇區(qū)頭開(kāi)始的)

00 B4 03 00:BPB_TotSec32,242688,32位大小區(qū)域描述FAT卷扇區(qū)總數(shù)(整個(gè)卷空間大小)。FAT12/16系統(tǒng),扇區(qū)總數(shù)小于0x10000時(shí),此字段必須為0,真實(shí)值存放在BPB_FATSz16;FAT32系統(tǒng),此字段一直有效。(118.5M = 512 * 242688)

b) 接下來(lái)是FAT12/16特有字段(偏移值36)

80:BS_DrvNum,IBM PC 的磁盤 BIOS 使用的驅(qū)動(dòng)器號(hào),00h代表軟盤,80h代表固定磁盤

00:BS_Reserved,保留字段,0

29:BS_BootSig,擴(kuò)展引導(dǎo)簽名,表示以下存在三個(gè)字段

83 3E 07 E4: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 31 36 20 20 20:(解析為:"FAT16 "),BS_FilSysType文件系統(tǒng)類型,支持字段有:"FAT12 ", "FAT16 " or "FAT ",注意很多人認(rèn)為是通過(guò)此字段區(qū)分FAT12/16/32系統(tǒng)類型,實(shí)際是錯(cuò)誤的,文件系統(tǒng)類型實(shí)際上是根據(jù)磁盤大小確定的,官方文檔 “Determination of FAT sub-type” 章節(jié)或本博文后文有描述,不過(guò)為了最大的兼容性考慮,此字段應(yīng)設(shè)置為對(duì)應(yīng)文件系統(tǒng)的名字。

33 C9 ~ CB D8:BS_BootCode,引導(dǎo)啟動(dòng)程序,與平臺(tái)有關(guān),不使用時(shí)填充為0

55 AA:BS_BootSign,0xAA55,引導(dǎo)簽名,指示這是一個(gè)有效的引導(dǎo)扇區(qū)當(dāng)扇區(qū)大小大于512字節(jié)時(shí),剩余的字段應(yīng)全部使用0x0填充。

c) 如果是FAT32,則采用FAT32特有字段解析(偏移值和FAT12/16特有字段一致為36)

雖然此處我們的是FAT16格式,不過(guò)此處也將FAT的字段進(jìn)行描述,方便理解。

BPB_FATSz32:一個(gè)FAT占用的扇區(qū)數(shù),此字段僅在FAT32系統(tǒng)有效。FAT區(qū)總大小等于 BPB_FATSz?? * BPB_NumFATs 扇區(qū)。

BPB_ExtFlags:擴(kuò)展標(biāo)識(shí)字段,bit7=0,表示所有FAT都是鏡像的和活躍的;bit7=1,表示只有bit3-0表示的FAT是有效的。

BPB_FSVer:FAT32版本,高字節(jié)是主版本號(hào),低字節(jié)是次版本號(hào)。

BPB_RootClus:根目錄的第一個(gè)簇號(hào),此值通常為2,因?yàn)榍皟蓚€(gè)簇一般用于保留。

BPB_FSInfo:FSInfo結(jié)構(gòu)扇區(qū)與FAT32卷頂部的偏移扇區(qū)值。此值通常為1,因?yàn)槠渫ǔN挥谝龑?dǎo)扇區(qū)旁邊。

BPB_BkBootSec:備份引導(dǎo)扇區(qū)與FAT32卷頂部的偏移扇區(qū)值。此值通常為6,考慮最大的兼容性,此值不建議為其他值。

BPB_Reserved:保留

BS_DrvNum:含義與FAT12/16字段一樣

BS_Reserved:含義與FAT12/16字段一樣

BS_BootSig:含義與FAT12/16字段一樣

BS_VolID:含義與FAT12/16字段一樣

BS_VolLab:含義與FAT12/16字段一樣

BS_FilSysType:始終為"FAT32 ",對(duì)FAT類型的確定沒(méi)有任何影響。

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填充。

以上就是引導(dǎo)扇區(qū)內(nèi)容的詳細(xì)分析了,通過(guò)引導(dǎo)扇區(qū)的內(nèi)容,我們即可知道FAT文件系統(tǒng)依賴的硬件存儲(chǔ)空間大小、簇大小、扇區(qū)大小以及以及FAT系統(tǒng)版本等重要信息。

同時(shí)通過(guò)引導(dǎo)扇區(qū)的內(nèi)容,我們便可計(jì)算出對(duì)應(yīng)的FAT的四個(gè)區(qū)域的大小及起始偏移位置等重要信息,接下來(lái)計(jì)算FAT四個(gè)分區(qū)的起始位置及大小。

4.3 分區(qū)偏移及大小計(jì)算

FAT卷總共分為以下四個(gè)區(qū)域:

保留區(qū)

1.第一個(gè)扇區(qū)為引導(dǎo)扇區(qū),存放BPB(BIOS Parameter Block)數(shù)據(jù),存放的是FAT卷的配置參數(shù)。

2.上述參數(shù)中以 BPB_ 命名的字段都是 BPB 的一部分,而以 BS_ 標(biāo)題命名的字段都不是 BPB 的一部分,而只是引導(dǎo)扇區(qū)的一部分

FAT區(qū)(分區(qū)表裝載區(qū))

根目錄區(qū)

數(shù)據(jù)區(qū)

各分區(qū)偏移地址及大小如下:

697fb286-6d8a-11ee-939d-92fbcf53809c.png

此外,關(guān)于FAT區(qū),通常存在一個(gè)以上的FAT,如此處所格式化的sd卡便存在兩個(gè)FAT,對(duì)應(yīng)的偏移地址和大小如下:

6993d5fe-6d8a-11ee-939d-92fbcf53809c.png

4.4 FAT子類型確認(rèn)

關(guān)于FAT的類型是FAT12/16/32確認(rèn):FAT類型由數(shù)據(jù)區(qū)內(nèi)簇的數(shù)量決定,除此之外無(wú)其他辦法!

當(dāng)一個(gè)卷,簇的數(shù)量 ≤4085 時(shí),為FAT12

當(dāng)一個(gè)卷,簇的數(shù)量 ≥4086 且 ≤65525 時(shí),為FAT16

當(dāng)一個(gè)卷,簇的數(shù)量 ≥65526 時(shí),為FAT32

簇的數(shù)量計(jì)算公式:CountofClusters = DataSectors / BPB_SecPerClus;

如我們這里:CountofClusters = 242176 / 4 = 60544,所以為 FAT16!

當(dāng)簇的大小從 512 ~ 32768字節(jié)的各種條件下,不同類型FAT對(duì)應(yīng)卷的大小范圍如下:

699f8976-6d8a-11ee-939d-92fbcf53809c.jpg

4.4 訪問(wèn)FAT條目

FAT區(qū)由一條條FAT條目構(gòu)成,關(guān)于 FAT[N] 對(duì)應(yīng)的條目具體位置計(jì)算如下:

FAT16:

FAT32:

格外需要注意的是,不同格式,對(duì)應(yīng)的FAT條目的長(zhǎng)度和格式不一樣:

此外對(duì)于FAT32格式,高4位是保留位,只有低28位有效!

具體如下圖所示:

69aca642-6d8a-11ee-939d-92fbcf53809c.png

4.5 文件與簇之間的關(guān)系

那么文件和簇之間的相互關(guān)系又是怎樣的呢?我們又是如何準(zhǔn)確的找到存放在flash上的文件的呢?接下來(lái)讓我們看下文件與簇之間的關(guān)系映射。

在FAT卷上文件通過(guò)目錄管理,目錄是一個(gè)32字節(jié)數(shù)組組成的目錄條目結(jié)構(gòu),此目錄結(jié)構(gòu)包含:文件名、文件大小、時(shí)間戳以及文件所在的第一個(gè)簇號(hào)。

簇號(hào)為0和1的簇被保留,由參數(shù)BPB_RootClus可知,有效簇從第2號(hào)簇開(kāi)始。FAT[2](2號(hào)簇)對(duì)應(yīng)數(shù)據(jù)區(qū)的第一個(gè)簇。

因此第N個(gè)簇的位置計(jì)算公式如下:

FirstSectorofCluster = DataStartSector + (N - 2) * BPB_SecPerClus

每個(gè)條目所在的位置,對(duì)應(yīng)一個(gè)簇。當(dāng)文件長(zhǎng)度大于一個(gè)簇長(zhǎng)度時(shí),條目?jī)?nèi)的值為下一個(gè)條目的索引,直到文件所在的最后一個(gè)簇,由此構(gòu)成簇鏈!文件所在的最有一個(gè)簇所對(duì)應(yīng)的FAT條目?jī)?nèi)的值由一個(gè)特殊的值(EOC)組成,它永遠(yuǎn)不會(huì)匹配任何有效的簇號(hào),如下:

FAT12: 0xFF8 - 0xFFF (typically 0xFFF)

FAT16: 0xFFF8 - 0xFFFF (typically 0xFFFF)

FAT32: 0x0FFFFFF8 - 0x0FFFFFFF (typically 0x0FFFFFFF)

存在一些特殊的值被用來(lái)做損壞簇的標(biāo)記,如下:

FAT12:0xFF7

FAT16:0xFFF7

FAT32:0xFFFFFFF7

不過(guò)此處需要注意,在FAT12/16系統(tǒng)上,上述特殊值絕不會(huì)和任何有效簇匹配,但是在FAT32上有可能,因此為了防止混淆,你在創(chuàng)建FAT32系統(tǒng)的時(shí)候應(yīng)該避免這種情況發(fā)生!因此FAT32系統(tǒng)上簇的上限為268435445(大于256M個(gè)簇)

FAT條目初始化的時(shí)候,F(xiàn)AT[2] 及以后的數(shù)據(jù)應(yīng)被初始化為0,指示未被使用處于空閑狀態(tài),如果值不為0,則意味著簇被損壞或被使用狀態(tài)。在FAT12/16系統(tǒng)上,空閑簇的數(shù)量未被記錄,而在FAT32系統(tǒng)上,F(xiàn)AT32支持FSInfo結(jié)構(gòu)體,里面記錄了空閑簇的數(shù)量。

關(guān)于FAT[0]和FAT[1]:

此兩個(gè)保留的條目,沒(méi)有與任何簇有聯(lián)系;不過(guò)具有其他意義,如下:

FAT12: FAT[0] = 0xF??; FAT[1] = 0xFFF;

FAT16: FAT[0] = 0xFF??; FAT[1] = 0xFFFF;

FAT32: FAT[0] = 0xFFFFFF??; FAT[1] = 0xFFFFFFFF;

FAT[0]中的?? 與 BPB_Media 相同;

FAT[1] 記錄了錯(cuò)誤歷史記錄:卷臟標(biāo)志(FAT16:bit15、FAT32:bit31),系統(tǒng)在啟動(dòng)的時(shí)候清除此位,正常關(guān)閉的時(shí)候恢復(fù)。

如果此位已經(jīng)清除,表明上次未被正常關(guān)閉,可能存在邏輯卷錯(cuò)誤;硬件錯(cuò)誤標(biāo)志(FAT16:bit14、FAT32:bit30)當(dāng)出現(xiàn)無(wú)法恢復(fù)的讀寫錯(cuò)誤時(shí)清除,表明需要進(jìn)行全面檢查。

關(guān)于FAT區(qū)域,有兩個(gè)重點(diǎn)注意事項(xiàng):

第一個(gè)是FAT的最后一個(gè)扇區(qū)可能沒(méi)有被完全使用。在大多數(shù)情況下,F(xiàn)AT在扇區(qū)的中間結(jié)束。FAT驅(qū)動(dòng)程序不應(yīng)該對(duì)未使用的區(qū)域做出任何假設(shè)。在格式化卷時(shí),應(yīng)該用零填充它,并且在此之后不應(yīng)更改它。

另一個(gè)是BPB_FATSz16/32可以指示比卷需要的值大的值。換句話說(shuō),未使用的扇區(qū)可以跟隨每個(gè)FAT。這可能是數(shù)據(jù)區(qū)域?qū)R或其他原因?qū)е碌摹M瑫r(shí),在格式化時(shí)這些扇區(qū)也會(huì)被用零填充。

下表展示了不同F(xiàn)AT類型中FAT值所對(duì)應(yīng)的含義解釋:

69bbcd66-6d8a-11ee-939d-92fbcf53809c.png

4.6 FSInfo扇區(qū)結(jié)構(gòu)及備份引導(dǎo)扇區(qū)

此部分內(nèi)容只在FAT32系統(tǒng)上存在,對(duì)于FAT12系統(tǒng)FAT區(qū)域大小最大6KB,對(duì)于FAT16系統(tǒng)FAT區(qū)域最大128KB,但是在FAT32系統(tǒng)上FAT區(qū)域通常上達(dá)數(shù)MB,這是因?yàn)镕AT32系統(tǒng)支持FSInfo數(shù)據(jù)結(jié)構(gòu)。

在FAT32系統(tǒng)上新增FSInfo數(shù)據(jù)結(jié)構(gòu)的原因是:在FAT12/16系統(tǒng)上,想要知道flash上剩余的簇?cái)?shù)需要掃描整個(gè)FAT區(qū)才能計(jì)算出來(lái),但隨著flash容量的不斷擴(kuò)大,掃描花費(fèi)的時(shí)長(zhǎng)越來(lái)越長(zhǎng),為了避免掃描浪費(fèi)過(guò)多的時(shí)間,因此在FAT32系統(tǒng)上增加了FSInfo結(jié)構(gòu),用于記錄flash上剩余的簇?cái)?shù)。

FSInfo數(shù)據(jù)結(jié)構(gòu)如下:

69c37278-6d8a-11ee-939d-92fbcf53809c.png

注意:當(dāng)扇區(qū)大小大于512字節(jié)時(shí), 剩余空間采用0x00填充

4.7 FAT目錄

FAT目錄分為長(zhǎng)文件名目錄(LFN)以及短文件名目錄(SFN),長(zhǎng)文件目錄是在短文件名目錄上的一個(gè)擴(kuò)展,具體采用長(zhǎng)文件名還是短文件名由讀取FAT文件系統(tǒng)的操作系統(tǒng)決定,如windows;設(shè)置長(zhǎng)文件名時(shí)短文件名也被設(shè)置,具有兼容性。

此外,有一個(gè)很重要的概念:在FAT文件系統(tǒng)上目錄也是一個(gè)文件,只是此文件的屬性不一樣而已。

在所有目錄中,有一個(gè)比較特殊的是根目錄,且根目錄作為頂層目錄必須存在。

在FAT12/16系統(tǒng)中,根目錄不是一個(gè)文件,且放在根目錄區(qū),根目錄的最大條目數(shù)由 BPB_RootEntCnt 參數(shù)指示;

在FAT32系統(tǒng)中,根目錄與子目錄沒(méi)有什么區(qū)別,且根目錄的起始簇由 BPB_RootClus 參數(shù)指示。

根目錄與子目錄的另外一個(gè)區(qū)別是,根目錄不包含 . .. 此兩個(gè)點(diǎn)目錄,且它可以包含卷標(biāo)(具有ATTR_VOLUME_ID屬性的條目)

4.7.1 SFN 短文件名目錄

目錄條目結(jié)構(gòu)如下:

69d52c0c-6d8a-11ee-939d-92fbcf53809c.png

關(guān)于目錄結(jié)構(gòu)的第一個(gè)字段 DIR_Name 的第一個(gè)元素 DIR_Name[0] 在目錄表中有著特殊作用,如下:

當(dāng)此值為 0xE5 時(shí),代表此目錄條目未被使用(或已廢棄)

當(dāng)此值為 0x00 時(shí),也代表此目錄條目未被使用;此外還提示后續(xù)目錄條目也未被使用,因?yàn)楹罄m(xù)的目錄條目 DIR_Name[0] 都會(huì)是 0x00

如果文件名的第一個(gè)字符為 0xE5 這個(gè)特殊值,則使用 0x05 替代。

這么設(shè)計(jì)的意義是什么呢?將 DIR_Name[0] 用作特殊字符,其目錄在于方便文件刪除!當(dāng)我們刪除一個(gè)文件的時(shí)候,文件系統(tǒng)并不會(huì)將此文件所對(duì)應(yīng)的數(shù)據(jù)全部刪除,因?yàn)槟菢犹M(fèi)時(shí)間了,也沒(méi)有必要,而是直接將對(duì)應(yīng)文件的目錄項(xiàng)中的 DIR_Name[0] 修改為 0xE5 即可!

關(guān)于文件名字段 DIR_Name,在FAT文件系統(tǒng)中還有如下規(guī)定:

DIR_Name 字段的11字節(jié)的文件名分為兩個(gè)部分:8 字節(jié)的主文件名 + 3字節(jié)的擴(kuò)展名;

文件名中主文件名與擴(kuò)展名中間的 . 被省略,不在此記錄

如果主文件名長(zhǎng)度不夠,小于8字節(jié),則使用 0x20 空格填充

用于設(shè)置文件名的字符也有限制,支持的字符有 0~9 A~Z ! # $ % & ’ - @ ^ _ ` { } ~

主文件名和擴(kuò)展名中的(a~z)ASCII字符都會(huì)被轉(zhuǎn)化成大寫字符保存

以下為文件名存儲(chǔ)示例:

69dd9dc4-6d8a-11ee-939d-92fbcf53809c.png

4.7.2 LFN長(zhǎng)文件名

長(zhǎng)文件名是文件名的另外一種存儲(chǔ)方式,由于SFN短文件名具有長(zhǎng)度、字符等限制,在一些場(chǎng)景下不能很好的滿足需求,因此就需要使用到長(zhǎng)文件名,關(guān)于長(zhǎng)文件名的具體內(nèi)容如下:

長(zhǎng)文件名是一個(gè)具有特殊屬性的目錄條目。長(zhǎng)文件名目錄屬性 DIR_Attr 字段的值 ATTR_LONG_NAME = (ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID) = 0x0F;

69e5b7de-6d8a-11ee-939d-92fbcf53809c.png

關(guān)于長(zhǎng)文件名的目錄屬性如下:

69eacb5c-6d8a-11ee-939d-92fbcf53809c.png

關(guān)于長(zhǎng)文件名,有以下幾點(diǎn)重要概念:

一個(gè)文件一定有短文名SFN,但不一定有長(zhǎng)文件名LFN

長(zhǎng)文件名LFN字段中僅包含文件名信息,不包含其他內(nèi)容,其他內(nèi)容需要通過(guò)短文件名SFN查看

如果一個(gè)文件既有長(zhǎng)文件名也有短文件名,則長(zhǎng)文件名是其主要名字,而短文件名則為附加名字

長(zhǎng)文件名LFN條目在對(duì)應(yīng)的短文件名SFN條目前面

一個(gè)文件的長(zhǎng)文件名最長(zhǎng)255字符,對(duì)應(yīng)最多20個(gè)長(zhǎng)文件名LFN條目

長(zhǎng)文件名簡(jiǎn)單理解起始就是存儲(chǔ)一個(gè)字符串,因此沒(méi)有類似SFN的限制,允許有空格、支持大小寫、允許多個(gè).符號(hào)等

LFN條目文件名長(zhǎng)度不夠,仍然采用0x20填充

下圖是官方關(guān)于一個(gè)名為 “MultiMediaCard System Summary.pdf” 的長(zhǎng)文件名在flash上的長(zhǎng)文件名條目,如下所示,一眼沒(méi)看明白也沒(méi)關(guān)系,后文有實(shí)例說(shuō)明,對(duì)長(zhǎng)文件名有概念了就行!

69f34070-6d8a-11ee-939d-92fbcf53809c.jpg

關(guān)于長(zhǎng)文件名的checksum字段和計(jì)算,算法如下:

uint8_t create_sum (const DIR* entry)

{

int i;

uint8_t sum;

for (i = sum = 0; i < 11; i++) { /* Calculate sum of DIR_Name field */

sum = (sum >> 1) + (sum << 7) + entry->DIR_Name[i];

}

return sum;

}

4.7.3 LFN系統(tǒng)對(duì)于SFN的兼容

在使用LFN長(zhǎng)文件名的系統(tǒng)中,會(huì)自動(dòng)生成SFN短文件名已確保此文件在短文件名的文件系統(tǒng)中可使用。同時(shí)為了防止生成的短文件名沖突,SFN的生成采用 名稱+數(shù)字后綴+擴(kuò)展 的格式,同時(shí)采用以下規(guī)則生成SFN:

小寫自動(dòng)轉(zhuǎn)大寫

如果存在空格,則刪去空格,設(shè)置有損轉(zhuǎn)換標(biāo)識(shí)

已.開(kāi)頭的文件刪除頭部的.,并設(shè)置有損轉(zhuǎn)換標(biāo)識(shí)

存在多個(gè).的文件名,僅保留最后一個(gè)作為文件名與擴(kuò)展的分隔,并設(shè)置有損轉(zhuǎn)換標(biāo)識(shí)

其他不支持的字符,采用_代替,并設(shè)置有損轉(zhuǎn)換標(biāo)識(shí)

文件名如果是Unicode編碼,則轉(zhuǎn)化為ANSI/OEM編碼;不能轉(zhuǎn)換的字符采用_代替,并設(shè)置有損轉(zhuǎn)換標(biāo)識(shí)

長(zhǎng)度超過(guò)8字節(jié)的部分,截?cái)啵⒃O(shè)置有損轉(zhuǎn)換標(biāo)識(shí)

擴(kuò)展名字段超過(guò)3字節(jié)的,截?cái)啵⒃O(shè)置有損轉(zhuǎn)換標(biāo)識(shí)

有損轉(zhuǎn)轉(zhuǎn)換標(biāo)識(shí)為:~,ASCII值為0x7E,十進(jìn)制126

示例如下:

69f74846-6d8a-11ee-939d-92fbcf53809c.jpg

至此,F(xiàn)AT文件系統(tǒng)的理論部分已經(jīng)描述完了,接下來(lái)我們繼續(xù)使用winhex對(duì)數(shù)據(jù)進(jìn)行分析。

5. 分區(qū)分析

繼續(xù)回顧我們一開(kāi)始的這張布局圖

6a082dc8-6d8a-11ee-939d-92fbcf53809c.png

5.1 保留分區(qū)分析

保留分區(qū)為第一個(gè)分區(qū),其中引導(dǎo)扇區(qū)位于保留分區(qū)的第一個(gè)扇區(qū)。

根據(jù) 4.3 章節(jié)計(jì)算結(jié)果可知,保留分區(qū)起始地址為 0x00,大小 0xC00

保留分區(qū)數(shù)據(jù)如下,保留分區(qū)內(nèi)最重要的內(nèi)容即為引導(dǎo)扇區(qū),除引導(dǎo)扇區(qū)外,其他剩余空間全部保留,采用0x00覆蓋。關(guān)于引導(dǎo)扇區(qū)已在 4.2 章節(jié)詳細(xì)分析,此處不再做介紹。

6a149cc0-6d8a-11ee-939d-92fbcf53809c.png

5.2 FAT區(qū)分析

根據(jù) 4.3 章節(jié)描述,F(xiàn)AT區(qū)的起始地址為 0xC00,大小為 0x3B400,此外存在兩個(gè)FAT區(qū),F(xiàn)AT1和FAT2,起始地址分別為:0xC00、0x1E600,對(duì)應(yīng)地址數(shù)據(jù)如下:

FAT1 數(shù)據(jù):

6a257400-6d8a-11ee-939d-92fbcf53809c.png

FAT2 數(shù)據(jù)如下:

6a37d884-6d8a-11ee-939d-92fbcf53809c.png

由于此處采用FAT16格式,所以每個(gè)FAT條目占據(jù)兩個(gè)字節(jié)!

根據(jù)上述數(shù)據(jù)進(jìn)行分析:

確認(rèn) FAT2 為 FAT1 的備份;

存在5個(gè)FAT條目其中 FAT[0] 和 FAT[1] 為保留條目,F(xiàn)AT[0] 的內(nèi)容與 BPB_Media 媒體類型字段一致,F(xiàn)AT[1] 用來(lái)記錄錯(cuò)誤歷史記錄 (詳見(jiàn) 4.5 章節(jié)描述)

根據(jù)4.5章節(jié)描述,F(xiàn)AT[2](2號(hào)簇)對(duì)應(yīng)數(shù)據(jù)區(qū)的第一個(gè)簇,又FAT[2]、FAT[3]、FAT[4] 數(shù)據(jù)均為 0xFF,表明存在三個(gè)文件,且每個(gè)文件的大小小于等于一個(gè)簇的空間;且分別存放在數(shù)據(jù)區(qū)第1到第3個(gè)簇上!

此處可能大家會(huì)由疑問(wèn),剛剛格式化的sd卡為什么會(huì)存在文件內(nèi),其實(shí)這個(gè)是系統(tǒng)文件,格式化后自帶的,默認(rèn)是隱藏的,只有使用winhex才能看到,也就是對(duì)應(yīng)的System Volume Information文件夾。

5.3 根目錄區(qū)分析

注意,根目錄區(qū)只有 FAT12 / FAT16 系統(tǒng)上存在,在FAT32系統(tǒng)上不存在此區(qū)域。

根目錄區(qū)用來(lái)記錄根目錄下的文件內(nèi)容,根據(jù) 4.3 章節(jié)計(jì)算可知,根目錄區(qū)起始地址為:0x3C000,大小為0x4000,數(shù)據(jù)內(nèi)容如下:

6a3cc7ae-6d8a-11ee-939d-92fbcf53809c.png

以下是對(duì)數(shù)據(jù)字段進(jìn)行分析后的內(nèi)容,如下圖所示:

6a54a0a4-6d8a-11ee-939d-92fbcf53809c.png

格式化之后,默認(rèn)會(huì)生成一個(gè)System Volume Infomation的系統(tǒng)文件夾,同時(shí)此文件夾是根目錄下唯一的一個(gè)文件,因此在根目錄的數(shù)據(jù)如上圖所示。

此文件夾為目錄屬性,是隱藏的系統(tǒng)目錄

長(zhǎng)文件名為System Volume Information,短文件名為SYSTEM~1

此目錄指向存放的數(shù)據(jù)在2號(hào)簇(對(duì)應(yīng)數(shù)據(jù)區(qū)第一個(gè)簇),文件大小字段,由于此文件為目錄屬性,此字段無(wú)意義,因此強(qiáng)制為0

至此,根目錄區(qū)分析完了,同時(shí)根目錄區(qū)的 System Volume Information文件指向數(shù)據(jù)區(qū)第一個(gè)簇(2號(hào)簇),接下來(lái)我們便進(jìn)入數(shù)據(jù)區(qū)進(jìn)行分析。

5.4 數(shù)據(jù)區(qū)分析

根據(jù) 4.3 章節(jié)計(jì)算可知,數(shù)據(jù)區(qū)起始地址為:0x40000,大小為242176 * 512 = 0x764 0000,數(shù)據(jù)內(nèi)容如下:

6a657fc8-6d8a-11ee-939d-92fbcf53809c.png

對(duì)應(yīng)數(shù)據(jù)字段分析如下:

6a7488e2-6d8a-11ee-939d-92fbcf53809c.png

System Volume Information 目錄下存在兩個(gè)文件,分別是IndexerVolumeGuid 和 WPSettings.dat。根據(jù)上述分析可知:

IndexerVolumeGuid文件的數(shù)據(jù)存放在 FAT[3],3號(hào)簇上,即數(shù)據(jù)區(qū)的第3個(gè)簇(數(shù)據(jù)區(qū)的第1個(gè)簇為2號(hào)簇);

WPSettings.dat 文件的數(shù)據(jù)存放在 FAT[4],4號(hào)簇上,即數(shù)據(jù)區(qū)的第2個(gè)簇(數(shù)據(jù)區(qū)的第1個(gè)簇為2號(hào)簇);

首先,我們跳轉(zhuǎn)到4號(hào)簇上查看IndexerVolumeGuid的數(shù)據(jù),對(duì)應(yīng)地址計(jì)算方式為:

FirstSectorofCluster = DataStartSector + (N - 2) * BPB_SecPerClus = 512 + (4 - 2) * 4

= 520;

對(duì)應(yīng)地址為:FirstSectorofCluster * BPB_BytsPerSec = 520 * 512 = 0x0004 1000

6a8fa960-6d8a-11ee-939d-92fbcf53809c.png

接著跳轉(zhuǎn)到3號(hào)簇上查看WPSettings.dat的數(shù)據(jù),對(duì)應(yīng)地址計(jì)算方式為:

FirstSectorofCluster = DataStartSector + (N - 2) * BPB_SecPerClus = 512 + (3 - 2) * 4

= 516;

對(duì)應(yīng)地址為:FirstSectorofCluster * BPB_BytsPerSec = 520 * 512 = 0x0004 0800

6a95023e-6d8a-11ee-939d-92fbcf53809c.png

5.5 新增文件測(cè)試

1.在根目錄下新增 test 目錄,使用winhex更新磁盤數(shù)據(jù),觀察各數(shù)據(jù)區(qū)變化

保留區(qū)無(wú)變化

FAT區(qū)變化如下:

6ab2ee70-6d8a-11ee-939d-92fbcf53809c.png

6ac90214-6d8a-11ee-939d-92fbcf53809c.png

根目錄區(qū)變化如下:

6ad172f0-6d8a-11ee-939d-92fbcf53809c.png

數(shù)據(jù)區(qū)變化:

6aeed386-6d8a-11ee-939d-92fbcf53809c.png

2.新增long file test文件夾,里面存入一個(gè) 長(zhǎng)度為 2050 Byte(占據(jù)兩個(gè)簇的空間) 的test.txt文件,使用winhex重新打開(kāi)磁盤進(jìn)行分析。

6b07e678-6d8a-11ee-939d-92fbcf53809c.jpg

保留區(qū)無(wú)變化

FAT區(qū)變化如下:

6b115b4a-6d8a-11ee-939d-92fbcf53809c.png

根目錄區(qū)變化如下:

數(shù)據(jù)區(qū)變化如下: long file test 目錄數(shù)據(jù)指向6號(hào)簇,跳轉(zhuǎn)至6號(hào)簇,地址 DataStartSector + (N - 2) * BPB_SecPerClus = 0x40000 + (6-2) * 4 * 512 = 0x420000

6b260568-6d8a-11ee-939d-92fbcf53809c.png

test.txt 文件指向 7號(hào)簇,跳轉(zhuǎn)至7號(hào)簇,地址 DataStartSector + (N - 2) * BPB_SecPerClus = 0x40000 + (7-2) * 4 * 512 = 0x428000,均為test.txt的實(shí)際有效數(shù)據(jù),如下:

6b31ae0e-6d8a-11ee-939d-92fbcf53809c.png

6. 總結(jié)

以上便是關(guān)于FAT文件系統(tǒng)的全部分析了,通過(guò)上述分析,外加新增文件輔助理解,對(duì)于文件在FAT文件系統(tǒng)下如何管理、存儲(chǔ),相信已經(jīng)有了非常深入的了解。

FAT文件系統(tǒng)分為四個(gè)區(qū):

保留區(qū)最重要的是里面包含引導(dǎo)扇區(qū),引導(dǎo)扇區(qū)內(nèi)存放著B(niǎo)IOS參數(shù)信息,通過(guò)此參數(shù)可以知道FAT文件系統(tǒng)的flash布局,以及flash大小,fat塊大小、簇大小等關(guān)鍵信息;

FAT區(qū),記錄了文件所占用簇的情況,以及對(duì)于文件大小大于一個(gè)簇的文件,在FAT區(qū)內(nèi)形成簇鏈,記錄文件由哪幾個(gè)簇組成

根目錄區(qū),只有FAT12/16系統(tǒng)所有,記錄了根目錄下的文件/目錄條目信息

數(shù)據(jù)區(qū),記錄數(shù)據(jù)分為兩個(gè)部分,第一部分為目錄信息,除根目錄外,每個(gè)文件夾需要占據(jù)一個(gè)及以上的簇描述對(duì)應(yīng)目錄下的文件情況;第二部分為具體文件數(shù)據(jù)。兩部分?jǐn)?shù)據(jù)通過(guò)短文件名SFN字段進(jìn)行關(guān)聯(lián)!

以上就是FAT文件系統(tǒng)的簡(jiǎn)單概括,由于本文使用的是FAT16文件系統(tǒng)作為實(shí)例分析。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1644

    瀏覽量

    148719
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11350

    瀏覽量

    210462
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7546

    瀏覽量

    88690
  • FAT
    FAT
    +關(guān)注

    關(guān)注

    0

    文章

    38

    瀏覽量

    25946
  • 文件系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    287

    瀏覽量

    19989

原文標(biāo)題:5. 分區(qū)分析

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FAT32文件系統(tǒng)淺析

    FAT32文件系統(tǒng)淺析: Windows95 OSR2 和Windows 98 開(kāi)始支持FAT32文件系統(tǒng),它是對(duì)早期DOS 的FAT16
    發(fā)表于 09-14 08:02 ?62次下載

    FAT32文件系統(tǒng)結(jié)構(gòu)的技術(shù)參數(shù)分析

    FAT32文件系統(tǒng)結(jié)構(gòu)的技術(shù)參數(shù)分析:詳細(xì)分析FAT32 的主引導(dǎo)記錄、FAT32引導(dǎo)記錄、
    發(fā)表于 09-26 10:31 ?57次下載

    基于FAT的機(jī)頂盒PVR文件系統(tǒng)的研究

    簡(jiǎn)要介紹了機(jī)頂盒PVR功能,分析了機(jī)頂盒PVR功能對(duì)文件系統(tǒng)提出的要求,具體闡述了FAT文件系統(tǒng)的原理,在此基礎(chǔ)上重點(diǎn)討論了FAT
    發(fā)表于 12-29 16:58 ?18次下載

    磁盤結(jié)構(gòu)與FAT文件系統(tǒng)

    磁盤結(jié)構(gòu)與FAT文件系統(tǒng)FAT 文件系統(tǒng)的組織結(jié)構(gòu)1. 軟盤數(shù)據(jù)的邏輯存儲(chǔ)軟盤無(wú)須低級(jí)格式化和分區(qū)操作,只需用FORMAT 命令做高級(jí)格式化即可。經(jīng)過(guò)格式化操作
    發(fā)表于 04-14 10:40 ?1526次閱讀

    FAT32文件系統(tǒng)是什么意思

    FAT32文件系統(tǒng)是什么意思  (一)FAT32 文件系統(tǒng)將邏輯盤的空間劃分為三部分,依次是引導(dǎo)區(qū)(BOOT區(qū))、文件
    發(fā)表于 04-15 15:53 ?2.1w次閱讀

    嵌入式FAT文件系統(tǒng)免費(fèi)源碼下載

    文件系統(tǒng) 是由本人個(gè)人開(kāi)發(fā)的,全部代碼在VC下編寫,測(cè)試。VC下測(cè)試基于虛擬磁盤驅(qū)動(dòng)(在Flash_management.c)實(shí)現(xiàn)對(duì)磁盤的讀寫。實(shí)現(xiàn)的文件系統(tǒng)兼容 FAT16 /FAT
    發(fā)表于 08-04 14:41 ?72次下載
    嵌入式<b class='flag-5'>FAT</b><b class='flag-5'>文件系統(tǒng)</b>免費(fèi)源碼下載

    fat32_fat32文件系統(tǒng)

    本內(nèi)容講述了fat32_fat32文件系統(tǒng)的基礎(chǔ)內(nèi)容,涉及FAT32定義,功能,fat32兼容性等及fat32轉(zhuǎn)ntfs知識(shí)
    發(fā)表于 05-21 16:41 ?6012次閱讀

    FAT文件系統(tǒng)基本原理和基礎(chǔ)知識(shí)

    介紹FAT文件系統(tǒng)的基本原理和基礎(chǔ)知識(shí) 有需要的可以參考下
    發(fā)表于 12-24 11:27 ?0次下載

    FAT文件系統(tǒng)的組織結(jié)構(gòu)

    FAT文件系統(tǒng)的組織結(jié)構(gòu),很好的學(xué)習(xí)資料,快來(lái)下載吧
    發(fā)表于 02-16 16:35 ?2次下載

    fat文件系統(tǒng)原理

    fat文件系統(tǒng)原理,很好的學(xué)習(xí)資料,快來(lái)下載吧
    發(fā)表于 02-16 16:35 ?7次下載

    fat文件系統(tǒng)筆記

    私人累積的fat文件系統(tǒng)筆記
    發(fā)表于 03-13 15:05 ?4次下載

    FAT32文件系統(tǒng)說(shuō)明

    FAT32文件系統(tǒng)。在一邏輯盤(硬盤的一分區(qū))超過(guò) 512 兆字節(jié)時(shí)使用這種格式,會(huì)更高效地存儲(chǔ)數(shù)據(jù),減少硬盤空間的浪費(fèi),一般還會(huì)使程序運(yùn)行加快,使用的計(jì)算機(jī)系統(tǒng)資源更少,因此是使用大容量硬盤存儲(chǔ)
    發(fā)表于 03-16 11:27 ?16次下載

    FAT32文件系統(tǒng)規(guī)范和FAT磁盤格式概述

    FAT文件分配表)文件系統(tǒng)起源于20世紀(jì)70年代末和80年代初,是Microsoft?MS-DOS?操作系統(tǒng)支持的文件系統(tǒng)。它最初是作為一
    發(fā)表于 03-18 17:35 ?5次下載
    <b class='flag-5'>FAT</b>32<b class='flag-5'>文件系統(tǒng)</b>規(guī)范和<b class='flag-5'>FAT</b>磁盤格式概述

    FAT32文件系統(tǒng)基礎(chǔ)知識(shí)

    FAT32文件系統(tǒng)基礎(chǔ)知識(shí)免費(fèi)下載。
    發(fā)表于 06-11 09:16 ?31次下載

    FAT32文件系統(tǒng)詳細(xì)分析 (格式化SD nand/SD卡)

    文章目錄FAT32文件系統(tǒng)詳細(xì)分析(續(xù)FAT文件系統(tǒng)詳解)1.前言2.格式化SDnand/SD卡3.FA
    的頭像 發(fā)表于 10-18 17:12 ?1357次閱讀
    <b class='flag-5'>FAT</b>32<b class='flag-5'>文件系統(tǒng)</b>詳細(xì)<b class='flag-5'>分析</b> (格式化SD nand/SD卡)