FAT12文件系统结构介绍

FAT12文件系统

FAT12(File Allocation Table 12)是一种简单的文件系统,主要用于早期的软盘和小容量存储设备。它的设计简单、易于实现,因此在嵌入式系统和早期的操作系统中广泛使用。FAT12 是 FAT 文件系统家族中的一员,后续还有 FAT16 和 FAT32。


写在前面

由于最近一款嵌入式产品需要使用spi flash存储数据并通过外接usb接口将数据读出,故考虑将设备插入电脑识别为U盘,这就涉及到需要使用FAT12文件系统,本文将介绍其数据结构,并通过编码实现,以及在调试学习过程中遇到的问题及思考。目标达成:
1.输出引导扇区结构数据。
2.输出根目录区数据结构。
3.通过嵌入式软件通过FAT12文件系统存入一个txt文件,并通过电脑读取出来。

FAT12文件系统结构

FAT12特点

  • 12 位 FAT 表项:每个 FAT 表项占 12 位(1.5 字节),用于表示簇的状态。
  • 小容量支持:FAT12 适用于小容量存储设备(如软盘),通常支持的最大容量为 32MB。
  • 简单结构:FAT12 的结构简单,易于实现和调试。
  • 兼容性:FAT12 被大多数操作系统支持,具有良好的兼容性。

FAT12文件系统结构

FAT12文件系统分为5个区,引导扇区中记录了整个文件系统的基础信息。FAT1表与FAT2表完全一致,属于相互备份的关系,里面存储了簇号,与数据区存在特殊的关系,后续会详细介绍。根目录区记录了文件系统内所有存储的文件信息,包括文件名、簇号、属性、时间等等。数据区不言而喻,是存储文件主体内容的地方。

序号扇区位置扇区个数备注
0101引导扇区
0211FAT1表
0321FAT2表
0434根目录区
0571数据区
引导扇区结构
标识偏移量类型大小默认值描述
JMP instruction0db3EB 3C 90跳转指令
OEM3db8MSDOS5.0OEM字符串,必须为 8 个字符,不足会以空格填充
Bytes per sectorBdw24,096每个扇区字节数
Sectors per clusterDdb12每簇占用的扇区数
Reserved sectorsEdw21保留扇区
Number of FATs10db12FAT 表的数量(通常为 2,用于冗余)。
Root entries11dw2512根目录可容纳的目录项数
Sectors (under 32 MB)13dw24096逻辑扇区总数
Media descriptor (hex)15db1F8媒体描述符
Sectors per FAT16dw21每个 FAT 表占用的扇区数。
Sectors per track18dw21每磁道的扇区数。
Heads1Adw21磁头数。
Hidden sectors1Cdd40隐藏扇区数(通常为 0)。
Sectors (over 32 MB)20dd40逻辑扇区总数(容量高于32MB看这里)
BIOS drive (hex, HD=8x)24db180BIOS驱动器号
(Unused)25db10未使用
Ext. boot signature (29h)26db129扩展引导标志
Volume serial number (decimal)27dd44110327770卷序列号
Volume serial number (hex)27dd4DA 9F FE F4卷序列号
Volume label2Bdb11NO NAME卷标,必须为11个字符,不足会以空格填充
File system36db8FAT12文件系统类型,必须是8个字符,不足以空格填充
BOOT_Code3Edb448-引导代码
Signature (55 AA)1FEdb255 AA系统引导标识,引导扇区结束标识

在这里插入图片描述

媒体描述符常见值
值(十六进制)描述
0xF03.5 英寸高密度软盘(1.44MB)
0xF8硬盘
0xF93.5 英寸双密度软盘(720KB)
0xFA5.25 英寸单密度软盘(320KB)
0xFB3.5 英寸高密度软盘(1.2MB)
0xFC5.25 英寸单密度软盘(180KB)
0xFD5.25 英寸双密度软盘(360KB)
0xFE5.25 英寸单密度软盘(160KB)
0xFF5.25 英寸双密度软盘(320KB)
FAT表结构
FAT 项可取值描述
0BPB_Media磁盘标识字,低字节需与 BPB_Media 数值保持一致, F8
1FFFh表示第一个簇已占用
2 ~ N000h空闲簇
001h保留簇
002h~FEFh已用簇,指向下一个簇
FF0h~FF6h保留簇
FF7h坏簇
FF8h~FFFh文件的最后一个簇,结束簇

在这里插入图片描述

FAT表采用链表结构,12bit为一个信息单元,
例如FAT1中的数据为: F8 FF FF FF FF FF FF 7F 00 FF FF FF; 第5簇的数据为 007,表示第五簇数据区末尾指向第七簇,连接起来才是完整数据,第六簇为FFF表示只用了一簇数据区,第七簇FFF表示文件最后一个簇。

根目录区
名称偏移长度描述
DIR_Name0x0011文件名 8B,扩展名 3B
DIR_Attr0x0B1文件属性
保留0x0C10保留位
DIR_WrtTime0x162最后一次写入时间
DIR_WrtDate0x182最后一次写入日期
DIR_FstCtus0x1A2起始簇号
DIR_FileSize0x1C4文件大小

在这里插入图片描述

数据区

1.引导扇区中的关键信息

  • 在计算数据扇区之前,需要从引导扇区中获取以下关键信息:
  • 每扇区字节数(Bytes Per Sector):4096
  • 每簇扇区数(Sectors Per Cluster):1
  • 保留扇区数(Reserved Sectors):1
  • FAT 表数量(Number of FATs):2
  • 每个 FAT 表占用的扇区数(Sectors Per FAT)。
  • 根目录条目数(Root Entries):根目录的最大条目数。
  • 根目录占用的扇区数:可以通过根目录条目数计算。

2.计算根目录占用的扇区数
根目录的扇区数可以通过以下公式计算:
根目录扇区数 = 根目录条目数 × 32 每扇区字节数 根目录扇区数 = \frac{根目录条目数×32}{每扇区字节数} 根目录扇区数=每扇区字节数根目录条目数×32

  • 每个根目录条目占 32 字节。
  • 结果向上取整。

3.计算数据区的起始扇区
数据区的起始扇区可以通过以下公式计算:
数据区起始扇区 = 保留扇区数 + ( F A T 表数量 × 每个 F A T 表占用的扇区数) + 根目录扇区数 数据区起始扇区 = 保留扇区数+(FAT表数量×每个FAT表占用的扇区数)+根目录扇区数 数据区起始扇区=保留扇区数+FAT表数量×每个FAT表占用的扇区数)+根目录扇区数

4.计算文件对应的数据扇区
文件的起始簇号可以从根目录条目中获取。数据扇区的计算公式如下:
数据扇区 = 数据区起始扇区 + (簇号 − 2 ) × 每簇扇区数 数据扇区 = 数据区起始扇区+(簇号-2)×每簇扇区数 数据扇区=数据区起始扇区+(簇号2×每簇扇区数

  • 簇号:文件的起始簇号(从根目录条目中获取)。
  • 每簇扇区数:文件系统的最小分配单位。
  • 减去 2:因为簇号从 2 开始(簇号 0 和 1 保留)。

FAT文件系统官方网站

软件实现

软件就通过SPI驱动FLASH,读出引导扇区数据,并根据引导扇区数据结构进行解析,然后可以得到FAT1、FAT2、根目录的起始扇区,读取FAT1可以得知数据区分布簇,读取根目录可以知道文件目录,得到每个文件存储的起始簇,然后通过写flash,可以往对应文件写数据;
注意事项:往文件写数据需要确保三个地方正确,数据区要正确,根目录对应文件size也需要改写,涉及到文件需要增加簇时,FAT1表也需要进行修改,FAT2表就是FAT1表的备份,需要同时修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值