精华内容
下载资源
问答
  • fat32文件系统

    2017-05-09 15:56:23
    fat32文件系统
  • FAT32文件系统

    2018-10-06 21:23:26
    FAT32文件系统FAT32文件系统FAT32是个非常有功劳的文件系统,Microsoft成功地设计并运用了它,直到今天NTFS铺天盖地袭来的时候,FAT32依然占据着Microsoft Windows文件系统中重要的地位。FAT32最早是出于FAT16不支持...
  • FAT32文件系统原理和FAT32文件系统算法,深入了解。
  • FAT32 文件系统详解

    2017-03-05 09:26:40
    FAT32 文件系统
  • FAT32文件系统结构

    2020-04-22 16:20:26
    FAT32文件系统详解,FAT(File Allocation Table,文件分配表)文件系统是 windows 操作系统所使用的一种文件系统,它的发展过程经历了 FAT12、FAT16、FAT32 三个阶段。本文详细介绍了FAT32文件系统数据结构。
  • FAT32文件系统

    千次阅读 2007-03-23 20:23:00
    Windows95 OSR2和Windows 98开始支持FAT32文件系统,它是对早期DOS的FAT16文件系统的增强,由于文件系统的核心--文件分配表FAT由16位扩充为32位,所以称为FAT32文件系统。在一逻辑盘(硬盘的一分区)超过 512 兆字节...

    Windows95 OSR2和Windows 98开始支持FAT32文件系统,它是对早期DOS的FAT16文件系统的增强,由于文件系统的核心--文件分配表FAT由16位扩充为32位,所以称为FAT32文件系统。在一逻辑盘(硬盘的一分区)超过 512 兆字节时使用这种格式,会更高效地存储数据,减少硬盘空间的浪费,一般还会使程序运行加快,使用的计算机系统资源更少,因此是使用大容量硬盘存储文件的极有效的系统。本人对Windows 98下的FAT32 文件系统做了分析实验,总体上与FAT16文件系统变化不大,现将有关变化部分简介如下:

      (一)FAT32 文件系统将逻辑盘的空间划分为三部分,依次是引导区(BOOT区)、文件分配表区(FAT区)、数据区(DATA区)。引导区和文件分配表区又合称为系统区。

      (二)引导区从第一扇区开始,使用了三个扇区,保存了该逻辑盘每扇区字节数,每簇对应的扇区数等等重要参数和引导记录。之后还留有若干保留扇区。而FAT16文件系统的引导区只占用一个扇区,没有保留扇区。

      (三)文件分配表区共保存了两个相同的文件分配表,因为文件所占用的存储空间(簇链)及空闲空间的管理都是通过FAT实现的,FAT如此重要,保存两个以便第一个损坏时,还有第二个可用。文件系统对数据区的存储空间是按簇进行划分和管理的,簇是空间分配和回收的基本单位,即,一个文件总是占用若干个整簇,文件所使用的最后一簇剩余的空间就不再使用,而是浪费掉了。
      从统计学上讲,平均每个文件浪费0.5簇的空间,簇越大,存储文件时空间浪费越多,利用率越低。因此,簇的大小决定了该盘数据区的利用率。FAT16系统簇号用16位二进制数表示,从0002H到FFEFH个可用簇号(FFF0H到FFFFH另有定义,用来表示坏簇,文件结束簇等),允许每一逻辑盘的数据区最多不超过FFEDH(65518)个簇。FAT32系统簇号改用32位二进制数表示,大致从00000002H到FFFFFEFFH个可用簇号。FAT表按顺序依次记录了该盘各簇的使用情况,是一种位示图法。
      每簇的使用情况用32位二进制填写,未被分配的簇相应位置写零;坏簇相应位置填入特定值;已分配的簇相应位置填入非零值,具体为:如果该簇是文件的最后一簇,填入的值为FFFFFF0FH,如果该簇不是文件的最后一簇,填入的值为该文件占用的下一个簇的簇号,这样,正好将文件占用的各簇构成一个簇链,保存在FAT表中。0000000H、00000001H两簇号不使用,其对应的两个DWORD位置(FAT表开头的8个字节)用来存放该盘介质类型编号。FAT表的大小就由该逻辑盘数据区共有多少簇所决定,取整数个扇区。

      (四)FAT32系统一簇对应8个逻辑相邻的扇区,理论上,这种用法所能管理的逻辑盘容量上限为16TB(16384GB),容量大于16TB时,可以用一簇对应16个扇区,依此类推。FAT16系统在逻辑盘容量介于128MB到256MB时,一簇对应8个扇区,容量介于256MB到512MB时,一簇对应16个扇区,容量介于512MB到1GB时,一簇对应32个扇区,容量介于1GB到2GB时,一簇对应32个扇区,超出2GB的部分无法使用。显然,对于容量大于512MB的逻辑盘,采用FAT32的簇比采用FAT16的簇小很多,大大减少了空间的浪费。
      但是,对于容量小于512MB的盘,采用FAT32虽然一簇8个扇区,比使用FAT16一簇16个扇区,簇有所减小,但FAT32的FAT表较大,占用空间较多,总数据区被减少,两者相抵,实际并不能增加有效存储空间,所以微软建议对小于512M的逻辑盘不使用FAT32。
      另外,对于使用FAT16文件系统的用户提一建议,硬盘分区时,不要将分区(逻辑盘)容量正好设为某一区间的下限,例:将一逻辑盘容量设为1100M(稍大于1024M),则使用时其有效存储容量比分区为950M的一般还少,因其簇大一倍,浪费的空间较多。还有,使用FDISK等对分区指定容量时,由于对1MB的定义不一样(标准的二进制的1MB为1048576B,有的系统将1MB理解为1000000B,1000KB等),及每个分区需从新磁道开始等因素,实际分配的容量可能稍大于指定的容量,亦需注意掌握。

      (五)根目录区(ROOT区)不再是固定区域、固定大小,可看作是数据区的一部分。因为根目录已改为根目录文件,采用与子目录文件相同的管理方式,一般情况下从第二簇开始使用,大小视需要增加,因此根目录下的文件数目不再受最多512的限制。FAT16文件系统的根目录区(ROOT区)是固定区域、固定大小的,是从FAT区之后紧接着的32个扇区,最多保存512个目录项,作为系统区的一部分。

      (六)目录区中的目录项变化较多,一个目录项仍占32字节,可以是文件目录项、子目录项、卷标项(仅跟目录有)、已删除目录项、长文件名目录项等。目录项中原来在DOS下保留未用的10个字节都有了新的定义,全部32字节的定义如下:
    (1) 0-- 7字节 文件正名。
    (2) 8--10字节 文件扩展名。
    (3) 11字节 文件属性,按二进制位定义,最高两位保留未用,0至5位分别是只读位、隐藏位、系统位、卷标位、子目录位、归档位。
    (4) 11--13字节 仅长文件名目录项用,用来存储其对应的短文件名目录项的文件名字节校验和等。
    (5) 13--15字节 24位二进制的文件建立时间,其中的高5位为小时,次6位为分钟。
    (6) 16--17字节 16位二进制的文件建立日期,其中的高7位为相对于1980年的年份值,次4位为月份,后5位为月内日期。
    (7) 18--19字节 16位二进制的文件最新访问日期,定义同(6)。
    (8) 20--21字节 起始簇号的高16位。
    (9) 22--23字节 16位二进制的文件最新修改时间,其中的高5位为小时,次6位为分钟,后5位的二倍为秒数。
    (10)24--25字节 16位二进制的文件最新修改日期,定义同(6)。
    (11)26--27字节 起始簇号的低16位。
    (12)28--31字节 32位的文件字节长度。

      其中第(4)至(8)项为以后陆续定义的。 对于子目录项,其(12)为零;已删除目录项的首字节值为E5H。在可以使用长文件名的FAT32系统中,文件目录项保存该文件的短文件名,长文件名用若干个长文件名目录项保存,长文件名目录项倒序排在文件短目录项前面,全部是采用双字节内码保存的,每一项最多保存十三个字符内码,首字节指明是长文件名的第几项,11字节一般为0FH,12字节指明类型,13字节为校验和,26--27字节为零。

      (七)以前版本的 Windows 和DOS与 FAT32 不兼容,不能识别FAT32分区,有些程序也依赖于 FAT16 文件系统,不能和 FAT32 驱动器一道工作。将硬盘转换为 FAT32,就不能再用双引导运行以前版本的 Windows(Windows 95 [Version 4.00.950]、Windows NT 3.x、Windows NT 4.0 和 Windows 3.x)

     

     

    展开全文
  • FAT32文件系统.ppt

    2021-06-10 16:41:57
    FAT32文件系统.ppt
  • 脂肪32 使用C ++编写的进行中的简单Fat32文件系统阅读器
  • FAT32文件系统.pdf

    2020-05-30 10:26:23
    FAT32文件系统.pdf
  • fat32 文件系统

    2016-05-19 13:43:36
    扇区 512字节 簇 8个扇区 1/ 保留区 , 引导扇区, 36个扇区 ...4/ 根目录区 , 第一个簇, 簇号是2 , 8个扇区, 每 32个字节用于描述一个文件或者目录(名称,文件类型,权限,日期,簇起始号,长度). 5/ 数据区, 存

    扇区  512字节

    簇     8个扇区

    1/ 保留区  ,  引导扇区,  36个扇区

    2/ 文件分配表, 0x3c6个扇区,  每 4个字节 描述 一个簇的状态.(是否已用,下一个簇号)

    3/ 文件分配表 备份区

    4/ 根目录区 ,  第一个簇, 簇号是2 , 8个扇区,   每 32个字节用于描述一个文件或者目录(名称,文件类型,权限,日期,簇起始号,长度).

    5/ 数据区, 存储文件内容


    6/ 空文件只占用根目录区,不 占用数据区.

    7/ 2号簇 根目录区用完后,系统会在未用的簇分配更多的根目录区 簇.

    展开全文
  • FAT32文件系统结构详解

    万次阅读 多人点赞 2018-04-13 15:38:58
    1. SD卡中FAT32文件系统快速入门 1.1. 理论知识 1.1.1. MBR(Main Boot Record) 主引导记录,占446字节, 为计算机启动后从可启动介质上首先装入内存并且执行的代码,通常用来解释分区结构 1.1.2. DBR(DOS Boot ...

    1. SD卡中FAT32文件系统快速入门

    1.1. 理论知识

    1.1.1. MBR(Main Boot Record)

    • 主引导记录,占446字节, 为计算机启动后从可启动介质上首先装入内存并且执行的代码,通常用来解释分区结构

    1.1.2. DBR(DOS Boot Record)

    • DOS引导记录,为操作系统进入文件系统以后可以访问的第一个扇区,通常用来解释文件系统,DBR是由硬盘的MBR装载的程序段。DBR装入内存后,即开始执行该引导程序段,其主要功能是完成操作系统的自举并将控制权交给操作系统。每个分区都有引导扇区,但只有被设为活动分区才会被MBR装的DBR入内存运行

    1.1.3. EBR(Extended Boot Record)

    • 扩展分区引导记录,类似于主引导记录MBR.因为MBR四条分区信息的限制,可以使用EBR方便扩展.它的结构与MBR类似,但是没有引导程序和磁盘签名,仅仅保留了分区表和结束标志

    1.1.4. 工具说明

    • 本文中的SD卡为SanDisk,大小为8G(卡上面写的),每簇8个扇区,每扇区512bytes
    • 使用的查看工具为“Winhex.exe”

    1.2. 硬盘结构与SD卡结构

    1.2.1. 硬盘结构

    • 以4分区的硬盘为例加以说明:

      这里写图片描述

    • 主引导扇区包括主引导记录(446bytes),4个DPT(Disk partition table硬盘分区表)(4*16=64bytes),分区有效标志0x55AA

    • 扩展分区中的每个逻辑驱动器都存在一个类似于MBR的扩展引导记录EBR。扩展引导记录包括一个扩展分区表和该扇区的标签。如果磁盘上没有扩展分区,那么就不会有扩展引导记录和逻辑驱动器。第一个逻辑驱动器的扩展分区表中的第一项指向它自身的引导扇区。第二项指向下一个逻辑驱动器的EBR。如果不存在进一步的逻辑驱动器,第二项就不会使用,而且被记录成一系列零。如果有附加的逻辑驱动器,那么第二个逻辑驱动器的扩展分区表的第一项会指向它本身的引导扇区。第二个逻辑驱动器的扩展分区表的第二项指向下一个逻辑驱动器的EBR。扩展分区表的第三项和第四项永远都不会被使用。 
      关于扩展分区,如下图所示,扩展分区中逻辑驱动器的扩展引导记录是一个连接表。该图显示了一个扩展分区上的三个逻辑驱动器,说明了前面的逻辑驱动器和最后一个逻辑驱动器之间在扩展分区表中的差异

      这里写图片描述

    • 除了扩展分区上最后一个逻辑驱动器外,扩展分区表的格式在每个逻辑驱动器中都是重复的:第一个项标识了逻辑驱动器本身的引导扇区,第二个项标识了下一个逻辑驱动器的EBR。最后一个逻辑驱动器的扩展分区表只会列出它本身的分区项。最后一个扩展分区表的第二个项到第四个项未被使用

    1.2.2. MBR分析

    • MBR放置在硬盘物理地址0的地方。总共512字节的主引导扇区中,MBR只占用了其中的446个字节,另外64个字节交给了 DPT,最后两个字节“55,AA”是分区的结束标志。DPT由4个分区表组成,每个16字节。下图为硬盘的MBR图

    这里写图片描述

    • 你的硬盘的MBR引导代码可能并非这样。不过即使不同,所执行的功能大体是一样的
    • 红色划线部分即为DPT分区表,详细定义如下表,仅以第一个分区表为例说明,需要注意的是FAT32文件系统数据存储方式为小端字节序,数据反着看就对了~就像下表中总扇区数一样

      这里写图片描述

    1.2.3. SD卡结构

    SD卡是没有分区的,默认只有一个分区,使用winhex打开如下

    这里写图片描述

    • unpartitioned space:非分区空间,即MBR所在扇区,0扇区
    • Partition1(F:):分区空间,数据即是保存在此处的,开始扇区为305152,此值可以在MBR中找到
    • 分区是以柱面的容量为分区粒度的,如果磁盘总空间不是整数个柱面的话,不够一个柱面空间就是剩余空间了,这部分空间并不参与分区,无法利用
    • 卡空间说明:7.3G=8*1000*1000*1000/1024/1024/1024,8G使用单位是十进制的,十进制下1G=1000M=1000000K=1000000000Bytes,而二进制下1G=1024M、1M=1024K,1K=1024bytes,而硬盘制造商一般会以10进制为单位

    1.2.4. SD卡MBR

    打开上图非分区空间,如下:

    这里写图片描述

    • 红色划线(0x0004A800):相对扇区数,305152,四不四很熟悉?
    • 绿色划线(0x00E83800):总扇区数,15218688
    • 总空间=总扇区数*每扇区字节数=15218688*512=7791968256,winhen显示的总字节数为7948206080差不多啦~~~

    1.2.5. SD卡存储结构

    SD卡文件系统并不是处在整个SD卡最开始的地方,它处在MBR所处的保留区之后,于是我们可以对使用FAT32文件系统的SD卡整体布局给出如下图示。

    这里写图片描述

    1.3. FAT32文件系统

    1.3.1. FAT文件系统介绍

    • FAT(File Allocation Table,文件分配表)文件系统是windows操作系统所使用的一种文件系统,它的发展过程经历了FAT12、FAT16、FAT32三个阶段。FAT文件系统用“簇”作为数据单元。一个“簇”由一组连续的扇区组成,簇所含的扇区数必须是2的整数次幂。簇的最大值为64个扇区,即32KB。所有簇从2开始进行编号,每个簇都有一个自己的地址编号。用户文件和目录都存储在簇中。 本文每簇4KB大小。

    • FAT文件系统的数据结构中有两个重要的结构:文件分配表和目录项: 
      文件分配表:文件和文件夹内容储存在簇中,如果一个文件或文件夹需要多于一个簇的空间,则用FAT表来描述,如何找到另外的簇。FAT结构用于指出文件的下一个簇,同时也说明了簇的分配状态。FAT12、FAT16、FAT32这三种文件系统之间的主要区别在与FAT项的大小不同。 
      目录项:FAT文件系统的每一个文件和文件夹都被分配到一个目录项,目录项中记录着文件名、大小、文件内容起始地址以及其他一些元数据。

    • 在FAT文件系统中,文件系统的数据记录在“引导扇区中(DBR)”中。引导扇区位于整个文件系统的0号扇区,是文件系统隐藏区域(也称为保留区)的一部分,我们称其为DBR扇区,DBR中记录着文件系统的起始位置、大小、FAT表个数及大小等相关信息。在FAT文件系统中,同时使用“扇区地址”和“簇地址”两种地址管理方式。这是因为只有存储用户数据的数据区使用簇进行管理(FAT12和FAT16的根目录除外),所有簇都位于数据区。其他文件系统管理数据区域是不以簇进行管理的,这部分区域使用扇区地址进行管理。文件系统的起始扇区为0号扇区(逻辑0扇区)。

    1.3.2. FAT32文件系统结构

    FAT文件系统整体分布如1.2.5节所示

    • 深绿色:保留区含有一个重要的数据结构——DOS引导扇区(DBR)。FAT12、FAT16的保留区通常只有一个扇区,而FAT32的保留扇区要多一些,除0号扇区外,还有其他一些扇区,其中包括了DBR的备份扇区。
    • 黄色:FAT区由两个大小相等的FAT表组成——FAT1、FAT2,FAT2紧跟在FAT1之后。
    • 灰色:FAT12、FAT16的根目录虽然也属于数据区,但是他们并不由簇进行管理。也就是说FAT12、FAT16的根目录是没有簇号的,他们的2号簇从根目录之后开始。而FAT32的根目录通常位于2号簇。

    1.3.3. 保留区(深绿色)

    • FAT32文件系统的开始部分有一个由若干个扇区组成的保留区,保留区的大小会记录在DBR扇区中,比较常见的为32、34或38个扇区。由DBR中0x0e和0x0f两个地址的数值决定,小端字节序,即N的值。

    1.3.4. DBR解析

    对读写FAT文件系统来说常用的就图中划线部分,48个字节,具体定义如下:

    这里写图片描述

    • 0x00~0x02:3字节,跳转指令。
    • 0x03~0x0A:8字节,文件系统标志和版本号,这里为MSDOS5.0。
    • 0x0B~0x0C:2字节,每扇区字节数,0x0200=512
    • 0x0D~0x0D:1字节,每簇扇区数,0x08。
    • 0x0E~0x0F:2字节,保留扇区数,0x0C22=3106
    • 0x10~0x10:1字节,FAT表个数,0x02。
    • 0x11~0x12:2字节,FAT32必须等于0,FAT12/FAT16为根目录中目录的个数;
    • 0x13~0x14:2字节,FAT32必须等于0,FAT12/FAT16为扇区总数。
    • 0x15~0x15:1字节,哪种存储介质,0xF8标准值,可移动存储介质。
    • 0x16~0x17:2字节,FAT32必须为0,FAT12/FAT16为一个FAT 表所占的扇区数。
    • 0x18~0x19:2字节,每磁道扇区数,只对于“特殊形状”(由磁头和柱面分割为若干磁道)的存储介质有效,0x003F=63。
    • 0x1A~0x1B:2字节,磁头数,只对特殊的介质才有效,0x00FF=255。
    • 0x1C~0x1F:4字节,EBR分区之前所隐藏的扇区数,0x0004A800=305152又出现了呢,与MBR中地址0x1C6开始的4个字节数值相等。
    • 0x20~0x23:4字节,文件系统总扇区数,0x00E83800=15218688
    • 0x24~0x27:4字节,每个FAT表占用扇区数,0x000039EF=14831
    • 0x28~0x29:2字节,标记,此域FAT32 特有。
    • 0x2A~0x2B:2字节,FAT32版本号0.0,FAT32特有。
    • 0x2C~0x2F:4字节,根目录所在第一个簇的簇号,0x02。(虽然在FAT32文件系统下,根目录可以存放在数据区的任何位置,但是通常情况下还是起始于2号簇)
    • 0x30~0x31:2字节,FSINFO(文件系统信息扇区)扇区号0x01,该扇区为操作系统提供关于空簇总数及下一可用簇的信息。
    • 0x32~0x33:2字节,备份引导扇区的位置。备份引导扇区总是位于文件系统的6号扇区。
    • 0x34~0x3F:12字节,用于以后FAT 扩展使用。
    • 0x40~0x40:1字节,与FAT12/16 的定义相同,只不过两者位于启动扇区不同的位置而已。
    • 0x41~0x41:1字节,与FAT12/16 的定义相同,只不过两者位于启动扇区不同的位置而已 。
    • 0x42~0x42:1字节,扩展引导标志,0x29。与FAT12/16 的定义相同,只不过两者位于启动扇区不同的位置而已
    • 0x43~0x46:4字节,卷序列号。通常为一个随机值。
    • 0x47~0x51:11字节,卷标(ASCII码),如果建立文件系统的时候指定了卷标,会保存在此。
    • 0x52~0x59:8字节,文件系统格式的ASCII码,FAT32。
    • 0x5A~0x1FD:共420字节,引导代码。
    • 0x1FE~0x1FF:签名标志“55 AA”。 
      FAT文件系统将引导代码与文件形同数据结构融合在FAT32文件系统引导扇区的512字节中,90~509字节为引导代码,而FAT12/16则是62~509字节为引导代码。同时,FAT32还可以利用引导扇区后的扇区空间存放附加的引导代码。一个FAT卷即使不是可引导文件系统,也会存在引导代码。

    1.3.5. FSINFO扇区

    FAT32在保留区中增加了一个FSINFO扇区,用以记录文件系统中空闲簇的数量以及下一可用簇的簇号等信息,以供操作系统作为参考。FSINFO信息扇区一般位于文件系统的1号扇区,结构非常简单。

    这里写图片描述

    • 0x200~0x203:4个字节,扩展引导标志“0x52526141”。
    • 0x204~0x3E3:480个字节,未使用,全部置0。
    • 0x3E4~0x3E7:4个字节,FSINFO签名“0x72724161”。
    • 0x3E8~0x3EB:4个字节,文件系统的空簇数,0xFFFFFFFF,这个值感觉有问题,格式化SD卡新建一个小于4K的文件,此处的值变成0x1CF6FE,所以上面的值应该为0x1FF6FF,猜测可能是由于格式化之后就会将此处置FF,新建文件后才会恢复
    • 0x3EC~0x3EF:4个字节,下一可用簇号(0x00000002)。
    • 0x3F0~0x3FD:14个字节,未使用。
    • 0x3FE~0x3FF:2个字节,“55 AA”标志。 
      温馨提示:通常情况下,文件系统的2号扇区结尾也会被设置“55 AA”标志。6号扇区也会有一个引导扇区的备份,相应的7号扇区应该是一个备份FSINFO信息扇区,8号扇区可以看做是2号扇区的备份。

    1.3.6. FAT表

    紧跟在保留分区后面的是FAT区,其由两个完全相同的FAT(File Allocation Table, 文件分配表)表单组成,FAT文件系统的名字也是因此而来。FAT 表是一组与数据簇号对应的列表。FAT2紧跟在FAT1之后,它的位置可以通过FAT1的位置加上FAT表的扇区数计算出来。

    1.3.7. FAT表的作用

    • 文件系统分配磁盘空间按簇来分配。因此,文件占有磁盘空间时,基本单位不是字节而是簇,即使某个文件只有一个字节,操作系统也会给它分配一个最小单元:即一个簇。对于大文件,需要分配多个簇。同一个文件的数据并不一定完整地存放在磁盘中一个连续地区域内,而往往会分若干段,像链子一样存放。这种存储方式称为文件的链式存储。为了实现文件的链式存储,文件系统必须准确地记录哪些簇已经被文件占用,还必须为每个已经占用的簇指明存储后继的下一个簇的簇号,对于文件的最后一簇,则要指明本簇无后继簇。这些都是由FAT表来保存的,FAT 表对应表项中记录着它所代表的簇的有关信息:诸如是空,是不是坏簇,是否是已经是某个文件的尾簇等。

    • 对于文件系统来说,FAT表有两个重要作用:描述簇的分配状态以及标明文件或目录的下一簇的簇号。

    • 通常情况下,一个FAT文件系统会有两个FAT表,但有时也允许只有一个FAT表,FAT表的具体个数记录在引导扇区的偏移0x10字节处。
    • 由于FAT区紧跟在文件系统保留区后,所以FAT1在文件系统中的位置可以通过引导记录中偏移0x0E~0x0F字节处的“保留扇区数”得到,即M值。

    1.3.8. FAT表分析说明

    • FAT32中每个簇的簇地址是有32bit(4个字节),FAT表中的所有字节位置以4字节为单位进行划分,并对所有划分后的位置由0进行地址编号。0号地址与1号地址被系统保留并存储特殊标志内容。从2号地址开始,每个地址对应于数据区的簇号,FAT表中的地址编号与数据区中的簇号相同。我们称FAT表中的这些地址为FAT表项,FAT表项中记录的值称为FAT表项值。
    • 当文件系统被创建,也就是进行格式化操作时,分配给FAT区域的空间将会被清空,在FAT1与FAT2的0号表项与1号表项写入特定值。由于创建文件系统的同时也会创建根目录,也就是为根目录分配了一个簇空间,通常为2号簇,与之对应的2号FAT表项记录为2号簇,被写入一个结束标记。
    • 由于簇号起始于2号,所以FAT表项的0号表项与1号表项不与任何簇对应。FAT32的0号表项值总是“F8FFFF0F”。
    • 1号表项可能被用于记录脏标志,以说明文件系统没有被正常卸载或者磁盘表面存在错误。不过这个值并不重要。正常情况下1号表项值为“FFFFFFFF”或“FFFFFF0F”。
    • 如果某个簇未被分配使用,它对应的FAT表项值0;
    • 当某个簇已被分配使用,则它对应的FAT表项内的表项值也就是该文件的下一个存储位置的簇号。如果该文件结束于该簇,则在它的FAT表项中记录的是一个文件结束标记,对于FAT32而言,代表文件结束的FAT表项值为0x0FFFFFFF。
    • 如果某个簇存在坏扇区,则整个簇会用0xFFFFFF7标记为坏簇,这个坏簇标记就记录在它所对应的FAT表项中。
    • 在文件系统中新建文件时,如果新建的文件只占用一个簇,为其分配的簇对应的FAT表项将会写入结束标记。如果新建的文件不只占用一个簇,则在其所占用的每个簇对应的FAT表项中写入为其分配的下一簇的簇号,在最后一个簇对应的FAT表象中写入结束标记。
    • 新建目录时,只为其分配一个簇的空间,对应的FAT表项中写入结束标记。当目录增大超出一个簇的大小时,将会在空闲空间中继续为其分配一个簇,并在FAT表中为其建立FAT表链以描述它所占用的簇情况。

    1.3.9. FAT表示例

    这里写图片描述

    • 绿色划线:0号表项,0x0FFFFFF8,FAT表起始固定标识
    • 红色划线,1号表项,0x0FFFFFFF,不使用,默认值
    • 蓝色划线,2号表项,0x0FFFFFFF,标识文件结束,表项对应2号簇,根目录所在簇
    • 如何找到FAT表所在扇区: 
      DBR的偏移0x0E-0x0F(0x0C22=3106)是保留区大小,保留区之后即为FAT1起始扇区,上图中偏移0x184400转换为扇区0x184400/512=3106,扇区从0计数,所以3106扇区即是FAT1所在扇区,读者可以通过FAT表大小,计算出FAT2的起始扇区吗?我相信可以的,你们都是最胖的T_T
    • 计算根目录起始扇区: 
      N=保留区大小+2*FAT表大小=0x0C22+2*0x000039EF=32768
    • 将SD卡格式化,新建TEST.txt文件,大小为8.5KB,FAT表结构如下:

    这里写图片描述

    • 红色划线:2号表项,对应2号簇,为根目录
    • 绿色划线:3号表项,对应3号簇,表项值为0x04,Test.txt的下一个簇为4号簇
    • 蓝色划线:4号表项,对应5号簇,表项值为0x05,Test.txt的下一个簇为5号簇
    • 黄色划线:5号表项,对应5号簇,表项值为0x0FFFFFFF,文件结束

    1.3.10. 数据区(灰色区域)

    • 数据区是真正用于存放用户数据的区域。数据区紧跟在FAT2之后,被划分成一个个的簇。所有的簇从2开始进行编号,也就是说,2号簇的起始位置就是数据区的起始位置。
    • 虽然原则上FAT32允许根目录位于数据区的任何位置,但通常情况下它都位于数据区起始扇区。在FAT文件系统中,先要寻找数据区的第一簇(即2号簇)的位置,它不是位于文件系统开始处,而是位于数据区。从前面的学习知道,在数据区前面是保留区域和FAT区域,在前面还有MBR区域,这些区域都不使用FAT表进行管理。因此,数据区以前的区域只能使用扇区地址,而无法使用簇地址。
    • 数据区起始扇区号即是根目录扇区号,上面已计算得出32768。

    1.4. 目录项

    目录所在的扇区,都是以32 Bytes划分为一个单位,每个单位称为一个目录项,即每个目录项的长度都是32 Bytes 。根目录由若干个目录项组成,一个目录项占用32个字节,可以是长文件名目录项、文件目录项、“.”目录项和“..”目录项等 
    此处只是简单的以上文中创建的TEST.txt为例说明短文件目录项的结构。

    这里写图片描述

    • 0x00-0x07:文件名,不足8个字节0x20补全(短文件名8.3命名规则)
    • 0x08-0x0A:扩展名
    • 0x0B:文件属性,0x20表示归档
    • 0x0D:创建时间的10毫秒位
    • 0x0E-0x0F:文件创建时间
    • 0x10-0x11:文件创建日期
    • 0x12-0x13:文件最后访问日期
    • 0x14-0x15:文件起始簇号的高16位 0x0000
    • 0x16-0x17:文件最近修改时间
    • 0x18-0x19:文件最近修改日期
    • 0x1A-0x1B:文件起始簇号的地16位 0x0003
    • 0x1C-0x1F:文件的长度,0x2206=8710bytes=8.5K 

    原文链接:https://blog.csdn.net/u010650845/article/details/60881687

     

     

    展开全文
  • FAT32 文件系统

    千次阅读 2014-12-30 16:07:31
    FSInfo 名称 Offset(byte) 大小(Byte) 描述 FSI_LeadSig 0 4 值为0x41615252,这个标记用来表示该扇区为FSInfo扇区。...保留为以后扩展使用,FAT32格式化程序应该把此域全部设置为0,当前版本的FAT

    FAT32 文件系统


    需求:在一个不带文件系统的操作系统上完成对SD card的访问和读写操作,参考标准FAT32格式做一个驱动。
    辅助工具:WinHex

    按照自己的学习习惯,第一部分先摘取关键有效信息做笔记,接着再转为有效的合适的数据结构,最后画流程图。

    1 FAT32 信息摘要

    学习过程中来自此处博客文章 [http://blog.csdn.net/mjx91282041/article/details/8904705]的信息量巨大,实在可做为较全的开发教程,摘录供再次参考。
    另外再需要一份正规点的开发白皮书“Microsoft Extensible Firmware Initiative FAT32 File System Specification”作细节校正。

    1.1 FSInfo

    名称 Offset(byte) 大小(Byte) 描述
    FSI_LeadSig 0 4 值为0x41615252,这个标记用来表示该扇区为FSInfo扇区。
    FSI_Reserved1 4 480 保留为以后扩展使用,FAT32格式化程序应该把此域全部设置为0,当前版本的FAT程序不可以访问该域。
    FSI_StrucSig 484 4 值为0x61417272,更具体地表明该扇区已经被使用。
    FSI_Free_Count 488 4 保存最新的剩余簇的数量,如果为0xFFFFFFFF表示剩余簇未知,需要重新计算,除此之外的其他值都可以用,而且不要求十分精确,但必须保证其值≤磁盘所有的簇数。
    FSI_Nxt_Free 492 4 该域为FAT驱动程序提供一条有利的线索,它告诉驱动程序应该从哪里开始寻找剩余簇,因为FAT32的FAT表可能非常庞大,如果已经分配的簇很多的话要从头开始查找剩余簇,这将耗费大量时间。通常这个值被设定为驱动程序最后分配出去的簇号,如果值为0xFFFFFFFF,那么驱动程序必须从簇2开始查找,除此之外其他的值都可以使用,当然,前提是这个值必须是合法的。
    FSI_Reserved2 496 12 保留为以后扩展使用,FAT32格式化程序应该把此域全部设置为0,当前版本的FAT程序不可以访问该域。
    FSI_TrailSig 508 4 值为0xAA550000,此结束标记用来表示这是一个FSInfo扇区,注意此域的高两位偏移量为510和511,这和启动扇区在相同偏移处的标记是一样的。


    1.2 FAT表

    //...
    // 待补充
    //...

    1.3 目录项

     FAT32的根目录由簇链组成,其扇区数是不确定的,这点和普通文件相同,根目录的第一个扇区号存储在BPB_RootClus中。

    根目录不同于其他的目录,没有日期和时间戳,也没有目录名(“/”并不是其目录名),同时根目录里没有“.”和“..”这两个目录项,根目录另一个特殊的地方在于,根目录中有一个设置了ATTR_VOLUME_ID位(见下表)的文件,这个文件在整个FAT卷中是唯一的。

    文件系统刚被创建(可通过格式化你的设备实现),还没有任何存储数据时,文件系统只为根目录分配了一个簇的空间(通常为2号簇),并将结束标记0x0FFFFFFF,表示该簇已经被使用,但根目录下没有任何内容,目录项全部为00

    此时通过新建文件,或者更改卷标,刚才全部为空的根目录就会如以上根目录项的格式填充内容。
    DIR_Name域实际由两部分组成:8个字符的主文件名和3个字符的扩展名。两部分如果字符数不够的话用空格(0x20)填充(Trailing Space Padded)。

    [注]:根目录项中只有定义了卷标,才会出现 DIR_Attr =ATTR_VOLUME_ID 的内容。否则没有属性为卷标的目录项。另外卷标所在的目录项不一定会分配到根目录到第一个目录项空间,根目录的空间分配按照创建时间从0号目录项依次分配,所以在当检测到DIR_Name[0]为0x00时,可以认为此后的目录项都没有内容。

        目录所在的扇区,都是以32 Bytes划分为一个单位,每个单位称为一个目录项(Directory Entry ),即每个目录项的长度都是32 Bytes 根目录由若干个目录项组成,一个目录项占用32个字节,可以是长文件名目录项、文件目录项、子目录项等。

    名称 Offset (Byte) 大小(Byte) 描述
    DIR_Name 0 11 短文件名
    DIR_Attr 11 1 文件属性:
    ATTR_READ_ONLY       0x01
    ATTR_HIDDEN            0x02
    ATTR_SYSTEM            0x04
    ATTR_VOLUME_ID       0x08
    ATTR_DIRECTORY       0x10
    ATTR_ARCHIVE           0x20
    ATTR_LONG_NAME     ATTR_READ_ONLY |
                                      ATTR_HIDDEN |
                                      ATTR_SYSTEM |
                                      ATTR_VOLUME_ID
    前两个属性位为保留位,在文件创建时应该把这两位设为0,在以后的使用中不能读写和更改。
    DIR_NTRes 12 1 保留给Windows NT使用,在文件创建时设置该位为0,在以后的使用中不能读写和更改。
    DIR_CrtTimeTeenth 13 1 文件创建时间的毫秒级时间戳,由于DIR_CrtTime的精度为2秒,所以此域的有效值在0-199之间。
    DIR_CrtTime 14 2 文件创建时间。
    DIR_CrtData 16 2 文件创建日期。
    DIR_LastAccDate 18 2 最后访问日期,请注意并没有最后访问时间域,而只有日期,这日期是指文件被读写的日期,如果是写,该日期还应该被写到DIR_WrDate中。
    DIR_FstClusHI 20 2 该目录项起始簇号的高位字(FAT12/16此位为0)
    DIR_WrtTime 22 2 最后写的时间,文件创建被认作写
    DIR_WrtDate 24 2 最后写的日期,文件创建被认作写
    DIR_FstClusL0 26 2 该目录项起始簇号的低位字
    DIR_FileSize 28 4 文件大小,由32-bit双字组成

    1.3.1 DIR_Name[0]

    此处特别注释目录项的第一个字节 DIR_Name[0]:

    1. 如果DIR_Name[0] == 0xE5,则此目录为空(目录项不包含文件和目录),或表示该项已被删除
    2. 如果DIR_Name[0] == 0x00,则此目录为空(同0xE5),并且此后的不再分配有目录项(此后所有的DIR_Name[0]均为0)。不同于0xE5,如果DIR_Name[0]的值为0,那么FAT程序将不会再去检测其后续的磁盘空间,因为这些空间都是空闲的。
    3. 如果DIR_Name[0] == 0x05,则文件名在该位的实际值为0xE5,但0xE5是日文中合法的字符,当需要用0xE5来作为DIR_Name[0]时使用0x05来代替,避免程序误认为该目录项为空。
    4. DIR_Name[0]不允许为0x20,主文件名和扩展文件名的间隔“.”并不真实存在于DIR_Name中,小写字母不允许出现在DIR_Name中(这些字符因为不同的国家和地区而异)。

    [注]:以下字符不允许出现在DIR_Name中的任何位置:0x22, 0x2A, 0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x5B, 0x5C, 0x5D还有0x7C。

    1.4 数据区举例

    //...
    // 待补充
    //...

    1.5 文件创建

    1.5.1 文件分配规则

    首先,根据创建文件的不同,FAT32的结构分配也不同,需要知道的是:

    1. 是不是所有类型和大小的文件都需要被分配FAT表从而占用至少一个簇都空间?
    1. 所有文件大小大于0的文本文件
    2. 所有文件夹,不论是否为空
    3. 所有目录文件
    2. 是不是所有类型和大小的文件都需要创建目录文件?
    1. 首先系统将2号簇默认为根目录文件
    2. 任何类型的文件都有一个目录项用于存储其文件名,文件大小,起始簇地址以及其他属性
    3. 目录项存储于目录文件中,一个目录文件中可存放多个目录项(目录项大小32Byte)
    4. 目录文件根据当前文件的数量动态创建,当前目录文件没有足够空间存储一个新建文件(不论大小)的目录项时,在FAT表中新建一个簇作为目录文件
    5. 同一个目录文件中的所有文件同属于该目录文件的路径下

    1.5.2 创建一个文件和一个目录

    文件创建中,目录创建和文档创建在属性上存在不同:
    • 文档在被新建的时候,已经明确其所在的路径,即已经有目录被创建,不存在为每个新建文档分配目录文件的问题,当文档被新建,其起始簇的0地址偏移处即存储文档内容;
    • 文件夹作为目录的创建方式,必须分配新簇空间。需要存储该目录下所有的文件信息,所以起始簇的0地址偏移处存储的是当前目录下的所有文件信息,即使是空目录也会存放子目录和父目录信息,用来表示该目录所处的路径。
    • 创建文档和目录都需要将文件属性信息存储在目录项中,另外,创建非空文档时需要被分配有效的可用簇存储文档内容;创建目录需要在目录项中明确父目录子目录关系,但不需要再分配空间。
    逻辑上应该是以下步骤:
    1. 获取文件(文档或目录)大小
    2. 遍历FAT表,按照合适的文件分配策略在FAT表中填写簇的分配信息
    3. 定位当前所在目录,在其所在目录文件中增加目录项
    4. 根据FAT表分配在目录项中写入所在簇起始地址以及其他已知信息
    5. 将文件内容写入给文档分配的起始簇
    实际上,在WinHex中发现当创建一个空的txt文档时,即只有文件名,则FAT表不一定会分配新簇空间,而是只在其所在父目录处新建目录项,当此目录文件(目录文件也是一个标准的簇)被占用满,FAT表中才会再分配下一个可用空间给新建的空文档。所以以上补充:
    • 2‘. 当文件大小为0时,查看当前目录大小是否够用(只需要一个目录项的大小),不够用则新增FAT表,否则跳过步骤2到步骤3
    • 5'. 新建文件夹或空文档跳过步骤5

    以上新建内容是目前所理解做的整理,实际开发之后补充验证结果。

    1.5.3 文件创建举例

    1.5.3.1 txt文件创建

    1.5.3.2 文件夹 目录创建




    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,875
精华内容 2,350
关键字:

fat32文件系统