衡阳派盒市场营销有限公司

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

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

3天內不再提示

FATFS文件系統詳解(一)

冬至子 ? 來源:jaffer ? 作者:jaffer ? 2023-06-07 14:36 ? 次閱讀

1.簡介

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

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

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

2.基礎概念

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

區分 ==扇區、塊、簇== 的概念

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

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

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

3.FAT文件系統組成介紹

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

保留區

FAT區

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

數據區

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

4.FAT文件系統分析

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

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

1.jpg

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

4.2 引導扇區分析

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

1.jpg

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

1.jpg

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

注意,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 扇區(2372*512=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卷總共分為以下四個區域:

保留區

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

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

FAT區(分區表裝載區)

根目錄區

數據區

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

1.jpg

2.jpg

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

1.jpg

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

1.jpg

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

    關注

    53

    文章

    8271

    瀏覽量

    147056
  • FlaSh
    +關注

    關注

    10

    文章

    1642

    瀏覽量

    148663
  • SD卡
    +關注

    關注

    2

    文章

    566

    瀏覽量

    64108
  • BIOS
    +關注

    關注

    5

    文章

    470

    瀏覽量

    45933
  • FAT32
    +關注

    關注

    0

    文章

    33

    瀏覽量

    13829
收藏 人收藏

    評論

    相關推薦

    FATFS文件系統移植

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

    STM32CubeMx入門教程(10):Fatfs文件系統的應用

    導語"fatfs個小型的文件系統,在小型的嵌入式系統中使用非常的廣泛,STM32CubeMx自帶該文件系統,我們通過簡單的配置就能夠使用
    發表于 07-12 11:39 ?5672次閱讀
    STM32CubeMx入門教程(10):<b class='flag-5'>Fatfs</b><b class='flag-5'>文件系統</b>的應用

    FATFS文件系統移植

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

    FATFS文件系統簡介

    FATFS文件系統1.FATFS文件系統簡介2. 硬件設計3. 軟件設計3.1 STM32CubeMX設置3.2 MDK-ARM編程4. 下載驗證
    發表于 08-10 08:14

    FatFs文件系統的原理是什么?如何對FATFS進行移植?

    FatFs文件系統的原理是什么?FatFs文件系統的移植方法是什么?如何實現eMMC卡中文件的讀寫及其它操作?
    發表于 11-25 07:52

    stm32+sdio+fatfs文件系統_源碼分析

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

    FatFs文件系統使用

    STM系列FatFs文件系統使用文件,希望對大家有幫助。
    發表于 11-06 18:10 ?8次下載

    基于SD卡的FATFS文件系統的研究與應用_崔鵬偉

    基于SD卡的FATFS文件系統的研究與應用_崔鵬偉。
    發表于 04-14 16:46 ?40次下載

    FatFs通用FAT文件系統模塊_中文手冊

    FatFs通用FAT文件系統_0.09A中文手冊,學習嵌入式的肯定要用到它。FatFs個為小型嵌入式系統設計的通用FAT(File A
    發表于 07-13 15:40 ?95次下載

    CH579 SPIFLASH W25Q64 FATFS文件系統

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

    Fatfs文件系統的移植)

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

    FATFS文件系統詳解

    采用的獨特的文件系統結構CDFS:CDFS是大部分的光盤的文件系統exFATFATFS文件系統FATFS個完全免費開源的FAT
    發表于 11-29 09:51 ?29次下載
    <b class='flag-5'>FATFS</b><b class='flag-5'>文件系統</b><b class='flag-5'>詳解</b>

    文件系統FatFs文件系統在嵌入式芯片LPC18XX上的移植

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

    FATFS文件系統原版文件下載

    FATFS文件系統原版文件下載
    發表于 06-25 09:02 ?0次下載

    文件系統FatFs的移植

    FATFS個完全免費開源的FAT文件系統模塊,專門為小型的嵌入式系統而設計。它完全用標準C語言編寫,所以具有良好的硬件平臺獨立性,甚至可以移植到8位的單片機上而只需做簡單的修改。
    的頭像 發表于 03-01 14:38 ?2042次閱讀
    <b class='flag-5'>文件系統</b><b class='flag-5'>FatFs</b>的移植
    杭州百家乐官网西园| 太阳城丝巾| 百家乐官网平台有什么优势| 九州百家乐的玩法技巧和规则| 龙游县| 百家乐图淑何看| 金域百家乐官网娱乐城| 国际娱百家乐的玩法技巧和规则 | 百家乐官网技巧开户| 尊龙国际| 澳门百家乐怎赌才能赚钱| 兴宁市| 新东方百家乐的玩法技巧和规则| 免费玩百家乐的玩法技巧和规则| 百家乐官网视频游365| 大发888娱乐城技巧| 百家乐官网群lookcc| 百家乐官网游戏看路| 百家乐正品| 做生意摆放风水| 百家乐官网小77论坛| 百家乐博牌规| 百家乐下注技术| 百家乐官网娱乐城备用网址| 大连娱网棋牌官网| 澳门百家乐规则视频| 一路发娱乐场| 老钱庄百家乐的玩法技巧和规则| 百家乐官网5式直缆打法| 澳门顶级赌场金鹰娱乐| 百家乐桌码合| 木星百家乐官网的玩法技巧和规则 | 威尼斯人娱乐城真人百家乐| 百家乐官网永利娱乐场开户注册 | 百家乐官网打鱼秘| 澳门百家乐官网投注法| 百家乐博娱乐场开户注册| 网上赌百家乐官网的玩法技巧和规则 | 澳门顶级赌场手机在线登陆| 澳门百家乐鸿福厅| 百家乐官网牌具公司|