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

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

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

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

冬至子 ? 來(lái)源:jaffer ? 作者:jaffer ? 2023-06-07 14:36 ? 次閱讀

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)題,一群大佬們便開始設(shè)計(jì)文件系統(tǒng)這樣一個(gè)東西,用來(lái)管理硬盤/flash上的數(shù)據(jù)信息,像我們電腦上打開文件夾,訪問(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è)基本概念:

區(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ū)組成。

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)在flash上的布局如下圖所示,總共由四個(gè)區(qū)域組成:

保留區(qū)

FAT區(qū)

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

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

1.jpg接下來(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卡

使用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ì)。

1.jpg

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

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

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

1.jpg

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

1.jpg

接下來(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ū)(2372*512=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ū)頭開始的)

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ū)

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

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

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

根目錄區(qū)

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

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

1.jpg

2.jpg

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

1.jpg

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

1.jpg

聲明:本文內(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)投訴
  • 驅(qū)動(dòng)器
    +關(guān)注

    關(guān)注

    51

    文章

    7998

    瀏覽量

    145009
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1598

    瀏覽量

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

    關(guān)注

    2

    文章

    552

    瀏覽量

    63515
  • BIOS
    +關(guān)注

    關(guān)注

    5

    文章

    463

    瀏覽量

    45392
  • FAT32
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

    13703
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FATFS文件系統(tǒng)移植

    FatFs 是用于小型嵌入式系統(tǒng)的通用 FAT/exFAT 文件系統(tǒng)模塊。FatFs 模塊是按照 ANSI C (C89) 編寫的,與磁盤 I/O 層完全分離。因此它獨(dú)立于平臺(tái)。它可以
    的頭像 發(fā)表于 06-06 09:28 ?4281次閱讀
    <b class='flag-5'>FATFS</b><b class='flag-5'>文件系統(tǒng)</b>移植

    STM32CubeMx入門教程(10):Fatfs文件系統(tǒng)的應(yīng)用

    導(dǎo)語(yǔ)"fatfs個(gè)小型的文件系統(tǒng),在小型的嵌入式系統(tǒng)中使用非常的廣泛,STM32CubeMx自帶該文件系統(tǒng),我們通過(guò)簡(jiǎn)單的配置就能夠使用
    發(fā)表于 07-12 11:39 ?4315次閱讀
    STM32CubeMx入門教程(10):<b class='flag-5'>Fatfs</b><b class='flag-5'>文件系統(tǒng)</b>的應(yīng)用

    FATFS文件系統(tǒng)移植

    這是本人,整理的FATFS文件系統(tǒng)移植資料,很少的部分,希望大家把自己搜到的比較好的資料,分享下,本人正在學(xué)習(xí)fatfs
    發(fā)表于 09-11 16:05

    FatFs文件系統(tǒng)的原理是什么?如何對(duì)FATFS進(jìn)行移植?

    FatFs文件系統(tǒng)的原理是什么?FatFs文件系統(tǒng)的移植方法是什么?如何實(shí)現(xiàn)eMMC卡中文件的讀寫及其它操作?
    發(fā)表于 11-25 07:52

    stm32+sdio+fatfs文件系統(tǒng)_源碼分析

    stm32+sdio+fatfs文件系統(tǒng)介紹,通俗易懂。
    發(fā)表于 11-06 09:52 ?25次下載

    FatFs文件系統(tǒng)使用

    STM系列FatFs文件系統(tǒng)使用文件,希望對(duì)大家有幫助。
    發(fā)表于 11-06 18:10 ?8次下載

    基于SD卡的FATFS文件系統(tǒng)的研究與應(yīng)用_崔鵬偉

    基于SD卡的FATFS文件系統(tǒng)的研究與應(yīng)用_崔鵬偉。
    發(fā)表于 04-14 16:46 ?40次下載

    FatFs通用FAT文件系統(tǒng)模塊_中文手冊(cè)

    FatFs通用FAT文件系統(tǒng)_0.09A中文手冊(cè),學(xué)習(xí)嵌入式的肯定要用到它。FatFs個(gè)為小型嵌入式系統(tǒng)設(shè)計(jì)的通用FAT(File A
    發(fā)表于 07-13 15:40 ?90次下載

    《Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解》第5章、Linux文件系統(tǒng)與設(shè)備文件系統(tǒng)

    《Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解》第5章、Linux文件系統(tǒng)與設(shè)備文件系統(tǒng)
    發(fā)表于 10-27 14:13 ?0次下載
    《Linux設(shè)備驅(qū)動(dòng)開發(fā)<b class='flag-5'>詳解</b>》第5章、Linux<b class='flag-5'>文件系統(tǒng)</b>與設(shè)備<b class='flag-5'>文件系統(tǒng)</b>

    CH579 SPIFLASH W25Q64 FATFS文件系統(tǒng)

    CH579 SPIFLASH W25Q64 FATFS文件系統(tǒng)(arm嵌入式開發(fā)平臺(tái)PB)-W25Qxx的SPIFlash掛載文件系統(tǒng),實(shí)現(xiàn)掛載fatfs
    發(fā)表于 08-04 11:44 ?78次下載
    CH579 SPIFLASH W25Q64 <b class='flag-5'>FATFS</b><b class='flag-5'>文件系統(tǒng)</b>

    Fatfs文件系統(tǒng)的移植)

    Fatfs文件系統(tǒng)的移植)文件系統(tǒng)介紹二、移植條件、說(shuō)明1、FatFs模塊在可移植性方面設(shè)定了以下條件:2、數(shù)據(jù)類型說(shuō)明3、
    發(fā)表于 11-15 18:51 ?22次下載
    <b class='flag-5'>Fatfs</b>(<b class='flag-5'>文件系統(tǒng)</b>的移植)

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

    采用的獨(dú)特的文件系統(tǒng)結(jié)構(gòu)CDFS:CDFS是大部分的光盤的文件系統(tǒng)exFATFATFS文件系統(tǒng)FATFS個(gè)完全免費(fèi)開源的FAT
    發(fā)表于 11-29 09:51 ?29次下載
    <b class='flag-5'>FATFS</b><b class='flag-5'>文件系統(tǒng)</b><b class='flag-5'>詳解</b>

    文件系統(tǒng)FatFs文件系統(tǒng)在嵌入式芯片LPC18XX上的移植

    文件系統(tǒng)FatFs文件系統(tǒng)在嵌入式芯片LPC18XX上的移植
    發(fā)表于 12-04 10:51 ?12次下載
    【<b class='flag-5'>文件系統(tǒng)</b>】<b class='flag-5'>FatFs</b><b class='flag-5'>文件系統(tǒng)</b>在嵌入式芯片LPC18XX上的移植

    FATFS文件系統(tǒng)原版文件下載

    FATFS文件系統(tǒng)原版文件下載
    發(fā)表于 06-25 09:02 ?0次下載

    文件系統(tǒng)FatFs的移植

    FATFS個(gè)完全免費(fèi)開源的FAT文件系統(tǒng)模塊,專門為小型的嵌入式系統(tǒng)而設(shè)計(jì)。它完全用標(biāo)準(zhǔn)C語(yǔ)言編寫,所以具有良好的硬件平臺(tái)獨(dú)立性,甚至可以移植到8位的單片機(jī)上而只需做簡(jiǎn)單的修改。
    的頭像 發(fā)表于 03-01 14:38 ?1710次閱讀
    <b class='flag-5'>文件系統(tǒng)</b><b class='flag-5'>FatFs</b>的移植