继续接上文的FDT分析
FAT表项由FAT1和FAT2组成。
FAT1表位置的定位:
在我们前面介绍分区引导记录的时候提到,在偏移0EH处存储了保留扇区的个数,这个保留扇区数指的就是当前分区内DBR到FAT表之间的所有扇区的个数(包括DBR但不包括FAT表)。
FAT2表位置的定位:
在我们前面介绍分区引导记录的时候提到,在偏移24H处存储了FAT表所占用的扇区个数,我们又知道FAT2是紧邻FAT1的,所以可以很容易得到FAT2的存储位置的偏移地址。
FAT表的特性:
FAT表由一系列大小相等的FAT表项组成,它有如下特性: FAT表项由0和1号簇组成,FAT表项的成员都是以4字节为对齐单位,其中FAT表项中0和1号地址被系统保留以存储特殊标记内容,从2号开始(对应数据区的簇号)存储数据区每簇的信息,这些信息分为四个
1,、如果某个簇未被分配使用,它所对应的FAT表项内的FAT表项值即用0进行填充,表示该FAT表项所对应的簇未分配使用。
2、当某个簇已被分配使用时,则它对应的FAT表项值也就是该文件的下一个存储位置的簇号。
3、如果该文件结束于该簇,则在它的FAT表项中记录的是一个文件结束标记EOF,对于FAT32而言,代表文件结束的FAT表项值为0x0FFFFFFF。
4、如果某个簇存在坏扇区,则整个簇会用FAT表项值0x0FFFFFF7标记为坏簇,不再使用,这个坏簇标记就记录在它所对应的FAT表项中。
三、数据区
这里我把根目录区也放在这里了。
当文件系统被创建,也就是进行格式化操作时,分配给FAT区域的空间将会被清空,在FAT1与FAT2的0号表项与1号表项写入特定值。由于创建文件系统的同时也会创建根目录,也就是为根目录分配了一个簇空间,通常为2号簇,所以2号簇所对应的2号FAT表项也会被写入一个结束标记。
每个目录对应一个簇号,每个簇里存储的可以是文件目录,也可以是目录目录。
目录目录里的簇地址就是目录地址,或者文件地址,有点绕吧,呵呵,
其实数据区真没什么好说的,到此为止差不多了,接下来就是分析FAT32源码了,其实难也不难,关键在于恒心,将到此大概知道我意思了吧,源码还是自己去分析,呵呵!不多说了,看源码去了!
再补充一点关于文件和目录的存储
struct direntry
{
UINT8 deName[8]; // 文件名,不足部分以空格补充
UINT8 deExtension[3]; // 扩展名,不足部分以空格补充
UINT8 deAttributes; // 文件属性
UINT8 deLowerCase; // 0
UINT8 deCHundredth; // 世纪
UINT8 deCTime[2]; // 创建时间
UINT8 deCDate[2]; // 创建日期
UINT8 deADate[2]; // 访问日期
UINT8 deHighClust[2]; // 开始簇的高字
UINT8 deMTime[2]; // 最近的修改时间
UINT8 deMDate[2]; // 最近的修改日期
UINT8 deLowCluster[2]; // 开始簇的低字
UINT8 deFileSize[4]; // 文件大小
};
簇里存放文件的数据或者文件,或者目录。OK
四、源码分析完毕,不要小看源码少,还是有点小难度的!