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表现的一个解析。
