FAT(文件分配表)文件系统是Windows操作系统所使用的一种文件系统,它的发展过程经历了FAT12 FAT16 FAT32三个阶段。
FAT文件系统
FAT文件系统用“簇”作为数据单元,一个“簇”由一组连续的扇区组成,簇所含的扇区数必须是2的整数次幂。簇的最大值为64个扇区,即32KB。所有簇从2开始进行编号,每个簇都有一个自己的地址编号。用户文件和目录都存储在簇中。FAT文件系统的数据结构中有两个重要的结构:文件分配表和目录项。
文件和文件夹内容存储在簇中,如果一个文件或文件夹需要多余一个簇的空间,则用FAT表来描述如何找到另外的簇。FAT结构用于指出文件的下一个簇,同时也说明了簇的分配状态,FAT12 FAT16 FAT32这三种文件系统之间的主要区别在于与FAT项的大小不同。
FAT文件系统的每一个文件和文件夹都被分配到一个目录项,目录项中记录中文件名,大小,文件内容起始地址以及其他一些元数据。
在FAT文件系统中,文件系统的数据记录在“引导扇区中(DBR)”中,引导扇区位于整个文件系统的0号扇区,是文件系统隐藏区域(也称为保留区)的一部分,我们称其为DBR(DOS引导记录)扇区,DBR中记录着文件系统的起始位置,大小,FAT表个数以及大小等相关信息。在FAT文件系统中,同时使用“扇区地址”和“簇地址”两种地址管理方式,这是因为只有存储用户数据的数据区使用簇进行管理(FAT12 FAT16的根目录除外),所有簇都位于数据区,其他文件系统管理数据区域是不以簇进行管理的,这部分区域使用扇区地址进行管理。文件系统的起始扇区为0号扇区。
接下来在桌面上新建一个文件1.txt,将其拖入逻辑分区J(PS:不要在磁盘内右击新建,而是应该在桌面新建再拉进去)
目的:找到分区4(fat32分区)的FAT1,2的起始扇区的位置和数据区的起始位置
回顾上一期的内容
1. 保留区含有一个重要的数据结构-------系统引导扇区(DBR)。FAT12 FAT16的保留区通常只有一个扇区,而FAT32D 保留区要多一些,除0号扇区外,还有其他一些扇区,其中包括了DBR的备份扇区。
2. FAT区由来是各个大小相等的FAT表组成-----FAT1 FAT2,FAT2紧跟在FAT1之后。
3. FAT12 FAT16的根目录虽然也属于数据区,但是他们并不由簇进行管理,也就是说FAT12 FAT16的根目录使没有簇号的,他们的2号簇从根目录之后开始。而FAT32的根目录通常位于2号簇。
FAT32的保留扇区数,比较常见的为32 34 38扇区
数据区起始扇区号即是根目录扇区号
以上扇区均可在Winhex中直接点击分区内的各区域位置,但是此时下面对应的扇区均为相对偏移地址,在硬盘外查看要加上当前分区DBR的偏移地址
于是第一个FAT表起始位置=352256+0026h=352294
第二个FAT表起始位置=352294+000001C9h=352751
可以看出FAT2和FAT1完全一样
因为FAT表很重要,于是微软为它做了备份FAT2
数据区起始位置=352751+000001C9h=353208
可以看到1 TXT文件名字样,这边属于数据区的根目录区
多向下滑几面,可以看到1.txt的文本内容
保留扇区中DBR的下一个扇区是FSINFO扇区
在签名标志“rrAa”后
1E8-1EB是表示空闲簇数
1EC-1EF是表示下个可用簇号
FAT表
FAT表中文名称是文件分配表,其作用是指向文件存储位置,接下来介绍它的结构
对于FAT32来说每4个字节算一个表项,其中:
0号表项,0x0F8FFFF0F是FAT表起始固定标识;
1号表项,0x0FFFFFFFF,系统默认占用,不使用,默认值;
2号表项,0x0FFFFFF0F,标识文件结束,表项对应2号簇,根目录所在簇。
每一个文件均存放在簇里
1)如果某个簇未被分配使用,它所对应的FAT表项内的FAT表项值即用0进行填充,表示该FAT表项所对应的簇未被分配。
2)当某个簇已被分配使用时,则它对应的FAT表项内的FAT表项值也就是该文件的下一个存储位置的簇号,如果该文件结束与该簇,则在它的FAT表项中记录的是一个文件结束标志,对于FAT32而言,代表文件结束的FAT表项值为0x0FFFFFFFF。
3)由于簇号起始于2号,所以FAT表项的0号表项与1号表项不与任何簇对应。FAT32的0号表项值总是“F8FFFF0F”
4)1号表项可能被用于记录脏标志,以说明文件系统没有被正常卸载或者磁盘表面存在错误。不过这个值并不重要。正常情况下1号表项的值为“FFFFFFFF”或者“FFFFFF0F”。
5)如果某个簇存在坏扇区,则整个簇会用FAT表项值0xFFFFFFF7标记为坏簇,不再使用,这个坏簇标记就记录在它所对应的FAT表项中。
6)在文件系统中新建文件时,如果新建的文件值占用一个簇,为其分配的簇对应的FAT表项中将会写入结束标记。如果新建的文件不止占用一个簇,则在其所占用的每个簇对应的FAT表项中写入为其分配的下一簇的簇号,在最后一个簇对应的FAT表项中写入结束标记。
7)新建目录时,只为其分配一个簇的空间,对应的FAT表项中写入结束标记。当目录增大超过一个簇的大小是,将会在空闲空间中为其分配一个簇,并在FAT表中为其建立FAT表链以描述它所占用簇情况。
8)对文件或目录进项操作时,它们所对应FAT表项将会被清空,设置为0以表示其所对应的簇处于未分配状态。
FAT表另一个作用是声明当前簇是否被占用,因为文件存储过程是在找未使用的簇,然后又填入(对于较大的文件,如果是找连续的簇空间存放,则之前那些未使用的簇将会被浪费掉),删除文件后根目录的文件名首字节会用E5标志替代表示该文件扇区,如果再往该文件所在簇空间写入数据,亦即被删除文件的数据没有被覆盖掉,被删除文件就可以恢复过来。
目录项
目录项中每两行划分为一个文件单位,
1)在第一行中,0到7字节是文件名,其中,对于短文件名(不超过8字节)而言,未用完的字节用0x20填充;对于长文件名而言,它在目录项只能显示6个字节,后面两个字节用“~1”进行系统填充,表示其为长文件名。
2)8 9 10字节是文件后缀名,只用三个字节存,这也就是为什么绝大多数文件后缀名均只有3个字节,如果文件后缀名超过三个字节,它在此处也只显示前三个字节的内容。
3)第11(B)字节是代表文件属性,这边有个有趣的属性标记方式,若此处字节为03,则文件属性为只读且隐藏(采用加法)。
4)13(D)字节是文件创建时间的10毫秒位
5)14(0xE) 15(0xF)是文件创建时间 0x10 0x11是文件创建日期,0x16 0x17是最近文件修改时间 0x18 0x19是最近文件修改日期
如何查看时间呢?可以点击Winhex的选项中的数据解释器,将**DOS Date+Time(32bit)**后面勾上。就可以通过选中在数据解释器可以看到时间。
6)0x14 0x15是文件起始簇号的高16位,0x1A 0x1B是文件起始簇号的低16位
文件起始簇号=低16位的数值+(高16位的数字65536(0x10000)),通常高16位为00 00
7)0x1C 到0x1F是文件的大小(长度),单位是字节(Byte=8bits),但是对于文件夹而言,此处均是00 00 00 00(错误的数据);同时,4个字节的存放位置决定了文件大小的上限为FF FF FF FF字节=4GB-1