精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

FAT文件系統的實例分析

Linux愛好者 ? 來源:Linux愛好者 ? 2023-10-27 15:14 ? 次閱讀

1. 簡介

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

因此針對上述問題,一群大佬們便開始設計文件系統這樣一個東西,用來管理硬盤/flash上的數據信息,像我們電腦上打開文件夾,訪問里面的文件,這其實就是基于文件系統訪問電腦硬盤上數據的一個操作。

發展至今,文件系統已有眾多版本,本文主要分享 關于FAT文件系統的詳細設計, FAT文件系統適用于嵌入式設備,如SD卡、SD nand、spi nor flash等眾多存儲設備,同時基于此文件系統的文件亦能被電腦正常讀取。

2. 基礎概念

在研究文件系統之前,我們需要首先弄清楚關于內存這塊的幾個基本概念:

2.1.區分 扇區、塊、簇的概念

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

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

2.2.FAT文件系統總共由FAT12、FAT16以及FAT32三個版本,這是由于隨著存儲技術不斷發展,FAT文件系統迭代導致,數字越大,版本越新,新版本對老版本完全兼容!

3. FAT文件系統組成介紹

Fat文件系統官方文檔:

FAT文件系統在flash上的布局如下圖所示,總共由四個區域組成:

保留區

FAT區

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

數據區

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

接下來,我們對一張格式化為FAT格式的SD卡進行分析,理解FAT文件系統的實現細節:

4. FAT文件系統分析

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

1.使用win10格式化一張118.5M的SD nand / sd卡,我這里用的是手上的一顆 創世CS 家的sd nand加一塊轉接板,和SD卡完全沒有區別,且SD nand在穩定性上比SD卡具有優勢。

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

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

4.2 引導扇區分析

1.使用 winhex 工具打開對應磁盤,注意需使用管理員權限運行

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

2.打開后我們可以以二進制的格式查看SD卡上所有數據,首先看到第一個扇區,也就是對應的引導扇區 boot sector,注意引導扇區位于保留區!

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

3.接下來我們根據官方文檔 對引導扇區進行分析

注意,FAT文件系統數據均采用小端格式!

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

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

06 00:BPB_RsvdSecCnt,保留區的扇區數,6 (通過此可計算,FAT區起始地址為 6 * 512 = 0xC00)

02:BPB_NumFATs,FATs的個數,2(一般此值為2,多一個用來做冗余備份,解決系統異常導致第一個損壞時,增大恢復的可能性,表示FAT區有兩個FATs備份)

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

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

3F 00:BPB_SecPerTrk,每個磁道的扇區數,此字段僅與具有幾何形狀且僅用于 IBM PC 的磁盤 BIOS 的介質相關,不用管。

FF 00:BPB_NumHeads,頭數量,此字段僅與具有幾何形狀且僅用于 IBM PC 的磁盤 BIOS 的介質相關,不用管。

00 00 00 00:BPB_HiddSec,0,FAT 卷之前的隱藏物理扇區數(當磁盤被分區之后,當前分區并不一定是從扇區頭開始的)

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

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

80:BS_DrvNum,IBM PC 的磁盤 BIOS 使用的驅動器號,00h代表軟盤,80h代表固定磁盤

00:BS_Reserved,保留字段,0

29:BS_BootSig,擴展引導簽名,表示以下存在三個字段

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

33 C9 ~ CB D8:BS_BootCode,引導啟動程序,與平臺有關,不使用時填充為0

55 AA:BS_BootSign,0xAA55,引導簽名,指示這是一個有效的引導扇區當扇區大小大于512字節時,剩余的字段應全部使用0x0填充。

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

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

BPB_FATSz32:一個FAT占用的扇區數,此字段僅在FAT32系統有效。FAT區總大小等于 BPB_FATSz?? * BPB_NumFATs 扇區。

BPB_ExtFlags:擴展標識字段,bit7=0,表示所有FAT都是鏡像的和活躍的;bit7=1,表示只有bit3-0表示的FAT是有效的。

BPB_FSVer:FAT32版本,高字節是主版本號,低字節是次版本號。

BPB_RootClus:根目錄的第一個簇號,此值通常為2,因為前兩個簇一般用于保留。

BPB_FSInfo:FSInfo結構扇區與FAT32卷頂部的偏移扇區值。此值通常為1,因為其通常位于引導扇區旁邊。

BPB_BkBootSec:備份引導扇區與FAT32卷頂部的偏移扇區值。此值通常為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 ",對FAT類型的確定沒有任何影響。

BS_BootCode32:引導啟動程序,與平臺有關,不使用時填充為0

BS_BootSign:0xAA55,引導簽名,指示這是一個有效的引導扇區當扇區大小大于512字節時,剩余的字段應全部使用0x0填充。

以上就是引導扇區內容的詳細分析了,通過引導扇區的內容,我們即可知道FAT文件系統依賴的硬件存儲空間大小、簇大小、扇區大小以及以及FAT系統版本等重要信息。

同時通過引導扇區的內容,我們便可計算出對應的FAT的四個區域的大小及起始偏移位置等重要信息,接下來計算FAT四個分區的起始位置及大小。

4.3 分區偏移及大小計算

FAT卷總共分為以下四個區域:

保留區

1.第一個扇區為引導扇區,存放BPB(BIOS Parameter Block)數據,存放的是FAT卷的配置參數

2.上述參數中以 BPB_ 命名的字段都是 BPB 的一部分,而以 BS_ 標題命名的字段都不是 BPB 的一部分,而只是引導扇區的一部分

FAT區(分區表裝載區)

根目錄區

數據區

各分區偏移地址及大小如下:

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

此外,關于FAT區,通常存在一個以上的FAT,如此處所格式化的sd卡便存在兩個FAT,對應的偏移地址和大小如下:

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

4.4 FAT子類型確認

關于FAT的類型是FAT12/16/32確認:FAT類型由數據區內簇的數量決定,除此之外無其他辦法!

當一個卷,簇的數量 ≤4085 時,為FAT12

當一個卷,簇的數量 ≥4086 且 ≤65525 時,為FAT16

當一個卷,簇的數量 ≥65526 時,為FAT32

簇的數量計算公式:CountofClusters = DataSectors / BPB_SecPerClus;

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

當簇的大小從 512 ~ 32768字節的各種條件下,不同類型FAT對應卷的大小范圍如下:

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

4.4 訪問FAT條目

FAT區由一條條FAT條目構成,關于 FAT[N] 對應的條目具體位置計算如下:

FAT16:

FAT32:

格外需要注意的是,不同格式,對應的FAT條目的長度和格式不一樣:

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

具體如下圖所示:

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

4.5 文件與簇之間的關系

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

在FAT卷上文件通過目錄管理,目錄是一個32字節數組組成的目錄條目結構,此目錄結構包含:文件名、文件大小、時間戳以及文件所在的第一個簇號。

簇號為0和1的簇被保留,由參數BPB_RootClus可知,有效簇從第2號簇開始。FAT[2](2號簇)對應數據區的第一個簇。

因此第N個簇的位置計算公式如下:

FirstSectorofCluster = DataStartSector + (N - 2) * BPB_SecPerClus

每個條目所在的位置,對應一個簇。當文件長度大于一個簇長度時,條目內的值為下一個條目的索引,直到文件所在的最后一個簇,由此構成簇鏈!文件所在的最有一個簇所對應的FAT條目內的值由一個特殊的值(EOC)組成,它永遠不會匹配任何有效的簇號,如下:

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

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

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

存在一些特殊的值被用來做損壞簇的標記,如下:

FAT12:0xFF7

FAT16:0xFFF7

FAT32:0xFFFFFFF7

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

FAT條目初始化的時候,FAT[2] 及以后的數據應被初始化為0,指示未被使用處于空閑狀態,如果值不為0,則意味著簇被損壞或被使用狀態。在FAT12/16系統上,空閑簇的數量未被記錄,而在FAT32系統上,FAT32支持FSInfo結構體,里面記錄了空閑簇的數量。

關于FAT[0]和FAT[1]:

此兩個保留的條目,沒有與任何簇有聯系;不過具有其他意義,如下:

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] 記錄了錯誤歷史記錄:卷臟標志(FAT16:bit15、FAT32:bit31),系統在啟動的時候清除此位,正常關閉的時候恢復。

如果此位已經清除,表明上次未被正常關閉,可能存在邏輯卷錯誤;硬件錯誤標志(FAT16:bit14、FAT32:bit30)當出現無法恢復的讀寫錯誤時清除,表明需要進行全面檢查。

關于FAT區域,有兩個重點注意事項:

第一個是FAT的最后一個扇區可能沒有被完全使用。在大多數情況下,FAT在扇區的中間結束。FAT驅動程序不應該對未使用的區域做出任何假設。在格式化卷時,應該用零填充它,并且在此之后不應更改它。

另一個是BPB_FATSz16/32可以指示比卷需要的值大的值。換句話說,未使用的扇區可以跟隨每個FAT。這可能是數據區域對齊或其他原因導致的。同時,在格式化時這些扇區也會被用零填充。

下表展示了不同FAT類型中FAT值所對應的含義解釋:

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

4.6 FSInfo扇區結構及備份引導扇區

此部分內容只在FAT32系統上存在,對于FAT12系統FAT區域大小最大6KB,對于FAT16系統FAT區域最大128KB,但是在FAT32系統上FAT區域通常上達數MB,這是因為FAT32系統支持FSInfo數據結構。

在FAT32系統上新增FSInfo數據結構的原因是:在FAT12/16系統上,想要知道flash上剩余的簇數需要掃描整個FAT區才能計算出來,但隨著flash容量的不斷擴大,掃描花費的時長越來越長,為了避免掃描浪費過多的時間,因此在FAT32系統上增加了FSInfo結構,用于記錄flash上剩余的簇數。

FSInfo數據結構如下:

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

注意:當扇區大小大于512字節時, 剩余空間采用0x00填充

4.7 FAT目錄

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

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

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

在FAT12/16系統中,根目錄不是一個文件,且放在根目錄區,根目錄的最大條目數由 BPB_RootEntCnt 參數指示;

在FAT32系統中,根目錄與子目錄沒有什么區別,且根目錄的起始簇由 BPB_RootClus 參數指示。

根目錄與子目錄的另外一個區別是,根目錄不包含 . .. 此兩個點目錄,且它可以包含卷標(具有ATTR_VOLUME_ID屬性的條目)

4.7.1 SFN 短文件名目錄

目錄條目結構如下:

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

關于目錄結構的第一個字段 DIR_Name 的第一個元素 DIR_Name[0] 在目錄表中有著特殊作用,如下:

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

當此值為 0x00 時,也代表此目錄條目未被使用;此外還提示后續目錄條目也未被使用,因為后續的目錄條目 DIR_Name[0] 都會是 0x00

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

這么設計的意義是什么呢?將 DIR_Name[0] 用作特殊字符,其目錄在于方便文件刪除!當我們刪除一個文件的時候,文件系統并不會將此文件所對應的數據全部刪除,因為那樣太費時間了,也沒有必要,而是直接將對應文件的目錄項中的 DIR_Name[0] 修改為 0xE5 即可!

關于文件名字段 DIR_Name,在FAT文件系統中還有如下規定:

DIR_Name 字段的11字節的文件名分為兩個部分:8 字節的主文件名 + 3字節的擴展名;

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

如果主文件名長度不夠,小于8字節,則使用 0x20 空格填充

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

主文件名和擴展名中的(a~z)ASCII字符都會被轉化成大寫字符保存

以下為文件名存儲示例:

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

4.7.2 LFN長文件名

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

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

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

關于長文件名的目錄屬性如下:

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

關于長文件名,有以下幾點重要概念:

一個文件一定有短文名SFN,但不一定有長文件名LFN

長文件名LFN字段中僅包含文件名信息,不包含其他內容,其他內容需要通過短文件名SFN查看

如果一個文件既有長文件名也有短文件名,則長文件名是其主要名字,而短文件名則為附加名字

長文件名LFN條目在對應的短文件名SFN條目前面

一個文件的長文件名最長255字符,對應最多20個長文件名LFN條目

長文件名簡單理解起始就是存儲一個字符串,因此沒有類似SFN的限制,允許有空格、支持大小寫、允許多個.符號等

LFN條目文件名長度不夠,仍然采用0x20填充

下圖是官方關于一個名為 “MultiMediaCard System Summary.pdf” 的長文件名在flash上的長文件名條目,如下所示,一眼沒看明白也沒關系,后文有實例說明,對長文件名有概念了就行!

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

關于長文件名的checksum字段和計算,算法如下:

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系統對于SFN的兼容

在使用LFN長文件名的系統中,會自動生成SFN短文件名已確保此文件在短文件名的文件系統中可使用。同時為了防止生成的短文件名沖突,SFN的生成采用 名稱+數字后綴+擴展 的格式,同時采用以下規則生成SFN:

小寫自動轉大寫

如果存在空格,則刪去空格,設置有損轉換標識

已.開頭的文件刪除頭部的.,并設置有損轉換標識

存在多個.的文件名,僅保留最后一個作為文件名與擴展的分隔,并設置有損轉換標識

其他不支持的字符,采用_代替,并設置有損轉換標識

文件名如果是Unicode編碼,則轉化為ANSI/OEM編碼;不能轉換的字符采用_代替,并設置有損轉換標識

長度超過8字節的部分,截斷,并設置有損轉換標識

擴展名字段超過3字節的,截斷,并設置有損轉換標識

有損轉轉換標識為:~,ASCII值為0x7E,十進制126

示例如下:

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

至此,FAT文件系統的理論部分已經描述完了,接下來我們繼續使用winhex對數據進行分析。

5. 分區分析

繼續回顧我們一開始的這張布局圖

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

5.1 保留分區分析

保留分區為第一個分區,其中引導扇區位于保留分區的第一個扇區。

根據 4.3 章節計算結果可知,保留分區起始地址為 0x00,大小 0xC00

保留分區數據如下,保留分區內最重要的內容即為引導扇區,除引導扇區外,其他剩余空間全部保留,采用0x00覆蓋。關于引導扇區已在 4.2 章節詳細分析,此處不再做介紹。

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

5.2 FAT區分析

根據 4.3 章節描述,FAT區的起始地址為 0xC00,大小為 0x3B400,此外存在兩個FAT區,FAT1和FAT2,起始地址分別為:0xC00、0x1E600,對應地址數據如下:

FAT1 數據:

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

FAT2 數據如下:

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

由于此處采用FAT16格式,所以每個FAT條目占據兩個字節!

根據上述數據進行分析:

確認 FAT2 為 FAT1 的備份;

存在5個FAT條目其中 FAT[0] 和 FAT[1] 為保留條目,FAT[0] 的內容與 BPB_Media 媒體類型字段一致,FAT[1] 用來記錄錯誤歷史記錄 (詳見 4.5 章節描述)

根據4.5章節描述,FAT[2](2號簇)對應數據區的第一個簇,又FAT[2]、FAT[3]、FAT[4] 數據均為 0xFF,表明存在三個文件,且每個文件的大小小于等于一個簇的空間;且分別存放在數據區第1到第3個簇上!

此處可能大家會由疑問,剛剛格式化的sd卡為什么會存在文件內,其實這個是系統文件,格式化后自帶的,默認是隱藏的,只有使用winhex才能看到,也就是對應的System Volume Information文件夾。

5.3 根目錄區分析

注意,根目錄區只有 FAT12 / FAT16 系統上存在,在FAT32系統上不存在此區域。

根目錄區用來記錄根目錄下的文件內容,根據 4.3 章節計算可知,根目錄區起始地址為:0x3C000,大小為0x4000,數據內容如下:

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

以下是對數據字段進行分析后的內容,如下圖所示:

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

格式化之后,默認會生成一個System Volume Infomation的系統文件夾,同時此文件夾是根目錄下唯一的一個文件,因此在根目錄的數據如上圖所示。

此文件夾為目錄屬性,是隱藏的系統目錄

長文件名為System Volume Information,短文件名為SYSTEM~1

此目錄指向存放的數據在2號簇(對應數據區第一個簇),文件大小字段,由于此文件為目錄屬性,此字段無意義,因此強制為0

至此,根目錄區分析完了,同時根目錄區的 System Volume Information文件指向數據區第一個簇(2號簇),接下來我們便進入數據區進行分析。

5.4 數據區分析

根據 4.3 章節計算可知,數據區起始地址為:0x40000,大小為242176 * 512 = 0x764 0000,數據內容如下:

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

對應數據字段分析如下:

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

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

IndexerVolumeGuid文件的數據存放在 FAT[3],3號簇上,即數據區的第3個簇(數據區的第1個簇為2號簇);

WPSettings.dat 文件的數據存放在 FAT[4],4號簇上,即數據區的第2個簇(數據區的第1個簇為2號簇);

首先,我們跳轉到4號簇上查看IndexerVolumeGuid的數據,對應地址計算方式為:

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

= 520;

對應地址為:FirstSectorofCluster * BPB_BytsPerSec = 520 * 512 = 0x0004 1000

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

接著跳轉到3號簇上查看WPSettings.dat的數據,對應地址計算方式為:

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

= 516;

對應地址為:FirstSectorofCluster * BPB_BytsPerSec = 520 * 512 = 0x0004 0800

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

5.5 新增文件測試

1.在根目錄下新增 test 目錄,使用winhex更新磁盤數據,觀察各數據區變化

保留區無變化

FAT區變化如下:

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

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

根目錄區變化如下:

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

數據區變化:

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

2.新增long file test文件夾,里面存入一個 長度為 2050 Byte(占據兩個簇的空間) 的test.txt文件,使用winhex重新打開磁盤進行分析。

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

保留區無變化

FAT區變化如下:

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

根目錄區變化如下:

數據區變化如下: long file test 目錄數據指向6號簇,跳轉至6號簇,地址 DataStartSector + (N - 2) * BPB_SecPerClus = 0x40000 + (6-2) * 4 * 512 = 0x420000

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

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

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

6. 總結

以上便是關于FAT文件系統的全部分析了,通過上述分析,外加新增文件輔助理解,對于文件在FAT文件系統下如何管理、存儲,相信已經有了非常深入的了解。

FAT文件系統分為四個區:

保留區最重要的是里面包含引導扇區,引導扇區內存放著BIOS參數信息,通過此參數可以知道FAT文件系統的flash布局,以及flash大小,fat塊大小、簇大小等關鍵信息;

FAT區,記錄了文件所占用簇的情況,以及對于文件大小大于一個簇的文件,在FAT區內形成簇鏈,記錄文件由哪幾個簇組成

根目錄區,只有FAT12/16系統所有,記錄了根目錄下的文件/目錄條目信息

數據區,記錄數據分為兩個部分,第一部分為目錄信息,除根目錄外,每個文件夾需要占據一個及以上的簇描述對應目錄下的文件情況;第二部分為具體文件數據。兩部分數據通過短文件名SFN字段進行關聯!

以上就是FAT文件系統的簡單概括,由于本文使用的是FAT16文件系統作為實例分析。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FlaSh
    +關注

    關注

    10

    文章

    1621

    瀏覽量

    147754
  • Linux
    +關注

    關注

    87

    文章

    11229

    瀏覽量

    208927
  • 計算機
    +關注

    關注

    19

    文章

    7421

    瀏覽量

    87716
  • FAT
    FAT
    +關注

    關注

    0

    文章

    38

    瀏覽量

    25878
  • 文件系統
    +關注

    關注

    0

    文章

    284

    瀏覽量

    19883

原文標題:5. 分區分析

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    FAT32文件系統淺析

    FAT32文件系統淺析: Windows95 OSR2 和Windows 98 開始支持FAT32文件系統,它是對早期DOS 的FAT16
    發表于 09-14 08:02 ?62次下載

    FAT32文件系統結構的技術參數分析

    FAT32文件系統結構的技術參數分析:詳細分析FAT32 的主引導記錄、FAT32引導記錄、
    發表于 09-26 10:31 ?57次下載

    基于FAT的機頂盒PVR文件系統的研究

    簡要介紹了機頂盒PVR功能,分析了機頂盒PVR功能對文件系統提出的要求,具體闡述了FAT文件系統的原理,在此基礎上重點討論了FAT
    發表于 12-29 16:58 ?18次下載

    磁盤結構與FAT文件系統

    磁盤結構與FAT文件系統FAT 文件系統的組織結構1. 軟盤數據的邏輯存儲軟盤無須低級格式化和分區操作,只需用FORMAT 命令做高級格式化即可。經過格式化操作
    發表于 04-14 10:40 ?1500次閱讀

    FAT32文件系統是什么意思

    FAT32文件系統是什么意思  (一)FAT32 文件系統將邏輯盤的空間劃分為三部分,依次是引導區(BOOT區)、文件
    發表于 04-15 15:53 ?2w次閱讀

    嵌入式FAT文件系統免費源碼下載

    文件系統 是由本人個人開發的,全部代碼在VC下編寫,測試。VC下測試基于虛擬磁盤驅動(在Flash_management.c)實現對磁盤的讀寫。實現的文件系統兼容 FAT16 /FAT
    發表于 08-04 14:41 ?72次下載
    嵌入式<b class='flag-5'>FAT</b><b class='flag-5'>文件系統</b>免費源碼下載

    fat32_fat32文件系統

    本內容講述了fat32_fat32文件系統的基礎內容,涉及FAT32定義,功能,fat32兼容性等及fat32轉ntfs知識
    發表于 05-21 16:41 ?5874次閱讀

    FAT文件系統基本原理和基礎知識

    介紹FAT文件系統的基本原理和基礎知識 有需要的可以參考下
    發表于 12-24 11:27 ?0次下載

    FAT文件系統的組織結構

    FAT文件系統的組織結構,很好的學習資料,快來下載吧
    發表于 02-16 16:35 ?2次下載

    fat文件系統原理

    fat文件系統原理,很好的學習資料,快來下載吧
    發表于 02-16 16:35 ?7次下載

    fat文件系統筆記

    私人累積的fat文件系統筆記
    發表于 03-13 15:05 ?4次下載

    FAT32文件系統說明

    FAT32文件系統。在一邏輯盤(硬盤的一分區)超過 512 兆字節時使用這種格式,會更高效地存儲數據,減少硬盤空間的浪費,一般還會使程序運行加快,使用的計算機系統資源更少,因此是使用大容量硬盤存儲
    發表于 03-16 11:27 ?16次下載

    FAT32文件系統規范和FAT磁盤格式概述

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

    FAT32文件系統基礎知識

    FAT32文件系統基礎知識免費下載。
    發表于 06-11 09:16 ?31次下載

    FAT32文件系統詳細分析 (格式化SD nand/SD卡)

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