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. Linux-特殊权限设置(SUID、SGID、SBIT)

    一.SUID权限 1.概念 当s这个标志出现在文件所有者的x权限上时,例如文件权限状态"-rwsr-xr-x",此时就被称为Set UID,简称SUID. 如果该属主权限位上有执行 ...

  2. NC24755 [USACO 2010 Dec S]Apple Delivery

    题目链接 题目 题目描述 Bessie has two crisp red apples to deliver to two of her friends in the herd. Of course ...

  3. JavaScript 的灵异事件之一

    场景 在做项目的时候需要用到Ajax 做多次的异步处理数据, 三次Ajax:A --ok--> B --ok--> C 在入参数据相同的情况下,做了两论这个操作,但发现没有发送 A 的 A ...

  4. sensitive-word 敏感词/脏词开源工具-v.0.10.0-脏词分类标签支持

    sensitive-word sensitive-word 基于 DFA 算法实现的高性能敏感词工具. 创作目的 实现一款好用敏感词工具. 基于 DFA 算法实现,目前敏感词库内容收录 6W+(源文件 ...

  5. golang在 ubuntu下交叉编译报错 gcc: error: unrecognized command line option ‘-mthreads’; did you mean ‘-pthread’?

    前置说明: 之前一直都是用centos 7做开发机, 因为工作需要用c2 工具sliver编译木马而依赖 mingw64,但是centos安装这个非常麻烦, 就换了ubuntu开发机; 现需要交叉编译 ...

  6. C++ 多线程的错误和如何避免(13)

    在 async 任务中抛出的异常会被 std::future::get() 触发 #include <future> #include <iostream> int main( ...

  7. Maven应用常见问题

    在Spring Boot项目中打包指定类为启动类 <build> <plugins> <plugin> <groupId>org.springframe ...

  8. flex布局-20201028

    改版自阮一峰的网络日志-Flex 布局教程:语法篇 在flex容器上设置的(即父元素上设置); flex-direction属性决定主轴的方向(即项目的排列方向). flex-direction: r ...

  9. 记录问题:goland无法识别sdk的问题

    goland版本:2020 go版本:1.20.3最新版 在goland中配置GOROOT时找不到sdk 解决版本: > cd /usr/local/go # 我本地go的安装目录 > c ...

  10. git 多系统复用账号

    重装系统前请备份~/.ssh下的公钥私钥文件,重装系统后,请使用以下方法复用好之前的key 将备份好的key copy至~/.ssh下 将私钥id_rsa的文件属性改为600:sudo chmod 6 ...