FAT32 文件系统详解
PS:要转载请注明出处,本人版权所有。
PS: 这个只是基于《我自己》的理解,
如果和你的原则及想法相冲突,请谅解,勿喷。
前置说明
本文作为本人csdn blog的主站的备份。(BlogID=031)
本文发布于 2017-02-27 12:27:29,现用MarkDown+图床做备份更新。blog原图已丢失,使用csdn所存的图进行更新。(BlogID=031)
环境说明
无
前言
最近有个项目是做STM32裸机开发的,由于需要用到USB向android系统传输数据,先考虑USB HID Class,但是考虑到驱动和后续要支持读取SD问题,进而采用USB MS Class作为传输数据的载体。模拟一个带FAT32文件系统的存储设备。
模拟设备基本信息:总容量8MB,除去MBR,DBR,FSINFO,FAT,等,大概还有7.8MB左右的容量。
这篇文章主要用于讲解FAT32的详细结构,同时也详解存储介质和文件系统的关系。读这篇文章时,以假设你对FAT32 具备一定的了解,至少你知道FAT32由哪些地方组成。现在网上的资料,就我查询来看,都没有介绍MBR,大部分都直接从DBR开始讲起来,而模拟一个存储设备,MBR是一切的起点,只要搞清楚MBR,我们就可以顺着线,了解所有。如果对文中的一些词语不了解,请多百度。
此外,此文章是我查看许多资料而融合而来,向前人致敬!!!
FAT FileSystem
存储介质
由于我们的存储介质是由存储载体(磁面或者存储芯片)和 读写机构组成。如硬盘的磁面和磁头部分等等。这就解决了怎么物理级读取数据的问题,而操作系统的存储驱动正是做这个事情的。驱动提供接口让我们可以在存储介质上读写数。
我们虽然可以通过驱动向存储介质写数据,但是都是很低级的写,同时,我们写入的大部分是文件,而很少有人直接往磁盘保存文件中的二进制数据吧,而不保存文件的其他信息吧,并且这样是很难管理的(如:我要取一个文件,就是说我要的是人记住这个文件在存储介质的那个位置,是那几个字节)。为了方便管理,有了文件系统的概念,文件系统可以提供方便的存储文件各种信息的方法。
FAT文件系统是一个小容量类常用的文件系统,容量太大了就不太适合使用FAT系文件系统。FAT有FAT12,FAT16,FAT32,我们今天主要就是介绍FAT32.
FAT32
由于网上这方面的资料很多,我主要是介绍一些网上现有资料让我迷惑的一些地方。同时通过代码的方式,让我们知道各个组成部分到底是怎么回事。
FAT32 由 MBR,DBR,FSINFO,FAT1,FAT2,DATA(DATA = DIR + FILE_DATA) 组成。
MBR是主引导记录,主要作用是为了标示一个分区的信息而设立的。MBR结构如下:
//0 扇区
uint8_t FAT32_MBR[80]={
0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,/*DPT 开始位*/0x80/**/,0x01/**/,
0x01/**/,0x00,0x0B,0xFE/**/,0x3F,0x00, 0x3F,0x00,0x00,0x00/*4bytes下个分区的扇区地址*/, 0x82,0x3e,0x00,0x00/*4bytes为SD卡总的扇区个数(16002个)*/,0x00,0x00/**/,
0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,
0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,
0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x55,0xAA/**/,
};
MBR决定DBR的起始位置,DBR存储FAT表信息。DBR如下:
//DOS BOOT RECORD
//DBR=引导代码+BPB+扩展BPB+校验
//FAT1 = 63+34
//FAT2 = 63+34+123 = 220
//DATA = 63+34+123+123 = 343
//ROOT-DIR = 343
uint8_t FAT32_DBR[96]={
0xEB,0x58,0x90/*(0x0-0x2)跳转指令*/,0x4D,0x53,0x44,0x4F,0x53,0x35,0x2E,0x30/*(0x3-0xA)OEM区域:MSDOS5.0*/,0x00,0x02/*(0xB-0xC)每扇区字节数*/,0x01/*(0xD)每簇扇区数*/,0x22,0x00/*(0xE-0xF)保留扇区数*/,
0x02/*(0x10)FAT数(Number of FAT) 该分区上FAT的副本数*/,0x00,0x00/*(0x11-0x12)FAT32必须等于0,FAT12/FAT16为根目录中目录的个数;*/,0x00,0x00/*(0x13-0x14)FAT32必须等于0,FAT12/FAT16为扇区总数*/,0xF8/*(0x15),哪种存储介质,0xF8标准值,可移动存储介质,常用的 0xF0*/,0x00,0x00/*(0x16-0x17)FAT32必须为0,FAT12/FAT16为一个FAT 表所占的扇区数*/,0x3F,0x00/*(0x18-0x19)每磁道扇区数,只对于有“特殊形状”(由磁头和柱面每 分割为若干磁道)的存储介质有效,63(0x00 3F)*/,0xFF,0x00/*(0x1A-0x1B)磁头数,只对特殊的介质才有效,255(0x00 FF)。*/,0x3F,0x00,0x00,0x00/*(0x1C-0x1F)DBR分区之前所隐藏的扇区数,63,与MBR中地址0x1C6开始的4个字节数值相等*/,
0x82,0x3E,0x00,0x00/*(0x20-0x23)文件系统总扇区数,16002*/,0x7B,0x00,0x00,0x00/*(0x24-0x27)每个FAT表占用扇区数,123*/,0x00,0x00/*(0x28-0x29),标记,此域FAT32 特有*/,0x00,0x00/*(0x2A-0x2B)FAT32版本号0.0,FAT32特有*/,0x02,0x00,0x00,0x00/*(0x2C-0x2F),根目录所在第一个簇的簇号,2。(虽然在FAT32文件系统 下,根目录可以存放在数据区的任何位置,但是通常情况下还是起始于2号簇) */,
0x01,0x00/*(0x30-0x31),FSINFO(文件系统信息扇区)扇区号1,该扇区为操作 系统提供关于空簇总数及下一可用簇的信息*/,0x06,0x00/*(0x32-0x33),备份引导扇区的位置。备份引导扇区总是位于文件系统 的6号扇区*/,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00/*(0x34-0x3F),用于以后FAT 扩展使用*/,
0x80,0x00/*(0x40-0x41),与FAT12/16 的定义相同,只不过两者位于启动扇区不同的位置而已*/,0x29/*(0x42),扩展引导标志,0x29。与FAT12/16 的定义相同*/,0xAF,0xE3,0xB5,0x10/*(0x43-0x46),卷序列号。通常为一个随机值*/,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20/*(0x47-0x51)卷标(ASCII码),如果建立文件系统的时候指定了卷 标,会保存在此*/,0x46,0x41,0x54,0x33,0x32,0x20,0x20,0x20/*(0x52-0x59)文件系统格式的ASCII码,FAT32*/,0x00,0x00,0x00,0x00,0x00,0x00,};
FSINFO如下:
//文件系统信息扇区,位于DBR 后一个扇区
//64扇区
uint8_t FAT32_FSINFO[48]={
0x52,0x52,0x61,0x41/*扩展引导标签*/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,
0x00,0x00,0x00,0x00/**/,0x72,0x72,0x41,0x61/*FSINFO签名“0x72724161”*/,0x66,0x3D,0x00,0x00/*文件系统的空簇数,15788*/,0x15,0x00,0x00,0x00/*下一可用簇号(0x 00 00 00 15)*/,
0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x00,0x00/**/,0x00,0x00,0x55,0xAA/**/,
};
FAT表存储哪些簇已经被分配, FAT表如下:
//97扇区,FAT1
//220,FAT2
uint8_t FAT32_FAT[28]={
0xF8,0xFF,0xFF,0x0F, 0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0x0F, 0x04,0x00,0x00,0x00 ,
0x05,0x00,0x00,0x00, 0x06,0x00,0x00,0x00, 0xFF,0xFF,0xFF,0x0F
};
同理通过DBR和FAT表我们可以推算出DIR所在的扇区,同时,也可以推算出DATA所在的扇区,然后我们就可以模拟一个带FAT32文件系统的存储设备。
注意:文中的一些地方要结合其他的FAT32文章基础来看,我只是很直白的表达了,到底介质上存了什么才会让OS认出这就是FAT32,容量多大。
后记
无
参考文献
- 无
打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)
PS: 请尊重原创,不喜勿喷。
PS: 要转载请注明出处,本人版权所有。
PS: 有问题请留言,看到后我会第一时间回复。
FAT32 文件系统详解的更多相关文章
- 【转载】FAT32文件系统详解
硬盘是用来存储数据的,为了使用和管理方便,这些数据以文件的形式存储在硬盘上.任何操作系统都有自己的文件管理系统,不同的文件系统又有各自不同的逻辑组织方式.例如:常见的文件系统有FAT,NTFS,EXT ...
- [转帖]Linux文件系统详解
Linux文件系统详解 https://www.cnblogs.com/alantu2018/p/8461749.html 贼复杂.. 从操作系统的角度详解Linux文件系统层次.文件系统分类.文件系 ...
- [自制操作系统] JOS文件系统详解&支持工作路径&MSH
本文分为两部分: 第一部分将详细分析JOS的文件系统及文件描述符的实现方法. 第二部分将实现工作路径,提供新的系统调用,完善用户空间工具. 本文中支持的新特性: 支持进程工作目录 提供getcwd与c ...
- proc文件系统详解(原创)
Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过 ...
- 【史上最全】Hadoop 核心 - HDFS 分布式文件系统详解(上万字建议收藏)
1. HDFS概述 Hadoop 分布式系统框架中,首要的基础功能就是文件系统,在 Hadoop 中使用 FileSystem 这个抽象类来表示我们的文件系统,这个抽象类下面有很多子实现类,究竟使用哪 ...
- FastDFS 分布式文件系统详解
什么是文件系统 文件系统是操作系统用于在磁盘或分区上组织文件的方法和数据结构.磁盘空间是什么样的我们并不清楚,但文件系统可以给我们呈现一个非常清晰的表象,我们可以创建.删除.修改和复制这些文件,而实现 ...
- linux基础知识3_根文件系统详解
文件系统: rootfs:根文件系统 /boot:系统启动相关的文件,如内核.initrd以及grub /dev:设备文件 块设备:随机访问 字符设备:线性访问,按字符为单位 设备号:主设备号(maj ...
- 2-2 Linux 根文件系统详解
根据马哥Linux初级视频2-3 1. 根文件下的一级目录 #ls / 1. / boot 系统启动相关的文件.如内核.initrd (initialization run directory) ...
- linux文件系统详解
最近在做磁盘性能优化,需要结合文件系统原理去思考优化方向,因此借此机会进一步加深了对文件系统的认识.在看这篇文章之前,建议先看下前面一篇关于磁盘工作原理的解读.下面简单总结一些要点分享出来: 一.文件 ...
- Linux EXT 文件系统 详解
上几章我们讲到了Linux启动的一些问题,接下来我们来看一下硬盘分割和EXT格式文件系统的问题.前面提到了分区表的问题,分区表位于MBR, 占用64个字节.所谓的硬盘分区也就是对硬盘进行规划,填写分区 ...
随机推荐
- 自然语言开发AI应用,利用云雀大模型打造自己的专属AI机器人
如今,大模型层出不穷,这为自然语言处理.计算机视觉.语音识别和其他领域的人工智能任务带来了重大的突破和进展.大模型通常指那些参数量庞大.层数深.拥有巨大的计算能力和数据训练集的模型. 但不能不承认的是 ...
- 借助 .NET 开源库 Sdcb.DashScope 调用阿里云灵积通义千问 API
在昨天的博文中,我们通过 Semantic Kernel 调用了自己部署的通义千问开源大模型,但是自己部署通义千问对服务器的配置要求很高,即使使用抢占式按量实例,每次使用时启动服务器,使用完关闭服务器 ...
- 思维分析逻辑 5 DAY
目录 如何分析 结构分析 对比分析 时间序列 相关性分析 机器学习 报告撰写 报告撰写三原则 标准化报告的组成 AB测试 AB测试流程 AB测试注意事项 如何分析 结构分析 对比分析 对比分析:所有的 ...
- 查看调整cpu频率及模式
使用cpufrequtils查看调整cpu频率及模式 cpufrequtils是一个查看和修改CPU频率GHz的工具 有些物理服务器使用默认频率进行运行,这时可以使用该工具进行就该CPU的核心频率 安 ...
- Linux进程与线程的基本概念及区别
前言 假设你正在玩一款在线多人游戏,在游戏中,有多个角色需要进行不同的操作,例如攻击.移动.释放技能等等. 接下来,我们用玩游戏的例子,来解释进程和和线程的概念,以及进程和线程的区别. 进程的基本概念 ...
- ORACLE ROLLUP和CUBE介绍
http://blog.csdn.net/wanghai__/article/details/4817920 ------------------ ROLLUP,是GROUP BY子句的一种扩展,可以 ...
- python 创建动态类
一般情况下多数是预先定义类 而少数特殊情况就需要去动态创建类了,直接贴代码. class BaseModel(Model): class Meta: database = _tb class_new ...
- 糟糕,CPU100%了!!!
前言 cpu使用率100%问题,是一个让人非常头疼的问题.因为出现这类问题的原因千奇百怪,最关键的是它不是必现的,有可能是系统运行了一段时间之后,在突然的某个时间点出现问题. 今天特地把我和同事,之前 ...
- 硬件开发笔记(五): 硬件开发基本流程,制作一个USB转RS232的模块(四):创建CON连接器件封装并关联原理图元器件
前言 有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的.为了更好的表述封装设计过程,本文描述了一个创建CON标准连接件封装,创建 ...
- python中如何使两个序列相加不改变内存地址的几种方式
# 方式1 a = [1,2,3] print(a) # 4551311680 a.extend([4,5]) print(a) # 4551311680 # 方式2 b = [1,2,3] prin ...