色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

FATFS文件系統詳解:關于SD卡、SD nand、spi nor flash等眾多存儲設備

深圳市雷龍發展有限公司 ? 2023-09-07 17:58 ? 次閱讀

文章目錄

FATFS文件系統詳解

1. 簡介

2. 基礎概念

3. FAT文件系統組成介紹

4. FAT文件系統分析

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

4.2 引導扇區分析

4.3 分區偏移及大小計算

4.4 FAT子類型確認

4.4 訪問FAT條目

4.5 文件與簇之間的關系

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

4.7 FAT目錄

4.7.1 SFN 短文件名目錄

4.7.2 LFN長文件名

4.7.3 LFN系統對于SFN的兼容

5. 分區分析

5.1 保留分區分析

5.2 FAT區分析

5.3 根目錄區分析

5.4 數據區分析

5.5 新增文件測試

6. 總結

1. 簡介

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

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

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

2. 基礎概念

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

  1. 2.1.區分 扇區、塊、簇的概念
  • 扇區(sector):flash可操作的最小單元,通常指我們擦除的最小單元大小,以sd nand舉例,通常最小為512Byte
  • 塊(block) 以及 簇(cluster):其實這是兩個相同的概念,只是由于歷史原因,在不同系統上的不同稱呼,在windows中稱簇,而在linux中稱塊。一個簇/塊由多個扇區組成,由于一個扇區的空間較小,因此文件系統通過會將多個扇區組合在一起形成一個簇,并以簇為單位進行讀寫操作! 一個簇通常可以由 2、4、8、… 、2的n次方個扇區組成。
  1. 2.2.FAT文件系統總共由FAT12、FAT16以及FAT32三個版本,這是由于隨著存儲技術不斷發展,FAT文件系統迭代導致,數字越大,版本越新,新版本對老版本完全兼容!

3. FAT文件系統組成介紹

Fat文件系統官方文檔:

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

  • 保留區
  • FAT區
  • 根目錄區 (FAT32類型不包含此區域)
  • 數據區
image.php?url=YD_cnt_89_01PgcfBlDVgHimage.php?url=YD_cnt_89_01PgcfgHPOh2

接下來,我們對一張格式化為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卡具有優勢。

image.php?url=YD_cnt_89_01PgcfjVuYF4image.php?url=YD_cnt_89_01PgcfdrBppm

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

4.2 引導扇區分析

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

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

image.php?url=YD_cnt_89_01PgcfdxqNCa

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區(分區表裝載區)
  • 根目錄區
  • 數據區

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

image.php?url=YD_cnt_89_01PgcfdGEMB3

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

image.php?url=YD_cnt_89_01PgcfcJ4Pw1

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對應卷的大小范圍如下:

image.php?url=YD_cnt_89_01PgcfbO1sP0

4.4 訪問FAT條目

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

  • FAT16:
  • FAT32:

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

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

具體如下圖所示:

image.php?url=YD_cnt_89_01PgcfaCcafI

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值所對應的含義解釋:

image.php?url=YD_cnt_89_01PgcfYvftka

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數據結構如下:

image.php?url=YD_cnt_89_01PgcfYfv1SK

注意:當扇區大小大于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 短文件名目錄

目錄條目結構如下:

image.php?url=YD_cnt_89_01PgcfYOMLTJ

關于目錄結構的第一個字段 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字符都會被轉化成大寫字符保存

以下為文件名存儲示例:

image.php?url=YD_cnt_89_01PgcfXRCN2y

4.7.2 LFN長文件名

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

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

image.php?url=YD_cnt_89_01PgcfXgLGjm

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

image.php?url=YD_cnt_89_01PgcfVe94pc

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

  • 一個文件一定有短文名SFN,但不一定有長文件名LFN
  • 長文件名LFN字段中僅包含文件名信息,不包含其他內容,其他內容需要通過短文件名SFN查看
  • 如果一個文件既有長文件名也有短文件名,則長文件名是其主要名字,而短文件名則為附加名字
  • 長文件名LFN條目在對應的短文件名SFN條目前面
  • 一個文件的長文件名最長255字符,對應最多20個長文件名LFN條目
  • 長文件名簡單理解起始就是存儲一個字符串,因此沒有類似SFN的限制,允許有空格、支持大小寫、允許多個.符號等
  • LFN條目文件名長度不夠,仍然采用0x20填充

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

image.php?url=YD_cnt_89_01PgcfVyjcJC

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

  1. uint8_t create_sum (const DIR* entry)
  2. {
  3. int i;
  4. uint8_t sum;
  5. for (i = sum = 0; i < 11; i++) { /* Calculate sum of DIR_Name field */
  6. sum = (sum >> 1) + (sum << 7) + entry->DIR_Name[i];
  7. }
  8. return sum;
  9. }

4.7.3 LFN系統對于SFN的兼容

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

  1. 小寫自動轉大寫
  2. 如果存在空格,則刪去空格,設置有損轉換標識
  3. 已.開頭的文件刪除頭部的.,并設置有損轉換標識
  4. 存在多個.的文件名,僅保留最后一個作為文件名與擴展的分隔,并設置有損轉換標識
  5. 其他不支持的字符,采用_代替,并設置有損轉換標識
  6. 文件名如果是Unicode編碼,則轉化為ANSI/OEM編碼;不能轉換的字符采用_代替,并設置有損轉換標識
  7. 長度超過8字節的部分,截斷,并設置有損轉換標識
  8. 擴展名字段超過3字節的,截斷,并設置有損轉換標識

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

示例如下:

image.php?url=YD_cnt_89_01PgcfU9eSiQ

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

5. 分區分析

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

image.php?url=YD_cnt_89_01PgcfUWfqrn

5.1 保留分區分析

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

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

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

image.php?url=YD_cnt_89_01PgcfU7EfL4

5.2 FAT區分析

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

FAT1 數據:

image.php?url=YD_cnt_89_01PgcfRXJhdS

FAT2 數據如下:

image.php?url=YD_cnt_89_01PgcfRuw8aa

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

根據上述數據進行分析:

  1. 確認 FAT2 為 FAT1 的備份;
  2. 存在5個FAT條目其中 FAT[0] 和 FAT[1] 為保留條目,FAT[0] 的內容與 BPB_Media 媒體類型字段一致,FAT[1] 用來記錄錯誤歷史記錄 (詳見 4.5 章節描述)
  3. 根據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,數據內容如下:

image.php?url=YD_cnt_89_01PgcfTRvyt1

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

image.php?url=YD_cnt_89_01PgcfPwyVkX

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

  • 此文件夾為目錄屬性,是隱藏的系統目錄
  • 長文件名為System Volume Information,短文件名為SYSTEM~1
  • 此目錄指向存放的數據在2號簇(對應數據區第一個簇),文件大小字段,由于此文件為目錄屬性,此字段無意義,因此強制為0

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

5.4 數據區分析

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

image.php?url=YD_cnt_89_01PgcfSOQ4tq

對應數據字段分析如下:

image.php?url=YD_cnt_89_01PgcfON3MTS

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

image.php?url=YD_cnt_89_01PgcfON3LNJ

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

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

= 516;

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

image.php?url=YD_cnt_89_01PgcfM6J6Yc

5.5 新增文件測試

  1. 1.在根目錄下新增 test 目錄,使用winhex更新磁盤數據,觀察各數據區變化
  • 保留區無變化
  • FAT區變化如下:
image.php?url=YD_cnt_89_01PgcfL03wCJimage.php?url=YD_cnt_89_01PgcfK51OY9
  • 根目錄區變化如下:
image.php?url=YD_cnt_89_01PgcfMt5Ce7
  • 數據區變化:
image.php?url=YD_cnt_89_01PgcfJ6dS23

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

image.php?url=YD_cnt_89_01PgcfIBb0yl
  • 保留區無變化
  • FAT區變化如下:
image.php?url=YD_cnt_89_01PgcfHkFIM3image.php?url=YD_cnt_89_01PgcfF806fp

根目錄區變化如下:

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

image.php?url=YD_cnt_89_01PgcfGDvwqX

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

image.php?url=YD_cnt_89_01PgcfFR5F3qimage.php?url=YD_cnt_89_01PgcfEMLRTe

6. 總結

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

FAT文件系統分為四個區:

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

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

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

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

以上就是FAT文件系統的簡單概括,由于本文使用的是FAT16文件系統作為實例分析,關于FAT32文件系統,在下一篇博文中進行補充,敬請關注!

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

    關注

    459

    文章

    51568

    瀏覽量

    429783
  • 存儲
    +關注

    關注

    13

    文章

    4404

    瀏覽量

    86444
  • SD卡
    +關注

    關注

    2

    文章

    568

    瀏覽量

    64360
  • TF卡
    +關注

    關注

    2

    文章

    81

    瀏覽量

    12337
  • flash內存
    +關注

    關注

    0

    文章

    5

    瀏覽量

    2172
收藏 人收藏

    評論

    相關推薦

    CS創世SD NAND【貼片式sd】的測試使用說明

    今天收到了來自深圳市雷龍發展有限公司寄來的存儲卡,它是一款自帶壞塊管理的貼片式NAND Flash,適用于嵌入式系統SD
    的頭像 發表于 02-17 15:45 ?122次閱讀
    CS創世<b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>【貼片式<b class='flag-5'>sd</b><b class='flag-5'>卡</b>】的測試使用說明

    SD NANDSPI NAND 和 Raw NAND 的定義與比較

    問題,再也不用為SD的接觸穩定性操心! SD nandSD
    的頭像 發表于 01-15 18:16 ?360次閱讀
    <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>、<b class='flag-5'>SPI</b> <b class='flag-5'>NAND</b> 和 Raw <b class='flag-5'>NAND</b> 的定義與比較

    SD NANDSPI NAND 和 Raw NAND 的定義與比較

    問題,再也不用為SD的接觸穩定性操心!   SD nandSD
    發表于 01-15 18:15

    關于SD NAND 的概述

    SD NAND是一種小型、可表面貼裝的存儲解決方案,適用于各種嵌入式系統和便攜式設備SD
    發表于 12-06 11:22

    SD NAND技術簡介

    SD NAND是一種基于NAND Flash技術的嵌入式存儲解決方案,具備SD
    的頭像 發表于 12-05 15:32 ?334次閱讀
    <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>技術簡介

    一文帶你了解什么是SD NAND存儲芯片

    的簡單介紹:   什么是SD NAND?很簡單顧名思義就是內部集成了SD或TF(這里有必要說明SD
    發表于 11-13 15:20

    瀚海微SD NANDSD 協議(36)SPI模式

    簡介 SPI模式由基于flashSD存儲卡提供的輔助通信協議組成。 這種模式是SD存儲卡協議的
    的頭像 發表于 10-08 10:13 ?439次閱讀
    瀚海微<b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>之<b class='flag-5'>SD</b> 協議(36)<b class='flag-5'>SPI</b>模式

    貼片式SD功能介紹【MK SD NAND

    SDNAND,通常稱為嵌入式SD、貼片式TFSD Flash、直接貼裝SD
    的頭像 發表于 07-05 17:03 ?1046次閱讀
    貼片式<b class='flag-5'>SD</b><b class='flag-5'>卡</b>功能介紹【MK <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>】

    SD NAND文件系統:技術解析與應用指南

    MK米客方德的SD NAND是一種使用NAND閃存技術的貼片式TF,因起耐用性和較小的體積而受到廣泛歡迎。SD
    的頭像 發表于 06-07 14:45 ?541次閱讀
    <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>與<b class='flag-5'>文件系統</b>:技術解析與應用指南

    SDFlash存儲究竟存在哪些差異?

    SD 是基于閃存技術的一種可移動存儲卡,由 SD 協會進行開發并標準化,在數碼相機、智能手機、平板電腦
    的頭像 發表于 06-05 15:54 ?2160次閱讀
    <b class='flag-5'>SD</b><b class='flag-5'>卡</b>與<b class='flag-5'>Flash</b><b class='flag-5'>存儲</b>究竟存在哪些差異?

    SD NANDSPI NAND的區別

    SD NANDSPI NAND各有優缺點,適用于不同的應用場景。SD NAND提供更高的讀寫速
    的頭像 發表于 06-04 14:26 ?2342次閱讀

    SD NAND 簡介

    SD NAND是一種創新的存儲芯片,可直接貼片,又名貼片式TF、貼片式T、貼片式SD
    的頭像 發表于 05-29 16:34 ?1416次閱讀
    <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b> 簡介

    NAND Flash(貼片式TF存儲新突破,基礎示例

    with FatFs \\\\r\\\\nSTM32的FATFS文件系統測試\\\\r\\\\n \"; // 在外部 SD 掛載
    發表于 05-21 17:13

    STM32F412使用SD,SDIO,FATFS系統SD掛載文件系統失敗的原因?

    求助,STM32F412RET6 使用SD,使用SDIO接口,FATFS系統SD掛載
    發表于 04-11 07:15

    Flash存儲芯片:NOR FlashNAND Flash、UFS和eMMC的比較與解析

      NAND Flash是閃存的一種,廣泛應用于數據存儲領域。它通常被用于存儲用戶數據、應用程序和操作系統
    發表于 04-03 12:05
    主站蜘蛛池模板: 国产精品xxxav免费视频 | 国产激情一级毛片久久久 | 国产色青青视频在线观看 | 亚洲成人综合在线 | 精品国内自产拍在线观看视频 | 亚洲日本激情 | 老年日本老年daddy | 亚洲欧洲日韩国产一区二区三区 | 国产激情视频在线观看 | 啊…嗯啊好深男男小黄文 | 开心久久激情 | 亚洲AV香蕉一区区二区三区蜜桃 | 日日AV夜夜添久久奶无码 | 国产亚洲精品久久久久久久 | 在线播放av欧美无码碰 | 久久综合亚洲色hezyo | 国产在线观看不卡 | 1024人成网站色www下载 | 受被三个攻各种道具PLAY | 日本湿姝在线观看 | 91se在线看片国产免费观看 | 干性感美女 | 亚洲一区国产 | 亚洲精品www久久久久久久软件 | 日本粉嫩学生毛绒绒 | 国产成人综合高清在线观看 | 在线观看免费小视频 | 亚洲日本国产综合高清 | 果冻传媒视频在线播放 | 在线亚洲视频无码天堂 | 美女拔萝卜| 亚洲AV香蕉一区区二区三区蜜桃 | a色毛片免费视频 | 亚洲精品成人久久久影院 | 成人欧美尽粗二区三区AV | 国产亚洲欧美在线中文BT天堂网 | 囯产愉拍亚洲精品一区 | 孕妇bbwbbwbbwbbw超清 | 亚洲野狼综合网站 | 国内免费视频成人精品 | 暖暖免费 高清 日本社区中文 |