FAT文件系统总结(二)

 

 关于 FAT 启动扇区还有一点重要的说明,我们假设里面的内容是按字节排序的,那么扇区[510]的内容一定 0x55,扇区[511]的内容一定是 0xAA很多 FAT 资数文档会把 0xAA55 说成是“启动扇区最后两字节的内容”,这样的说法是正 确的,但仅仅适用于 BPB_BytsPerSec 值为 512 的情况。若 BPB_BytsSec 的值大于 512,该标记的位置并没有改变,虽然在启动扇区的最后两个字节写 0xAA55 并没有问题。 

五、 FAT 类型识别
 
FAT 的字类型(FAT12/16/32)只能通过 FAT 卷中的簇(Cluster)数来判定,没有其 他的办法。
 
Cluster 总数的计算:RootDirSectors = (BPB_RootEntCnt*32) /BPB_BytsPerSec DataSect = TotSec – (BPB_RsvdSecCnt +(BPB_NumFATs * FATSz) + RootDirSectors) CountofClusters = DataSec / BPB_SecPerClus
 
If(CountofClusters < 4085) { /*卷类型是 FAT12 */
} else if(CountofClusters < 65525) { /* 卷类型是 FAT16 */
} else { 
/* 卷类型是 FAT32 */ 
}
 
注意这里的簇数(count of Cluster)是指数据区所占簇的数量(the count of the data cluster),从簇 2 算起,而“最大可用簇数”(Maximun valid cluster number for the volume)是 CountofClusters +1,“包括保留簇的簇数”(count of cluster including the two reserved cluster)则为CountofClusters +2。根目录占据的 Sector 数:RootDirSectors = (BPB_RootEntCnt*32) /BPB_BytsPerSec   数据区(Cluster 2)的起始 Sector: FirstDataSector = BPB_EsvdSecCnt  +    (BPB_NumFATs * FATSz)   +     RootDirSectors    给一个合法的簇号 N,该簇的第一个扇区号由下式计算:FirstSectorofCluster =((N -2) * BPB_SecPerClust) + FirstDataSecot; 因为 BPB_SecPerClus 总是 2 的整数次方,这意味着 BPB_SecPerSlus 的乘法运算可 以通过移动来进行。 
 
NOTE里所 Sector 号,指的是针对卷中包 BPB 的第一个扇区(DBR)的偏移量(DBR设为Sector 0)。

六、 FAT 各部分位置的计算
FAT文件系统总结(二)
DBR_Base:从DPT中偏移8Bytes的地址读取4Bytes数据就可以直接看作是DBR所在的 Sector。RsvSectors = BPB_RsvdSecCnt。 FAT_Base = DBR_Base + RsvSectors FATSize = BPB_NumFATs * FATSz  其中,FATSz = (FAT32?) BPB_FATSz32 : BPB_FATSz16 Root_Base:如果是FAT12/FAT16,则Root_Base = FAT_Base + FATSize   如果是FAT32,则Root_Base = BPB_RootClus RootSize :如果是FAT32,则没有限制;否则RootSize = (BPB_RootEntCnt*32) / BPB_BytsPerSec Data_Base:仅对于FAT12/FAT16,Data_Base = Root_Base + RootSize
 
本站域名:www.mrtlab.com | QQ交流群:250649022 | 使用条款 | 备案:鄂ICP备2020023514号
MRT数据恢复网,专业的硬盘固件维修与数据恢复技术资料提供站!
Copyright 2003-2020 Powered By MrtLab