FAT32 文件系统详解

#PS:要转载请注明出处,本人版权所有

#PS:这个只是 《 我自己 》理解,如果和你的

#原则相冲突,请谅解,勿喷

最近有个项目是做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,我们就可以顺着线,了解所有。

如果对文中的一些词语不了解,请多百度。

此外,此文章是我查看许多资料而融合而来,向前人致敬!!!

1 存储介质

    由于我们的存储介质是由存储载体(磁面或者存储芯片)和 读写机构组成。如硬盘的磁面和磁头部分等等。这就解决了怎么物理级读取数据的问题,而操作系统的存储驱动正是做这个事情的。驱动提供接口让我们可以在存储介质上读写数。
    我们虽然可以通过驱动向存储介质写数据,但是都是很低级的写,同时,我们写入的大部分是文件,而很少有人直接往磁盘保存文件中的二进制数据吧,而不保存文件的其他信息吧,并且这样是很难管理的(如:我要取一个文件,就是说我要的是人记住这个文件在存储介质的那个位置,是那几个字节)。为了方便管理,有了文件系统的概念,文件系统可以提供方便的存储文件各种信息的方法。
    FAT文件系统是一个小容量类常用的文件系统,容量太大了就不太适合使用FAT系文件系统。FAT由FAT12 FAT16 FAT32,我们今天主要就是介绍FAT32.

2 FAT32

    由于网上这方面的资料很多,我主要是介绍一些网上现有资料让我迷惑的一些地方。同时通过代码的方式,让我们知道各个组成部分到底是怎么回事。
    FAT32 由 MBR DBR FSINFO FAT1 FAT2 DATA(DATA = DIR + FILE_DATA) 组成。
    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表信息。

//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表存储哪些簇已经被分配

//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:要转载请注明出处,本人版权所有.

有问题请留言,看到后我会第一时间回复

你可能感兴趣的:(嵌入式,文件系统)