FAT32 文件系统在磁盘上的结构

文章目录

  • FAT32 文件系统在磁盘上的结构
    • 卷结构
      • 数据区域的安排
        • 物理地址
        • 物理扇区号
        • 逻辑扇区号
        • 分区区域和常规区域
      • 用户区域的安排
        • 簇的状态
      • 分区区域的安排
        • MRB与分区表位置
        • 分区表的内容
      • 系统区域的安排
        • 系统区域
        • 分区引导扇区和FS信息扇区
        • 文件分配表(FAT表)
    • 文件结构
      • 分区启动扇区
      • FS Info 扇区
      • 文件分配表FAT: File Allocation Table
      • 文件目录
        • 特征
        • 目录项字段
        • 日期和时间格式
        • 与FAT12 / FAT16文件目录的区别
        • 用户数据区域
    • LFN长文件名实现
      • SD存储卡文件系统中的LFN
      • FAT长目录条目
      • 序数生成
      • 校验和生成
      • 示例说明长名称的持久性
        • 长文件名的名称限制和字符集
      • 规则的名称创建和匹配

这个是根据SD协议上Part2部分的文件系统规格文档。

卷结构

先看一下卷结构例子:

高容量SD存储卡的容量结构在本节中指定。为了将数据区域标识为一个分区,主引导记录和分区表存在于卡的第一个扇区以及标准容量SD存储卡中。大容量SD存储卡采用FAT32文件系统。

数据区域的安排

用于大容量SD存储卡的数据区安排与用于标准容量SD存储卡的安排相同。
也就是说,这类卡具有物理地址、物理扇区号和逻辑扇区号的概念,数据区也分为分区区和常规区域。

物理地址

每个部门应由一个物理地址,包括SD卡本身的参数识别。

物理扇区号

卷上的每个扇区应由物理扇区编号标识。物理地址和物理扇号之间应该有一对一的对应关系。物理扇区编号应按升序分配,从0开始。

逻辑扇区号

分区上的每个扇区都应该通过一个逻辑扇区号来标识。分区的第一个扇区应该被分配为0作为逻辑扇区号。物理扇区编号之间应该有一一对应关系。

分区区域和常规区域

数据区空间应分为分区区域常规区域两部分。常规区域分为系统区域用户区域
分区区域应该占用物理扇区编号为0NOM-1的扇区,其中NOM是主引导记录和分区表中的扇区数。
常规区域是卷的一个分区,分为系统区域用户区域
系统区域应占用物理扇区编号NOMNOM+SSA-1的扇区,其中SSA为系统区域内扇区的数量。系统区域应包含指定常规区域的记录格式的描述符。系统区域内不得包含任何文件的任何部分。
用户区域应使用物理扇区编号以NOM+SSA开头的扇区。用户区域应包含文件和目录,并记录用户数据。

我这里有一个16G的U盘,在Windows上格式化,参数如下:

使用Winhex工具打开,当前如下所示:

打开Volume卷后,可以看到,卷结构与协议上面描述的是有差异的,看样子应该是Winhex展示的引导扇区数分区引导信息,而不是主引导记录(后续分析):

用户区域的安排

大容量SD存储卡的用户区布置与标准容量SD存储卡的布置相同。
即将用户区域组织为簇(集群)单元,簇有三种状态。

用户区域应该被组织成称为簇的分配单元。每一组应由相同数目的部门组成。每个簇应该通过一个唯一的簇(集群)号来识别。簇编号应该被分配以2开始的整数。

簇的状态

应将一种状态分配给每一组,并应是下列状态之一:

  • 分配给文件:簇已经被分配
  • 可供分配:簇可以被分配
  • 有缺陷的:这个簇有缺陷,不可以被分配

每个簇的状态应根据ISO/IEC 9293进行标识。

分区区域的安排

数据区域的第一个扇区有一个主引导记录,其中包括可执行代码和分区表,其中包括识别分区的信息以及标准容量SD存储卡。

MRB与分区表位置

(BP 0 to 445) Master Boot Record 主引导记录

这个缩写就是MRB,此字段的内容不由本规范指定。

(BP 446 to 461) Partition Table (partition1) 分区表1

此字段应指定卷中第一个分区的信息。此分区是指用户无需相互身份验证即可访问的常规区域。按表4-2记录。

(BP 462 to 477) Partition Table (partition2) 分区表2

这个字段应该被记录为零,因为一个卷应该由单个规则区域组成。

(BP 478 to 493) Partition Table (partition3) 分区表3

这个字段应该被记录为零,因为一个卷应该由单个规则区域组成。

(BP 494 to 509) Partition Table (partition4) 分区表4

这个字段应该被记录为零,因为一个卷应该由单个规则区域组成。

(BP 510 and 511) Signature Word 签名字段

该字段应记录为55h (BP 510)AAh (BP 511)

分区表的内容

分区表如下所示:

(BP 0) Boot Indicator 启动指示器

如果使用SD存储卡引导,则该字段记录为80h。否则,此字段记录为00h。现在应该比较少用SD卡作为启动盘,我们格式化的卡这个字段一般都是00h

(BP 1) Starting Head 分区起始头

这个字段应该指定分区的起始头。如果分区的起始位置超过8032.5MB(8,422,686,720字节),则该字段应记录为FEh。

(BP 2 and 3) Starting Sector / Starting Cylinder 分区的起始扇区和柱面

此字段应指定分区的起始扇区和柱面。在这个字段应使用中的6位(BP 2中的0到5位)用于开始扇区。该字段应使用中的10位(BP 2中的6位和7位,BP 3中的0位到7位)用于启动柱面。如果分区的起始位置超过8032.5MB(8,422,686,720字节),则该字段将被记录为FFFFh

(BP 4) System ID 系统ID

如果分区的结束位置小于8032.5MB(8,422,686,720字节),则该字段应记录为0Bh。否则,此字段记录为0Ch

(BP 5) Ending Head 分区的结束头

这个字段应该指定分区的结束头。如果分区的结束位置超过8032.5MB(8,422,686,720字节),则该字段应记录为FEh

(BP 6 and 7) Ending Sector / Ending Cylinder 分区的结束扇区和柱面

此字段应指定分区的结束扇区和柱面。6位(BP 6中的0位到5位)在该字段应使用中用于结束扇区。在这个字段应使用中有10位(BP 6中的6位和7位,BP 7中的0位到7位)用于结束柱面。如果分区的结束位置超过8032.5MB(8,422,686,720字节),则该字段将被记录为FFFFh

(BP 8 to 11) Relative Sector 相对扇区

此字段应指定在此分区的开始扇区之前存在的扇区数量。分区的起始扇区应该与附录C.2中指定的边界单元对齐。对排列的详细解释在附录C.2中描述。

(BP 12 to 15) Total Sector 总扇区数

此字段应指定分区上的扇区数。

由于在Windows上格式的没有看到分区表,这里暂时略过。

系统区域的安排

系统区域

系统区域应该包含分区引导扇区、FS信息扇区和文件分配表(FAT)。这些扇区应在卡上记录两次,以便备份。FAT32没有为根目录保留区域。它应该像其他目录一样位于用户数据区域。

分区引导扇区和FS信息扇区

系统区域的第一个扇区应该包含分区引导扇区。它应该包含分区的参数,如簇大小、分区大小等。
系统区域的第二个扇区应该包含FS信息扇区。它应该包含额外的信息,如空闲簇(集群)数,下一个空闲簇(集群),等等。
系统区域的第三个扇区应该为引导扇区保留。这个扇区有签名字。即55h记录在BP 510中,AAh记录在BP 511中。在第三扇区的其他字节将被保留为系统使用,他们不应在本规范中指定。
这个区域的大小应该记录在分区引导扇区的保留扇区计数字段中。在这个规范中,大小应该用于用户数据区域的对齐。更多细节见附录C.2。

以上3个区域都要在卡片上记录两次。在逻辑扇区号(LSN) 0 ~ 2和6 ~ 8中记录如下。

文件分配表(FAT表)

FAT应该包含一个格式标识符和一些条目,每个条目表示用户区域的簇。这些条目应从2开始连续编号,条目编号应等于相应簇的簇编号。
FAT表中的每一项都应表明相应簇的状态。FAT条目应使用用于标识分配给每个文件的一组簇。

文件结构

分区启动扇区

在分区的头部有一个分区引导扇区。对于FAT32文件系统,有些字段是从ISO/IEC 9293的扩展FDC描述符扩展而来的。分区引导扇区应该像前面描述的那样记录两次。

在磁盘上的表现是这样的:

(BP 0 to 2) Jump Command

该字段将指定引导程序的跳转命令。应记录为EBh (BP 0)、XXh (BP 1)和90h (BP 2),或E9h (BP 0)、XXh (BP 1)和XXh (BP 2)。XXh表示该值在本规范中未作规定。

(BP 3 to 10) Creating System Identifier

该字段应为系统指定标识。

(BP 11 and 12) Sector Size

此字段应指定扇区的大小(以字节为单位)。应记录为512号。

(BP 13) Sectors per Cluster

这个字段应该指定每个簇(集群)的扇区数。应记录如下编号:1、2、4、8、16、32或64。确定个簇(集群)大小时应考虑物理层的擦除块大小。该字段应按照本规范的建议进行记录。该建议的详细解释载于附录C.2.3。

(BP 14 and 15) Reserved Sector Count

这个字段应该指定保留给系统使用的扇区的数量。此字段应用于用户数据区域的对齐。对排列的详细解释在附录C.2中描述。

(BP 16) Number of FATs

这一栏应注明FAT表的数量。应记录为数字2。

(BP 17 and 18) Number of Root-directory Entries

这个字段应该指定FAT12 / FAT16文件系统根目录中的条目数。FAT32文件系统不应该使用这个字段,应该记录为数字0。

(BP 19 and 20) Total Sectors

这个字段应该指定大小为65535扇区或更小的分区上的扇区数量。FAT32文件系统不应该使用这个字段,应该记录为数字0。

(BP 21) Medium Identifier

在本规范中,此字段应记录为F8h。

(BP 22 and 23) Sectors per FAT

这个字段应该指定FAT12 / FAT16文件系统的每个FAT表应该占用的扇区数量。FAT32文件系统不应该使用这个字段,应该记录为数字0。

(BP 24 and 25) Sectors per Track

此字段应指定每个磁道中的扇区数。此参数取决于SD存储卡的参数。该字段应按照本规范的建议进行记录。该建议的详细解释见附录C.2.2。

(BP 26 and 27) Number of Sides

此字段应指定可记录的边数。此参数取决于SD存储卡的参数。该字段应按照本规范的建议进行记录。该建议的详细解释见附录C.2.2。

(BP 28 to 31) Number of Hidden Sectors

此字段应指定在此分区的开始扇区之前存在的扇区数量。分区的起始扇区应该与附录C.2中指定的边界单元对齐。对排列的详细解释在附录C.2中描述。

(BP 32 to 35) Total Sectors

如果BP 19 and 20中的字段被记录为零,则该字段将指定分区上的扇区数。FAT32文件系统不能使用BP 19 and 20。因此,该字段不能是零。

(BP 36 to 39) Sectors per FAT for FAT32

他的字段应该指定FAT32文件系统中每个FAT表应该占用的扇区数。

(BP 40 and 41) Extension Flag

此字段将指定FAT镜像的状态。

Bits 0 to 3: 这些位应指定以零为基础的活动FAT表的数量。只有在禁用镜像时,这些位才是有效的。

Bits 4 to 6: 保留。

Bits 7: 表示FAT表在运行时镜像到所有FAT中。1表示只有一个FAT表是活跃的;它是在0到3位中引用的那个。

Bits 8 to 15 : 保留。

(BP 42 and 43) FS Version

这个字段应该指定FAT32文件系统的版本号。高字节是主修订号。低字节是小修订号。这个字段应该记录为0000h,显示版本0:0。

(BP 44 to 47) Root Cluster

这个字段应该指定根目录的第一个簇(集群)的簇(集群)号。这个值应该是2,或者之后第一个可用的(没有缺陷的)簇(集群)可用。

(BP 48 and 49) FS Info

这个字段应该指定FS Info扇区结构被记录的区域的扇区编号。在这里,扇区编号表示与系统区域的首扇区的偏移量。也就是说,扇区编号0表示系统区域的首扇区的位置。
此字段应记录为第1扇区。显示FS Info扇区应该位于系统区域的第二个扇区。

(BP 50 and 51) Backup Boot Sector

这个字段应该指定引导扇区副本所在区域的起始扇区编号。在这里,扇区编号表示与系统区域的首扇区的偏移量。也就是说,扇区编号0表示系统区域的首扇区的位置。
此字段应记录为第6扇区。它显示引导扇区的副本应该记录在系统区域的第7扇区开始的区域中。

(BP 52 to 63) Reserved

该领域应保留以备将来标准化之用。它应记录为零。但是,由于在其他设备上可能会设置一个非00h的值,所以在运行时不应期望设置00h。

(BP 64) Physical Disk Number

此字段将指定BIOS物理磁盘号。此字段应记录为80h。

(BP 65) Reserved

该领域应保留以备将来标准化之用。它应记录为零。但是,由于在其他设备上可能会设置一个非00h的值,所以在运行时不应期望设置00h。

(BP 66) Extended Boot Record Signature

此字段应使用用于标识该结构。此字段记录为29h。

(BP 67 to 70) Volume ID Number

此字段应指定卷识别号。

(BP 71 to 81) Volume Label

此字段应指定卷标签。

(BP 82 to 89) File System Type

此字段将指定文件系统的类型。该字段应记录为FAT32...,最后三个字节是20H,我这里用.代替了。

(BP 90 to 509) Field reserved for system use

此字段应保留供系统使用。在本规范中不作规定。

(BP 510 and 511) Signature Word

该字段应记录为55h (BP 510)和AAh (BP 511)。

FS Info 扇区

在分区引导扇区的下一个扇区中有一个FS Info扇区。这个结构在FAT12 / FAT16卷中不存在。FS Info扇区应按前面所述记录两次。

在磁盘上的表现是这样的:

(BP 0 to 3) Lead Signature

此字段应使用用于验证FS信息扇区的开头。记录为52h (BP 0)、52h (BP 1)、61h (BP 2)、41h (BP 3)。

(BP 4 to 483) Reserved

该领域应保留以备将来标准化之用。它应记录为零。但是,由于在其他设备上可能会设置一个非00h的值,所以在运行时不应期望设置00h。

(BP 484 to 487) Structure Signature

此字段应使用作为验证FS Info扇区完整性的附加签名。记录为72h (BP 484)、72h (BP 485)、41h (BP 486)、61h (BP 487)。

(BP 488 to 491) Free Cluster Count

这个字段应该包含卷上最后已知的空闲簇(集群)计数。值FFFFFFFFh表示空闲计数是未知的。这个字段的内容应该在卷挂载时进行验证(然后由文件系统驱动程序实现在内存中维护)。建议此字段包含卷卸载时(在有控制的卸载/关闭期间)空闲簇(集群)的准确数量。

(BP 492 to 495) Next Free Cluster

这个字段应该包含卷上第一个可用(空闲)簇(集群)的簇(集群)号。值FFFFFFFFh表示不存在关于第一个可用(空闲)簇(集群)的信息。此字段的内容应在卷挂载时进行验证。建议在卷卸除时(在有控制的卸除/关闭期间)适当更新此字段。

(BP 496 to 507) Reserved

该领域应保留以备将来标准化之用。它应记录为零。但是,由于在其他设备上可能会设置一个非00h的值,所以在运行时不应期望设置00h。

(BP 508 to 511) Trail Signature

此字段应使用用于验证FS Info扇区中数据的完整性。记录为00h (BP 508)、00h (BP 509)、55h (BP 510)和AAh (BP 511)。

文件分配表FAT: File Allocation Table

文件分配表由32位FAT条目组成。下表描述了每个FAT条目值。FAT32 FAT条目的高4位被保留。在修改任何FAT32 FAT条目时,所有FAT实现都要保留高4位的当前值,除非在卷初始化(格式化)时,整个FAT表需要设置为0。FAT32卷不应该被配置包含用于分配>= FFFFFF7H的簇(集群)号。

FAT中的前两个条目(8字节)被保留。这些8个字节的FAT应记录为F8h (BP 0), FFh (BP 1), FFh(BP 2), 0Fh(BP 3), FFh(BP 4), FFh (BP 5), FFh (BP 6)和0Fh (BP 7)。但是,文件系统驱动程序可以将BP 7的特定两位用于脏卷标志,如下所示。

Bit 3 (Clean Shutdown Bit) :

如果bit为1,则卷为“干净”。 可以安装该卷以进行访问。
如果bit为0,则卷为“脏”,表明FAT文件系统驱动程序无法正确卸装该卷(在先前的安装操作过程中)。 卷内容
应该扫描文件系统元数据是否有损坏。

Bit 2 (Hard Error Bit) :

如果该位为1,则没有遇到磁盘读/写错误。
如果bit为0,则文件系统驱动程序实现在磁盘上遇到磁盘I / O错误。
上次安装它的卷,这表明某些扇区可能已损坏。 卷内容应使用磁盘修复实用程序进行扫描,该实用程序对其进行表面分析以查找新的坏扇区。

FAT的扇区可能包括未使用的区域,因为簇(集群)的数量将决定FAT的字节大小。未使用的区域应记录为零。

在磁盘上的表现是这样的:我这边新增了一个54KB大小的文件(格式化的时候一个簇64K,这个文件一个簇内可以放下)后新增的一个簇就是这个,簇的值表示当前簇就是结束簇(即一个簇)。

当我这边再新增了一个170KB大小的文件(格式化的时候一个簇64K,这个文件三个簇内可以放下),其内容表现如下,(最后一个簇9指示当前簇是最后一个簇,至于怎么找文件簇开始的地方,要看后面的目录项内容):

文件目录

特征

目录是一个描述符,它应包含一组目录条目,每个目录条目标识一个文件,一个卷标,另一个目录或未使用。 包含根目录的目录中目录条目的最大数量为65536。
目录条目的文件名格式必须支持8.3格式。 并且主机也可以支持长文件名(LFN)作为可选。 如果主机不支持“长文件名”,则它可能会忽略“长文件名”条目,而仅引用LFN存储的8.3格式的文件名。

注意:长文件名功能在附录C.3中描述。

如上一节所述,在FAT12和FAT16卷上,根目录应紧随最后一个文件分配表。 并且该大小是固定大小,以扇区为单位,该大小是根据分区引导扇区中存储的“根目录条目数”值计算得出的。
在格式化为FAT32的卷上,根目录可以具有可变大小。 FAT32卷上根目录的第一个群集的位置存储在分区引导扇区的“根群集”字段中。 只有根目录可以包含卷标签条目。 根目录没有名称(在大多数操作系统实现中,使用隐式名称“ \”)。 此外,根目录没有任何关联的日期/时间戳。 最后,根目录不包含点和点条目。

目录项字段

下表指示目录条目字段的结构。

在磁盘上的表现是这样的:

(BP 0 to 10) Name and Name Extension

该字段应包含由包含该字段的相应条目描述的文件或子目录的11个字符(“短”)名称。 该字段在逻辑上由两个部分组成:

  • 8个字符的名字的主要部分
  • 3个字符的扩展名

如果需要,上述两个组件中的每一个都是“填充尾随空间”(使用值:20h)。

请注意以下几点:

  1. 隐含的.字符将名称的主要部分与扩展名分开。 .分隔符永远不会存储在此字段中。
  2. 如果此字段的第一个字节为E5h,则表明目录条目是空闲的(可用)。但是,对于日本使用的字符集,E5h是有效的KANJI前导字节值。对于基于KANJI字符集的名称,值05h存储在此字节中(如果需要)以表示E5h。如果FAT文件系统实现将该字节读取为05h,并且使用的字符集为KANJI,则应在将名称返回给应用程序之前在内存中执行适当的替换。
  3. 如果此字段中的第一个字节为00h,则还指示目录条目是空闲的(可用)。但是,在该字段的第一个字节中设置的00h可以指示当前空闲条目之后的所有目录条目也是空闲的。
  4. 此字段中的第一个字节不能等于20h(换句话说,名称不能以空格字符开头)。
  5. 目录中的所有名称均应唯一。

对包含名称的字符的限制

  • 不允许使用小写字符
  • 名称中字符的非法值如下:
    • 小于20h的值(特殊情况除外,如前所述,此字段的第一个字节为05h)
    • 22h,2Ah,2Bh,2Ch,2Eh,2Fh,3Ah,3Bh,3Ch,3Dh,3Eh,3Fh,5Bh,5Ch,5Dh和7Ch

(BP 11) Attributes

该字段应指定条目的属性。

属性字节的高两位保留,并且在创建文件时应始终设置为0,并且从不对其进行修改或查看。

创建新目录时,文件系统实现应确保以下内容:

  • ATTR_DIRECTORY位应在其属性字段中设置
  • 文件长度字段应设置为0
  • 至少应分配一个群集–“起始群集号低”字段和“起始群集号高”字段的内容应指第一个分配的群集号
  • 如果仅分配了一个簇(集群),则相应的文件分配表条目应指示文件结束条件
  • 分配的簇(集群)的内容应初始化为0
  • 除根目录外,每个目录在目录开头应包含以下两个条目:
    • 第一个目录条目的目录名称应设置为.:该点条目引用当前目录。 应遵循上面针对“属性”字段和“文件长度”字段列出的规则。 由于点条目是指当前目录(包含点条目的目录),因此“起始簇号低”字段和“起始簇号高”字段的内容应与当前目录的内容相同。 所有日期和时间字段应设置为与包含目录的值相同的值。
    • 第二个目录条目的目录名称应设置为..:此点条目是指当前目录的父目录。 应遵循上面针对“属性”字段和“文件长度”字段列出的规则。 由于点号条目是指当前目录的父目录(包含点号条目的目录),因此“起始群集号低”字段和“起始群集号高”字段的内容应与当前目录的父目录相同。 如果当前目录的父目录是根目录,则“起始群集号低”字段和“起始群集号高”字段的内容应设置为0。所有日期和时间字段应设置为与包含目录的值相同的值。

(BP 12) Reserved for NT

该字段应保留。 该字段应设置为0。

(BP 13) Created Time Tenth

该字段应指定文件创建时间的组成部分。 该字段实际上包含十分之一秒的计数。 有效值范围是0-199(含)。 如果不支持此字段,则应在创建文件时将其设置为0,而在其他文件操作中将其忽略。

(BP 14 and 15) Created Time

该字段应指定文件创建时间。 详细格式将在以下部分中介绍。 如果不支持此字段,则应在创建文件时将其设置为0,而在其他文件操作中将其忽略。

(BP 16 and 17) Created Date

该字段应指定文件创建日期。 详细格式将在以下部分中介绍。 如果不支持此字段,则应在创建文件时将其设置为0,而在其他文件操作中将其忽略。

(BP 18 and 19) Last Access Date

该字段应指定最后访问日期。 上次访问定义为对该条目描述的文件/目录执行的读取或写入操作。 该字段应在文件修改(写操作)时更新,并且日期值应等于“记录日期”字段。 详细格式将在以下部分中介绍。 如果不支持此字段,则应在创建文件时将其设置为0,而在其他文件操作中将其忽略。

(BP 20 and 21) Starting Cluster Number High

该字段应为该条目描述的文件/目录指定第一个数据簇号的高位字。

(BP 22 and 23) Time Recorded

该字段应指定最后的修改(写入)时间。 创建文件时,此字段应等于“创建时间”字段。 详细格式将在以下部分中介绍。 所有主机均应支持该字段。

(BP 24 and 25) Date Recorded

该字段应指定最后修改(写入)日期。 创建文件时,此字段应等于“创建日期”字段。 详细格式将在以下部分中介绍。 所有主机均应支持该字段。

(BP 26 and 27) Starting Cluster Number Low

该字段应指定该条目描述的文件/目录的第一个数据簇号的低位字。

(BP 28 to 31) File Length

该字段应指定32位数量,该数量包含此条目描述的文件/目录的字节大小。

日期和时间格式

目录条目中的日期和时间格式如下。

(Date Format)

目录条目中与日期相关的字段的内容应采用以下格式:

  • Bits 0~4 : 代表每月的某天(有效范围:1… 31(含))
  • Bits 5~8 : 代表一年中的月份(1 =一月,12 =十二月,有效范围:1…12(含)
  • Bits 9~15 : 1980年以来的年数(有效范围:0…127(含)允许代表1980年到2107年)

(Time Format)

目录条目时间戳是16位值,粒度为2秒。 目录条目中与时间相关的字段的内容应采用以下格式:

  • Bits 0~4 : 经过的秒数-以2秒为增量(有效范围:0…29(含0…29),允许表示0到58秒)
  • Bits 5~10 : 代表分钟数(有效范围:0…59(含))
  • Bits 11~15 : 代表小时(有效范围:0…23(含))

有效时间范围是从午夜00:00:00到23:59:58。

与FAT12 / FAT16文件目录的区别

FAT32文件系统的文件目录与FAT12 / FAT16文件系统(ISO / IEC 9293)相似,但是存在一些差异。 它们之间的主要区别如下:

  • 对于FAT32,根目录并不位于特殊位置,它的大小可以可变,并且是一个群集链,就像其他目录一样。
  • 添加了目录条目中的以下字段:为NT保留,创建时间十分之一,创建时间,创建日期,最后访问日期和起始簇号高

用户数据区域

用户区应由一些簇(集群)组成。 每个群集分别具有一个群集编号。 用户区域中的第一个群集对应于群集编号2。
尽管可以按扇区进行读/写,但是建议使用最小尺寸与物理层上建议的读/写相同的最小单位进行读/写。 除此之外,SD存储卡文件系统没有特别限制。

LFN长文件名实现

SD存储卡文件系统中的LFN

对于SD记忆卡的所有FAT12 / FAT16 / FAT32文件系统,文件名格式必须支持8.3格式。 此外,主机还可以支持长文件名(LFN)作为可选。 本节介绍“长文件名”格式和用法。

注意:本节中描述的长文件名是可选的。 本节中描述的长文件名规范包括Microsoft FAT规范的某些部分,其版权归Microsoft所有,但已获得SD卡协会的许可。

FAT长目录条目

目录条目中的“名称和名称扩展名”字段仅允许包含11个字符的文件/子目录名称,该文件名由主体部分(最大长度为8个字符)和扩展名(最大长度为3个字符)组成。该字段的内容也称为“短名称”,相应的目录条目也称为短名称目录条目。应用程序和用户通常更喜欢为文件/子目录创建更长的名称(更具描述性)。本节介绍如何在媒体上存储如此长的文件名。
目标文件或子目录的长文件名存储在一组(一个或多个)附加目录条目中,这些附加目录条目与描述目标文件或子目录的简称目录条目相关联。这组附加目录条目(也称为长名称目录条目)应紧接在相应的短名称目录条目之前,因此在物理上与短名称目录条目相邻。

注意:长名称目录条目的顺序以相反的顺序存储(该集中的最后一个条目先存储,然后是条目n-1,然后是条目n-2,依此类推,直到条目1)。

下表描述了长名称目录条目结构:

下面说明了名称目录条目的存储时间:

在磁盘上的表现是这样的:

序数生成

在一组这样的条目(与短名称目录条目相关联)中存储每个长名称目录条目的序号时,应遵循以下规则:

  • 集合的第一个成员的LDIR_Ord值为1。
  • 每个后续条目的LDIR_Ord值应包含一个单调递增的值。
  • 集合的第N个(最后一个)成员应包含值(N | LAST_LONG_ENTRY)

如果长名称目录条目集的任何成员不遵循上述规则,则该集被视为已损坏。

校验和生成

在创建短名称目录条目和长名称目录条目时,将对包含在短名称目录条目中的名称计算一个8位校验和。 短名称条目中名称的所有11个字符都将用于校验和计算。 校验和放置在LDIR_Chksum字段中的每个长名称目录条目中。 如果与适当的短名称目录条目相关联的长名称条目集合中的任何校验和与短名称目录条目中包含的名称的计算出的校验和不一致,则认为长名称目录条目集合已损坏 。

以下算法描述了用于生成校验和值的逻辑:

示例说明长名称的持久性

提供以下示例,以说明如何在多个长名称目录条目中存储长名称。 名称也以NULL终止,并用FFFFh字符填充,以检测长名称字段的损坏。 完全适合一组长名称目录条目的名称(即13的整数倍)不是NULL终止的,也不用FFFFh填充。

名称:“ The quick brown.fox”

长文件名的名称限制和字符集

长文件名限制为255个字符,不包括结尾的NULL。 这些字符可以是为短文件名定义的字符的任何组合,并加上在长名中多次使用的句点(“。”)字符。 空格也是长文件名中的有效字符,因为它始终是短文件名。 长文件名允许以下六个特殊字符(短文件名不合法):+ , ; = [ ]

允许在长文件名中包含嵌入式空格。 长文件名中的前导和尾随空格将被忽略。

名称中允许前导和嵌入句点,并存储在长文件名中。 尾随时间段将被忽略。

长文件名存储在UNICODE的长目录条目中。 UNICODE字符是16位字符。 不能将UNICODE存储在短名称目录条目中,因为其中存储的名称是8位字符或DBCS字符。

传递给文件系统的长文件名不会转换为大写,并且会保留其原始大小写值。 UNICODE通过始终将小写字符转换为单个唯一的大写字符来解决某些OEM代码页中普遍存在的大小写映射问题。

规则的名称创建和匹配

所有长文件名和短文件名的并集定义为卷中包含的对象的名称空间。

对于这样的名称空间,应遵守以下规则:

  • 特定目录中的任何名称,无论是短名称还是长名称,都只能出现一次(以区别形式出现,如果忽略,则这些名称应视为冲突)。
  • 当媒体上的字符(无论是存储在OEM字符集还是UNICODE中)不能转换为OEM或ANSI代码页中的适当字符时,总是将其转换为“ _”(下划线)字符-该字符为 媒体上未修改。 在所有OEM代码页和ANSI中,“ _”字符均相同。

FAT32 文件系统在磁盘上的结构相关推荐

  1. EXT4 之 文件系统在磁盘上的布局 之一

    前言 术语 综述 块Blocks 布局 可调整的block groupFlexible Block Group 元组块Meta Block Groups block group推迟初始化 特殊的ino ...

  2. fat32文件系统的实现与buddy算法

    报告一    FAT32文件系统的实现 文件系统(File System)是计算机系统必不可少的组成部分,可以说除了部分结构简单的单片机系统之外,文件系统是支撑每一个计算机系统运行的最重要的支撑,无论 ...

  3. 基于ATmega32的SD卡上FAT32文件系统数据读取

    SD卡(secure digital memory card,安全数码卡)是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机.个人数码助理(PDA)和多媒体播放器等 ...

  4. 文件系统(文件系统目录结构、磁盘分区、虚拟文件系统)、linux内核结构框图

    什么是文件系统? 常规认知就是根目录下那些文件,但其实并不是那样.文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构:即在存储设备 ...

  5. 文件系统(内存上的 + 磁盘上的)

    基础I/O 文章目录 基础I/O 0 . 预备 0.1 C语言接口 0.2 系统接口 1 . 文件描述符 (fd) 1.1 fd的分配规则 重定向 2. 一切皆文件 3. 缓冲区 4. 没有被打开的文 ...

  6. 文件系统,你有想过怎么访问磁盘上存储的数据吗

    文件系统示意图: 可以看到,这种数据结构是基于数组和链表的组合,是典型的树形结构. 想要加载某个存在于磁盘上的文件,比如想查找[G:\pic\学习截图\文件系统示意图.png],文件系统查找应用就会以 ...

  7. linux如何改磁盘文件系统名,如何在Ubuntu上设置文件系统(磁盘)配额

    文件系统配额是Linux内核中的标准内置函数. 配额确定文件支持用户活动必须具有的空间量. 磁盘配额还限制了用户可以在系统上创建的文件数量. 支持配额系统的文件系统包括xfs,ext2,ext4和ex ...

  8. SD卡FAT32文件系统格式

    一.声明 1.本文来源和主旨 2.本文测试环境 二.SD卡FAT文件系统 1.SD卡FAT32文件系统的整体布局 2.FAT文件系统简介 ① 文件分配表 ② 目录项 三.DBR(DOS BOOT RE ...

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

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

最新文章

  1. 深入ASP.NET数据绑定(上)
  2. SQL基础操作_3_数据字典(涵盖SQL Server、Oracle、Mysql常见系统数据字典)
  3. IDEA 运行键是灰色
  4. 面试者为何从来得不到反馈?
  5. 井字棋小游戏c语言简单编码,C语言实现井字棋小游戏
  6. 多模态中预训练的演变史
  7. 二叉树非递归遍历思路总结
  8. Qt设置QPushButton文字加图片
  9. 第二章-用户需求分析
  10. 电商后台管理系统订单列表模块
  11. 玩安卓从 0 到 1 之列表一键置顶
  12. 进程管理程序 - Supervisor - 学习/实践
  13. arcgis api js调用天地图
  14. 在游戏上第3部分完美的信息游戏
  15. W ndoWs电脑上的线怎么接,Windows7系统下如何连接网络
  16. Android自定义优惠券解析
  17. java之面向对象:继承extends、super、覆盖override的用法
  18. Java--创建窗口和程序片
  19. ActiveX控件不能示例解决方法
  20. 微信官方小程序基础教程 - 代码构成

热门文章

  1. RTP协议封装H264/H265/AAC
  2. 2021年中国光伏发电产业运行现状及未来发展趋势分析[图]
  3. 赵本山小品之跟紧急集合似的铃声 赵本山小品之跟紧急集合似的...
  4. centOS6使用NAT方式联网
  5. 计算机的桌面图标都没有了怎么办,电脑桌面图标都没了怎么办?
  6. BeautfulSoup详解
  7. 梦幻西游手游版找不到服务器,梦幻西游手游无法选择服务器怎么办 解决方法...
  8. PostgreSQL 14及更高版本改进
  9. Iure veniam nam impedit.
  10. 天天996,试用期4个月,被公司劝退!开发者太糟心了!