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 各部分位置的计算 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
|