FAT32文件系统实现原理中,有哪些细节决定了其高效与可靠性?

摘要:FAT32是从FAT12、FAT16发展而来,目前主要应用在移动存储设备中,比如SD卡、TF卡。隐藏的FAT文件系统现在也有被大量使用在UEFI启动分区中。 为使文章简单易读,下面内容特意隐藏了很多实现细节,关于分区、格式化等相关的内容,可
FAT32是从FAT12、FAT16发展而来,目前主要应用在移动存储设备中,比如SD卡、TF卡。隐藏的FAT文件系统现在也有被大量使用在UEFI启动分区中。 为使文章简单易读,下面内容特意隐藏了很多实现细节,关于分区、格式化等相关的内容,可以查看之前的文章: 文件系统(一):存储介质、原理与架构 文件系统(二):分区、格式化数据结构 文件系统(三):嵌入式、计算机系统启动流程与步骤 (一)FAT32 磁盘布局 拿一个FAT32文件系统的存储设备,我们可以看到,它整个存储设备大概可以分为5个部分:引导、保留扇区、FAT表、目录和文件、备份。 (1)引导与保留扇区 引导和保留扇区部分,会因为分区方式的不同(MBR与GPT)而不同,同时也会因为存储设备分区个数的不同也会有差异。 下面这个是使用GPT方式将存储设备分为1个分区并格式化为FAT32文件系统格式的数据分布示意图。 (2)备份 在磁盘末尾的备份区域,主要是使用GPT方式分区的时候,会将分区表信息备份到存储设备的最后区域。对于MBR分区方式,并没有这部分。 (3)FAT表与目录项 在FAT32文件系统的使用过程中,FAT表和目录项是其核心部分,将在下面介绍 (二)文件在哪里? 将一个存储设备格式化成FAT32格式文件系统,然后再在上面创建几个文件夹和文件,那么这些文件和文件夹的名字信息是存储在什么位置?文件里面的数据又是存储在哪?要怎样才能找到这些文件? 上面在一个TF卡中创建了test1、test2、test3、test4 四个文件夹和一个0000.media媒体文件。 System Volume Information目录及其下面的文件是在Windows系统格式化的时候系统写入的系统文件。 目录项 FAT表后面的区域,是根目录的存储区域,目录和文件以及文件中的实际数据都存储在这个一个大的区域。根目录是在该区域最开始的位置。 从根文件所在扇区的数据我们可以看到根目录的目录项信息: 从WinHex工具上,根目录所在位置的还有4个“新建文件夹”项。这个是因为在Windows创建文件夹的时候,开始的名字是“新建文件夹”,后面被我重命名成了test1~4 目录项分为长文件名和短文件名 如果一个文件它的名字大于11个字节,那它就至少有两个目录项,一个短文件名项和一个长文件名项。 文件名长度小于等于11个字节的话,就只有一个短文件名项。短文件名目录项长度为32个字节,各字节的定义如下: 根据上面定义可以对根目录下的目录项进行解析: 以test2目录项举例,我们可以看到: 文件名为test2 (短文件名) 文件属性为10(子目录 ) 这里时间需要转换,2字节用不同的位表示年月日和时分秒 起始簇号为07号 如果目录项是以E5开头,那表示该项是无效的或是已经删除了的目录项,比如上面的四个"新建文件夹"目录项 通过目录项,我们可以知道存储设备上都有哪些文件和目录,相应的子目录也是一样的实现,只不过子目录下面的目录项是在子目录所在的簇中记录。 (三)文件磁盘空间分配 在FAT32文件系统中,它是以簇为单位进行空间分配和管理。一般一个簇的大小为4KB(下面均以4KB做参考)。 一个文件或是一个目录,它是通过目录项知道它在存储设备上存放的的开始位置,也就是开始簇号,而簇号信息,是存储在FAT表上, 一个FAT32文件系统有两个FAT表,一个正常使用,另外一个为备份FAT表 通过分区上的DBR和FSINFO信息可以知道FAT表的大小和所在位置等信息。 FAT32 是以32位(4Byte)来定义一个FAT表项,也就是一个簇的状态,下表是FAT表项中值的含义: 对于FAT表,第0号簇是固定的0x0FFFFFF8,第1号簇项0xFFFFFFFF是被系统使用 第3号簇是根目录的开始簇,如果其值是0x0FFFFFFF,表示根目录只占用一个簇的空间,也就是4KB大小空间,如果其值是0x00000002~0x0FFFFFFE,表示根目录的下一个簇号,直到出现文件结束簇0x0FFFFFFF,也就是根目录大于4KB的大小。 下面是对FAT表现的一个解析。
阅读全文