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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动器
    +关注

    关注

    52

    文章

    8090

    浏览量

    145782
  • FlaSh
    +关注

    关注

    10

    文章

    1613

    浏览量

    147645
  • SD卡
    +关注

    关注

    2

    文章

    558

    浏览量

    63731
  • BIOS
    +关注

    关注

    5

    文章

    468

    浏览量

    45564
  • FAT32
    +关注

    关注

    0

    文章

    32

    浏览量

    13740
收藏 人收藏

    评论

    相关推荐

    FATFS文件系统移植

    FatFs 是用于小型嵌入式系统的通用 FAT/exFAT 文件系统模块。FatFs 模块是按照 ANSI C (C89) 编写的,与磁盘 I/O 层完全分离。因此它独立于平台。它可以
    的头像 发表于 06-06 09:28 4489次阅读
    <b class='flag-5'>FATFS</b><b class='flag-5'>文件系统</b>移植

    STM32CubeMx入门教程(10):Fatfs文件系统的应用

    导语"fatfs个小型的文件系统,在小型的嵌入式系统中使用非常的广泛,STM32CubeMx自带该文件系统,我们通过简单的配置就能够使用
    发表于 07-12 11:39 4849次阅读
    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 94次下载

    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 1825次阅读
    <b class='flag-5'>文件系统</b><b class='flag-5'>FatFs</b>的移植