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

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

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

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

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

文章目錄

FATFS文件系統(tǒng)詳解

1. 簡介

2. 基礎概念

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

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

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

4.2 引導扇區(qū)分析

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

4.4 FAT子類型確認

4.4 訪問FAT條目

4.5 文件與簇之間的關系

4.6 FSInfo扇區(qū)結構及備份引導扇區(qū)

4.7 FAT目錄

4.7.1 SFN 短文件名目錄

4.7.2 LFN長文件名

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

5. 分區(qū)分析

5.1 保留分區(qū)分析

5.2 FAT區(qū)分析

5.3 根目錄區(qū)分析

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

5.5 新增文件測試

6. 總結

1. 簡介

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

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

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

2. 基礎概念

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

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

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

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

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

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

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

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

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

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

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

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

4.2 引導扇區(qū)分析

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

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

image.php?url=YD_cnt_89_01PgcfdxqNCa

3.接下來我們根據(jù)官方文檔 對引導扇區(qū)進行分析

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

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

  • EB 3C 90:BS_JmpBoot,跳轉指令
  • 4D 53 44 4F 53 35 2E 30:BS_OEMName,MSDOS 5.0,一個名字,指示創(chuàng)建此卷的操作系統(tǒng),無其他作用
  • 00 02:BPB_BytsPerSec,扇區(qū)大小 512 字節(jié)
  • 04:BPB_SecPerClus,每次操作的最小扇區(qū)數(shù),簇 Cluster,4 (與格式化時選擇的大小匹配 2048 = 512 * 4)
  • 06 00:BPB_RsvdSecCnt,保留區(qū)的扇區(qū)數(shù),6 (通過此可計算,F(xiàn)AT區(qū)起始地址為 6 * 512 = 0xC00)
  • 02:BPB_NumFATs,F(xiàn)ATs的個數(shù),2(一般此值為2,多一個用來做冗余備份,解決系統(tǒng)異常導致第一個損壞時,增大恢復的可能性,表示FAT區(qū)有兩個FATs備份)
  • 00 02:BPB_RootEntCnt,512,在FAT12/16系統(tǒng)中,此字段表示根目錄中32字節(jié)目錄條目數(shù)量,設置此值時需注意對齊,為了最大的兼容性,F(xiàn)AT16系統(tǒng)上此值應設置為512,F(xiàn)AT32系統(tǒng)上此值應設置為0
  • 00 00:BPB_TotSec16,16位大小區(qū)域描述FAT卷扇區(qū)總數(shù),0。當FAT12/16系統(tǒng)扇區(qū)數(shù) ≥0x10000(65536)時,此字段應設置為0,真實值存放在 BPB_TotSec32 字段;對于FAT32系統(tǒng),此值必須為0。(此處由于我們的總扇區(qū)數(shù)=118.510241024/512 = 242688 > 65536,所以此字段為0)
  • F8:BPB_Media 媒體類型
  • ED 00:BPB_FATSz16,237,一個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,每個磁道的扇區(qū)數(shù),此字段僅與具有幾何形狀且僅用于 IBM PC 的磁盤 BIOS 的介質相關,不用管。
  • FF 00:BPB_NumHeads,頭數(shù)量,此字段僅與具有幾何形狀且僅用于 IBM PC 的磁盤 BIOS 的介質相關,不用管。
  • 00 00 00 00:BPB_HiddSec,0,F(xiàn)AT 卷之前的隱藏物理扇區(qū)數(shù)(當磁盤被分區(qū)之后,當前分區(qū)并不一定是從扇區(qū)頭開始的)
  • 00 B4 03 00:BPB_TotSec32,242688,32位大小區(qū)域描述FAT卷扇區(qū)總數(shù)(整個卷空間大?。?FAT12/16系統(tǒng),扇區(qū)總數(shù)小于0x10000時,此字段必須為0,真實值存放在BPB_FATSz16;FAT32系統(tǒng),此字段一直有效。(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文件系統(tǒng)類型,支持字段有:"FAT12 ", "FAT16 " or "FAT ",注意很多人認為是通過此字段區(qū)分FAT12/16/32系統(tǒng)類型,實際是錯誤的,文件系統(tǒng)類型實際上是根據(jù)磁盤大小確定的,官方文檔 “Determination of FAT sub-type” 章節(jié)或本博文后文有描述,不過為了最大的兼容性考慮,此字段應設置為對應文件系統(tǒng)的名字。
  • 33 C9 ~ CB D8:BS_BootCode,引導啟動程序,與平臺有關,不使用時填充為0
  • 55 AA:BS_BootSign,0xAA55,引導簽名,指示這是一個有效的引導扇區(qū)當扇區(qū)大小大于512字節(jié)時,剩余的字段應全部使用0x0填充。

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

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

  • BPB_FATSz32:一個FAT占用的扇區(qū)數(shù),此字段僅在FAT32系統(tǒng)有效。FAT區(qū)總大小等于 BPB_FATSz?? * BPB_NumFATs 扇區(qū)。
  • BPB_ExtFlags:擴展標識字段,bit7=0,表示所有FAT都是鏡像的和活躍的;bit7=1,表示只有bit3-0表示的FAT是有效的。
  • BPB_FSVer:FAT32版本,高字節(jié)是主版本號,低字節(jié)是次版本號。
  • BPB_RootClus:根目錄的第一個簇號,此值通常為2,因為前兩個簇一般用于保留。
  • BPB_FSInfo:FSInfo結構扇區(qū)與FAT32卷頂部的偏移扇區(qū)值。此值通常為1,因為其通常位于引導扇區(qū)旁邊。
  • BPB_BkBootSec:備份引導扇區(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 ",對FAT類型的確定沒有任何影響。
  • BS_BootCode32:引導啟動程序,與平臺有關,不使用時填充為0
  • BS_BootSign:0xAA55,引導簽名,指示這是一個有效的引導扇區(qū)當扇區(qū)大小大于512字節(jié)時,剩余的字段應全部使用0x0填充。

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

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

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

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

  • 保留區(qū)

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

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

  • FAT區(qū)(分區(qū)表裝載區(qū))
  • 根目錄區(qū)
  • 數(shù)據(jù)區(qū)

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

image.php?url=YD_cnt_89_01PgcfdGEMB3

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

image.php?url=YD_cnt_89_01PgcfcJ4Pw1

4.4 FAT子類型確認

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

  • 當一個卷,簇的數(shù)量 ≤4085 時,為FAT12
  • 當一個卷,簇的數(shù)量 ≥4086 且 ≤65525 時,為FAT16
  • 當一個卷,簇的數(shù)量 ≥65526 時,為FAT32

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

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

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

image.php?url=YD_cnt_89_01PgcfbO1sP0

4.4 訪問FAT條目

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

  • FAT16:
  • FAT32:

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

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

具體如下圖所示:

image.php?url=YD_cnt_89_01PgcfaCcafI

4.5 文件與簇之間的關系

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

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

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

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

FirstSectorofCluster = DataStartSector + (N - 2) * BPB_SecPerClus

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

  • FAT12: 0xFF8 - 0xFFF (typically 0xFFF)
  • FAT16: 0xFFF8 - 0xFFFF (typically 0xFFFF)
  • FAT32: 0x0FFFFFF8 - 0x0FFFFFFF (typically 0x0FFFFFFF)

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

  • FAT12: 0xFF7
  • FAT16:0xFFF7
  • FAT32:0xFFFFFFF7

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

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

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

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

  • 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),系統(tǒng)在啟動的時候清除此位,正常關閉的時候恢復。

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

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

  • 第一個是FAT的最后一個扇區(qū)可能沒有被完全使用。在大多數(shù)情況下,F(xiàn)AT在扇區(qū)的中間結束。FAT驅動程序不應該對未使用的區(qū)域做出任何假設。在格式化卷時,應該用零填充它,并且在此之后不應更改它。
  • 另一個是BPB_FATSz16/32可以指示比卷需要的值大的值。換句話說,未使用的扇區(qū)可以跟隨每個FAT。這可能是數(shù)據(jù)區(qū)域對齊或其他原因導致的。同時,在格式化時這些扇區(qū)也會被用零填充。

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

image.php?url=YD_cnt_89_01PgcfYvftka

4.6 FSInfo扇區(qū)結構及備份引導扇區(qū)

此部分內(nèi)容只在FAT32系統(tǒng)上存在,對于FAT12系統(tǒng)FAT區(qū)域大小最大6KB,對于FAT16系統(tǒng)FAT區(qū)域最大128KB,但是在FAT32系統(tǒng)上FAT區(qū)域通常上達數(shù)MB,這是因為FAT32系統(tǒng)支持FSInfo數(shù)據(jù)結構。

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

FSInfo數(shù)據(jù)結構如下:

image.php?url=YD_cnt_89_01PgcfYfv1SK

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

4.7 FAT目錄

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

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

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

  • 在FAT12/16系統(tǒng)中,根目錄不是一個文件,且放在根目錄區(qū),根目錄的最大條目數(shù)由 BPB_RootEntCnt 參數(shù)指示;
  • 在FAT32系統(tǒng)中,根目錄與子目錄沒有什么區(qū)別,且根目錄的起始簇由 BPB_RootClus 參數(shù)指示。
  • 根目錄與子目錄的另外一個區(qū)別是,根目錄不包含 . .. 此兩個點目錄,且它可以包含卷標(具有ATTR_VOLUME_ID屬性的條目)

4.7.1 SFN 短文件名目錄

目錄條目結構如下:

image.php?url=YD_cnt_89_01PgcfYOMLTJ

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

  • 當此值為 0xE5 時,代表此目錄條目未被使用(或已廢棄)
  • 當此值為 0x00 時,也代表此目錄條目未被使用;此外還提示后續(xù)目錄條目也未被使用,因為后續(xù)的目錄條目 DIR_Name[0] 都會是 0x00
  • 如果文件名的第一個字符為 0xE5 這個特殊值,則使用 0x05 替代。

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

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

  • DIR_Name 字段的11字節(jié)的文件名分為兩個部分:8 字節(jié)的主文件名 + 3字節(jié)的擴展名;
  • 文件名中主文件名與擴展名中間的 . 被省略,不在此記錄
  • 如果主文件名長度不夠,小于8字節(jié),則使用 0x20 空格填充
  • 用于設置文件名的字符也有限制,支持的字符有 0~9 A~Z ! # $ % & ’ - @ ^ _ ` { } ~
  • 主文件名和擴展名中的(a~z)ASCII字符都會被轉化成大寫字符保存

以下為文件名存儲示例:

image.php?url=YD_cnt_89_01PgcfXRCN2y

4.7.2 LFN長文件名

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

長文件名是一個具有特殊屬性的目錄條目。長文件名目錄屬性 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字段中僅包含文件名信息,不包含其他內(nèi)容,其他內(nèi)容需要通過短文件名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系統(tǒng)對于SFN的兼容

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

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

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

示例如下:

image.php?url=YD_cnt_89_01PgcfU9eSiQ

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

5. 分區(qū)分析

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

image.php?url=YD_cnt_89_01PgcfUWfqrn

5.1 保留分區(qū)分析

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

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

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

image.php?url=YD_cnt_89_01PgcfU7EfL4

5.2 FAT區(qū)分析

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

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

image.php?url=YD_cnt_89_01PgcfRXJhdS

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

image.php?url=YD_cnt_89_01PgcfRuw8aa

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

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

  1. 確認 FAT2 為 FAT1 的備份;
  2. 存在5個FAT條目其中 FAT[0] 和 FAT[1] 為保留條目,F(xiàn)AT[0] 的內(nèi)容與 BPB_Media 媒體類型字段一致,F(xiàn)AT[1] 用來記錄錯誤歷史記錄 (詳見 4.5 章節(jié)描述)
  3. 根據(jù)4.5章節(jié)描述,F(xiàn)AT[2](2號簇)對應數(shù)據(jù)區(qū)的第一個簇,又FAT[2]、FAT[3]、FAT[4] 數(shù)據(jù)均為 0xFF,表明存在三個文件,且每個文件的大小小于等于一個簇的空間;且分別存放在數(shù)據(jù)區(qū)第1到第3個簇上!

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

5.3 根目錄區(qū)分析

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

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

image.php?url=YD_cnt_89_01PgcfTRvyt1

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

image.php?url=YD_cnt_89_01PgcfPwyVkX

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

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

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

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

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

image.php?url=YD_cnt_89_01PgcfSOQ4tq

對應數(shù)據(jù)字段分析如下:

image.php?url=YD_cnt_89_01PgcfON3MTS

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

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

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

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的數(shù)據(jù),對應地址計算方式為:

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更新磁盤數(shù)據(jù),觀察各數(shù)據(jù)區(qū)變化
  • 保留區(qū)無變化
  • FAT區(qū)變化如下:
image.php?url=YD_cnt_89_01PgcfL03wCJimage.php?url=YD_cnt_89_01PgcfK51OY9
  • 根目錄區(qū)變化如下:
image.php?url=YD_cnt_89_01PgcfMt5Ce7
  • 數(shù)據(jù)區(qū)變化:
image.php?url=YD_cnt_89_01PgcfJ6dS23

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

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

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

數(shù)據(jù)區(qū)變化如下:
long file test 目錄數(shù)據(jù)指向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的實際有效數(shù)據(jù),如下:

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

6. 總結

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

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

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

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

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

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

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

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

    關注

    452

    文章

    50014

    瀏覽量

    419737
  • 存儲
    +關注

    關注

    13

    文章

    4180

    瀏覽量

    85492
  • SD卡
    +關注

    關注

    2

    文章

    554

    瀏覽量

    63681
  • TF卡
    +關注

    關注

    2

    文章

    69

    瀏覽量

    12106
  • flash內(nèi)存

    關注

    0

    文章

    5

    瀏覽量

    2117
收藏 人收藏

    評論

    相關推薦

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

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

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

    SD 是基于閃存技術的一種可移動存儲卡,由 SD 協(xié)會進行開發(fā)并標準化,在數(shù)碼相機、智能手機、平板電腦
    的頭像 發(fā)表于 06-05 15:54 ?1243次閱讀
    <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的區(qū)別

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

    SD NAND 簡介

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

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

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

    STM32F412使用SD,SDIO,FATFS系統(tǒng),SD掛載文件系統(tǒng)失敗的原因?

    求助,STM32F412RET6 使用SD,使用SDIO接口,FATFS系統(tǒng),SD掛載
    發(fā)表于 04-11 07:15

    CS 創(chuàng)世SD NAND FLASH 存儲芯片,比TF更小巧輕便易用的大容量存儲,TF替代方案

    SD、嵌入式SD。它的主要優(yōu)勢在于解決了主控器(例如STM32系列的MCU單片機)使用NAND
    發(fā)表于 01-24 18:30

    stm32 CubeMx 怎么實現(xiàn)SD/sd nand FATFS讀寫測試

    。)   CSNP1GCR01-AOW的優(yōu)勢:   不用寫驅動程序自帶壞塊管理的NAND Flash(貼片式TF),尺寸小巧,簡單易用,兼容性強,穩(wěn)定可靠,固件可定制,LGA-8封裝,標準SDIO接口,兼容
    發(fā)表于 01-09 17:37

    什么是SD NAND存儲芯片? SD NAND與TF的區(qū)別

    什么是SD NAND?它俗稱貼片式T,貼片式TF,貼片式SD,貼片式內(nèi)存
    的頭像 發(fā)表于 01-06 14:35 ?1534次閱讀
    什么是<b class='flag-5'>SD</b> <b class='flag-5'>NAND</b><b class='flag-5'>存儲</b>芯片? <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>與TF<b class='flag-5'>卡</b>的區(qū)別

    什么是SD NAND存儲芯片?

    閃存其他存儲設備更快。在使用SDIO接口時,SD NAND的速度更高。其讀取時延較低,比 SD
    發(fā)表于 01-05 17:54

    基于RT-Thread快速上手SD NAND 虛擬文件系統(tǒng)

    默認開啟FatFS.   支持多種類型的存儲設備,如 SD Card、SPI Flash、
    發(fā)表于 12-15 17:29

    ESP32應用教程— SD NAND(記錄飛控LOG)

    。   關于 MCU 的存儲方面,以前基本上用內(nèi)置的 E2PROM,或者是外置的 NOR Flash 就可以。隨著物聯(lián)網(wǎng)的興起,MCU 的應用越來越廣泛,逐漸的 MCU 會涉及到大容量
    發(fā)表于 11-30 18:16

    CS創(chuàng)世SD NAND存儲芯片應用方案

    NAND FLASH,嵌入式sd,工業(yè)級sd,單片機 n
    的頭像 發(fā)表于 11-15 18:09 ?509次閱讀
    CS創(chuàng)世<b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>的<b class='flag-5'>存儲</b>芯片應用方案

    DSP+FPGA+FATFS+SD

    項目背景,在DSP上掛Fatfs文件系統(tǒng),而SD是掛在FPGA上的,DSP需要通過FPGA與SD
    發(fā)表于 11-14 09:30

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

    析: 3.3.1 FAT1 3.3.2 FAT2 3.4 數(shù)據(jù)區(qū)分析: 總結 1. 前言 續(xù)上一篇文章 : FATFS文件系統(tǒng)詳解:關于SD
    發(fā)表于 11-03 17:55