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. Delphi判断一个字符串在另一个字符串中出现的次数 7个方法的效率对比。

    unit Unit14; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Syste ...

  2. Linux 在线安装MySQL8.0

    1.更新Linux yum yum update 2.安装wget工具(如果已经安装wget,可以跳过该步骤) yum install wget 3.使用wget下载MySQL Yum Reposit ...

  3. NC51222 Strategic game

    题目链接 题目 题目描述 Bob enjoys playing computer games, especially strategic games, but sometimes he cannot ...

  4. 【Lua】ToLua逻辑热更新

    1 前言 ​ Lua基础语法 中系统介绍了 Lua 的语法体系,xLua逻辑热更新 中介绍了 xLua 的应用,本文将进一步介绍 Unity3D 中基于 ToLua 实现逻辑热更新. ​ 逻辑热更新是 ...

  5. Context与Reducer

    Context与Reducer Context是React提供的一种跨组件的通信方案,useContext与useReducer是在React 16.8之后提供的Hooks API,我们可以通过use ...

  6. eclipse安装UML插件

    安装AmaterasUML AmaterasUML 是一个用于 Eclipse 的轻量级 UML 和 ER 图编辑器. 将AmaterasUML的3个jar包拷到Eclpise的plugins文件下: ...

  7. Flutter学习

    常用网址 免费下载 !<AliFlutter 体系化建设和实践> Flutter 开发文档 Flutter实战 Dart 编程语言概览 pub仓库 main函数使用了(=>)符号, ...

  8. ABP Suite创建新项目

    启动Abp Suite ********************************************************************** ** Visual Studio ...

  9. JAVA 考试管理系统 大作业(一):需求分析

    好家伙,有需要的拿去借鉴吧(虽然我也百度了很多) 题目如下: 题目四:考试管理系统 (选做要求:使用图形用户界面) 分3种用户角色:教务员(具有管理权限).教师.学生 l  教务员:可以进行用户管理( ...

  10. 51从零开始用Rust编写nginx,江湖救急,TLS证书快过期了

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,会将实 ...