女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

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

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

文章目錄

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

1. 簡介

2. 基礎(chǔ)概念

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 文件與簇之間的關(guān)系

4.6 FSInfo扇區(qū)結(jié)構(gòu)及備份引導扇區(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. 總結(jié)

1. 簡介

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

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

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

2. 基礎(chǔ)概念

在研究文件系統(tǒng)之前,我們需要首先弄清楚關(guān)于內(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三個版本,這是由于隨著存儲技術(shù)不斷發(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加一塊轉(zhuǎn)接板,和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 工具打開對應磁盤,注意需使用管理員權(quán)限運行
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,跳轉(zhuǎn)指令
  • 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ù)量,設(shè)置此值時需注意對齊,為了最大的兼容性,F(xiàn)AT16系統(tǒng)上此值應設(shè)置為512,F(xiàn)AT32系統(tǒng)上此值應設(shè)置為0
  • 00 00:BPB_TotSec16,16位大小區(qū)域描述FAT卷扇區(qū)總數(shù),0。當FAT12/16系統(tǒng)扇區(qū)數(shù) ≥0x10000(65536)時,此字段應設(shè)置為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 的介質(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ù)(當磁盤被分區(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 使用的驅(qū)動器號,00h代表軟盤,80h代表固定磁盤
  • 00:BS_Reserved,保留字段,0
  • 29:BS_BootSig,擴展引導簽名,表示以下存在三個字段
  • 83 3E 07 E4:BS_VolID,與 BS_VolLab 一起構(gòu)成卷序列號,一般在格式化的時候結(jié)合時間生成
  • 4E 4F 20 4E 41 4D 45 20 20 20 20:(解析為:"NO NAME “),BS_VolLab,11byte卷標,當卷標不存在時,此值應設(shè)置為"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é)或本博文后文有描述,不過為了最大的兼容性考慮,此字段應設(shè)置為對應文件系統(tǒng)的名字。
  • 33 C9 ~ CB D8:BS_BootCode,引導啟動程序,與平臺有關(guān),不使用時填充為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結(jié)構(gòu)扇區(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:引導啟動程序,與平臺有關(guān),不使用時填充為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

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

image.php?url=YD_cnt_89_01PgcfcJ4Pw1

4.4 FAT子類型確認

關(guān)于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條目構(gòu)成,關(guān)于 FAT[N] 對應的條目具體位置計算如下:

  • FAT16:
  • FAT32:

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

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

具體如下圖所示:

image.php?url=YD_cnt_89_01PgcfaCcafI

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

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

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

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

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

FirstSectorofCluster = DataStartSector + (N - 2) * BPB_SecPerClus

每個條目所在的位置,對應一個簇。當文件長度大于一個簇長度時,條目內(nèi)的值為下一個條目的索引,直到文件所在的最后一個簇,由此構(gòu)成簇鏈!文件所在的最有一個簇所對應的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結(jié)構(gòu)體,里面記錄了空閑簇的數(shù)量。

關(guān)于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)在啟動的時候清除此位,正常關(guān)閉的時候恢復。

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

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

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

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

image.php?url=YD_cnt_89_01PgcfYvftka

4.6 FSInfo扇區(qū)結(jié)構(gòu)及備份引導扇區(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ù)結(jié)構(gòu)。

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

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

image.php?url=YD_cnt_89_01PgcfYfv1SK

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

4.7 FAT目錄

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

此外,有一個很重要的概念:在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 短文件名目錄

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

image.php?url=YD_cnt_89_01PgcfYOMLTJ

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

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

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

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

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

以下為文件名存儲示例:

image.php?url=YD_cnt_89_01PgcfXRCN2y

4.7.2 LFN長文件名

長文件名是文件名的另外一種存儲方式,由于SFN短文件名具有長度、字符等限制,在一些場景下不能很好的滿足需求,因此就需要使用到長文件名,關(guān)于長文件名的具體內(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

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

image.php?url=YD_cnt_89_01PgcfVe94pc

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

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

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

image.php?url=YD_cnt_89_01PgcfVyjcJC

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

有損轉(zhuǎn)轉(zhuǎn)換標識為:~,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é)計算結(jié)果可知,保留分區(qū)起始地址為 0x00,大小 0xC00

保留分區(qū)數(shù)據(jù)如下,保留分區(qū)內(nèi)最重要的內(nèi)容即為引導扇區(qū),除引導扇區(qū)外,其他剩余空間全部保留,采用0x00覆蓋。關(guān)于引導扇區(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號簇);

首先,我們跳轉(zhuǎn)到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

接著跳轉(zhuǎn)到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號簇,跳轉(zhuǎn)至6號簇,地址 DataStartSector + (N - 2) * BPB_SecPerClus = 0x40000 + (6-2) * 4 * 512 = 0x420000

image.php?url=YD_cnt_89_01PgcfGDvwqX

test.txt 文件指向 7號簇,跳轉(zhuǎn)至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. 總結(jié)

以上便是關(guān)于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塊大小、簇大小等關(guān)鍵信息;

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

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

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

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

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

    關(guān)注

    459

    文章

    52172

    瀏覽量

    436130
  • 存儲
    +關(guān)注

    關(guān)注

    13

    文章

    4502

    瀏覽量

    87065
  • SD卡
    +關(guān)注

    關(guān)注

    2

    文章

    575

    瀏覽量

    65134
  • TF卡
    +關(guān)注

    關(guān)注

    2

    文章

    86

    瀏覽量

    12532
  • flash內(nèi)存
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    2237
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    NAND FlashSD NAND存儲扇區(qū)架構(gòu)差異

    NAND Flash?和?SDSD NAND)的存儲
    的頭像 發(fā)表于 03-13 15:20 ?998次閱讀
    <b class='flag-5'>NAND</b> <b class='flag-5'>Flash</b>與<b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>的<b class='flag-5'>存儲</b>扇區(qū)架構(gòu)差異

    Nand flashSDSD NAND存儲扇區(qū)分配表異同

    SD NAND)是基于 NAND Flash存儲設(shè)備,其
    發(fā)表于 03-13 10:45

    CS創(chuàng)世SD NAND【貼片式sd】的測試使用說明

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

    SD NAND、SPI NAND 和 Raw NAND 的定義與比較

    問題,再也不用為SD的接觸穩(wěn)定性操心! SD nandSD
    的頭像 發(fā)表于 01-15 18:16 ?682次閱讀
    <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 NAND、SPI NAND 和 Raw NAND 的定義與比較

    問題,再也不用為SD的接觸穩(wěn)定性操心!   SD nandSD 、
    發(fā)表于 01-15 18:15

    關(guān)于SD NAND 的概述

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

    SD NAND 概述

    SD NAND是一種小型、可表面貼裝的存儲解決方案,適用于各種嵌入式系統(tǒng)和便攜式設(shè)備。SD
    的頭像 發(fā)表于 12-06 11:21 ?609次閱讀

    SD NAND技術(shù)簡介

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

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

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

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

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

    物聯(lián)網(wǎng)行業(yè)存儲方案詳解_SPI NOR Flash

    SPI NOR FLASH存儲器在初始響應和啟動時提供高可靠性,并具有低時延。這一特性對于物聯(lián)網(wǎng)設(shè)備至關(guān)重要,因為物聯(lián)網(wǎng)
    的頭像 發(fā)表于 09-24 14:39 ?955次閱讀
    物聯(lián)網(wǎng)行業(yè)<b class='flag-5'>存儲</b>方案<b class='flag-5'>詳解</b>_<b class='flag-5'>SPI</b> <b class='flag-5'>NOR</b> <b class='flag-5'>Flash</b>

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

    SDNAND,通常稱為嵌入式SD、貼片式TF、SD Flash、直接貼裝SD
    的頭像 發(fā)表于 07-05 17:03 ?1446次閱讀
    貼片式<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文件系統(tǒng):技術(shù)解析與應用指南

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

    貼片式tf Nand flash芯片試用體驗

    ,很自然地,基于NAND存儲器就可以取代硬盤或其他塊設(shè)備。NOR的特點是芯片內(nèi)執(zhí)行(XIP, eXecute In Place),這樣應用程序可以直接在
    發(fā)表于 06-05 17:57

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

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