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 文件系统详解的更多相关文章

  1. 【转载】FAT32文件系统详解

    硬盘是用来存储数据的,为了使用和管理方便,这些数据以文件的形式存储在硬盘上.任何操作系统都有自己的文件管理系统,不同的文件系统又有各自不同的逻辑组织方式.例如:常见的文件系统有FAT,NTFS,EXT ...

  2. [转帖]Linux文件系统详解

    Linux文件系统详解 https://www.cnblogs.com/alantu2018/p/8461749.html 贼复杂.. 从操作系统的角度详解Linux文件系统层次.文件系统分类.文件系 ...

  3. [自制操作系统] JOS文件系统详解&支持工作路径&MSH

    本文分为两部分: 第一部分将详细分析JOS的文件系统及文件描述符的实现方法. 第二部分将实现工作路径,提供新的系统调用,完善用户空间工具. 本文中支持的新特性: 支持进程工作目录 提供getcwd与c ...

  4. proc文件系统详解(原创)

    Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过 ...

  5. 【史上最全】Hadoop 核心 - HDFS 分布式文件系统详解(上万字建议收藏)

    1. HDFS概述 Hadoop 分布式系统框架中,首要的基础功能就是文件系统,在 Hadoop 中使用 FileSystem 这个抽象类来表示我们的文件系统,这个抽象类下面有很多子实现类,究竟使用哪 ...

  6. FastDFS 分布式文件系统详解

    什么是文件系统 文件系统是操作系统用于在磁盘或分区上组织文件的方法和数据结构.磁盘空间是什么样的我们并不清楚,但文件系统可以给我们呈现一个非常清晰的表象,我们可以创建.删除.修改和复制这些文件,而实现 ...

  7. linux基础知识3_根文件系统详解

    文件系统: rootfs:根文件系统 /boot:系统启动相关的文件,如内核.initrd以及grub /dev:设备文件 块设备:随机访问 字符设备:线性访问,按字符为单位 设备号:主设备号(maj ...

  8. 2-2 Linux 根文件系统详解

    根据马哥Linux初级视频2-3 1. 根文件下的一级目录 #ls / 1. / boot 系统启动相关的文件.如内核.initrd   (initialization run directory) ...

  9. linux文件系统详解

    最近在做磁盘性能优化,需要结合文件系统原理去思考优化方向,因此借此机会进一步加深了对文件系统的认识.在看这篇文章之前,建议先看下前面一篇关于磁盘工作原理的解读.下面简单总结一些要点分享出来: 一.文件 ...

  10. Linux EXT 文件系统 详解

    上几章我们讲到了Linux启动的一些问题,接下来我们来看一下硬盘分割和EXT格式文件系统的问题.前面提到了分区表的问题,分区表位于MBR, 占用64个字节.所谓的硬盘分区也就是对硬盘进行规划,填写分区 ...

随机推荐

  1. 洛谷P2415 集合求和(数学问题,使用集合子集求和公式)

    可以知道对于一个有n个数据的集合,其子集个数有2^n个 至于证明可以这样理解,对于n个数据,其子集就是对数据进行组和,而对于每个位置上的数据,组合时仅有两种状态即有此数据或无此数据,也就是有两种可能, ...

  2. 2.列表--《Python编程:从入门到实践》

    2.1 列表   列表由一系列按特定顺序排列的元素组成.在Python中,用方括号([])来表示列表,并用逗号来分隔其中的元素. bicycles = ['trek', 'cannondale', ' ...

  3. IIS的详细配置

    一:配置默认文档 输入ip打开哪个页面是由默认文档设定的 1.打开IIS配置页面,点击网站.我们的默认站点已经启动,可以看到绑定的ip和网页的路径 2.选中Default Web Site,可以看到有 ...

  4. Eclipse安装配置、卸载教程(Windows版)

    Eclipse是一个开放源代码的集成开发环境(IDE),最初由IBM公司开发,现在由Eclipse基金会负责维护.它是一个跨平台的工具,可以用于开发多种编程语言,如Java.C/C++.Python. ...

  5. UVA11573 Ocean Currents

    题目链接 题目 见链接. 题解 知识点:BFS. 这道题显然用BFS,但发现洋流方向会破坏时间的有序性,但注意到洋流时间花费是 \(0\) ,因此只需要用双端队列即可,洋流方向扩展直接放队头,其他方向 ...

  6. 【Unity3D】碰撞体组件Collider

    1 前言 ​ Unity3D 中碰撞体(Collider)组件用于检测运动的物体之间是否发生碰撞,也可以作为触发器使用.产生碰撞的条件是: 2 个游戏对象都有 Collider 至少有一个游戏对象有 ...

  7. Swift —— 一、架构解析

    一.简介 OpenStack 对象存储 (swift) 用于冗余.可扩展的数据 使用标准化服务器集群存储PB的存储 可访问的数据.它是一种长期存储系统,可存储大量 可以检索和更新的静态数据.对象存储使 ...

  8. Spring boot内嵌tomcat日志配置

    1.说明 最近项目启动有问题需要打印更详细的tomcat日志来做分析,所以用一下. 主要涉及到两类日志配置: access log tomcat log access log捕捉http请求 tomc ...

  9. Java I/O 教程(一) 介绍

    Java I/O (Input and Output) 用于处理输入和输出 Java利用流的手段来加快I/O操作.java.io包中包含了各种支持输入输出操作的类.参考下图: 我们可以利用java i ...

  10. Java集合框架学习(六) LinkedList详解

    LinkedList介绍 ArrayList与LinkedList都是List接口的实现类,因此都实现了List的所有未实现的方法,只是实现的方式有所不同. LinkedList是采用链表的方式来实现 ...