我正在用C实现一个FAT文件系统,我遵循微软(http://read.pudn.com/downloads77/ebook/294884/FAT32%20Spec%20%28SDA%20Contribution%29.pdf)发布的规范
但我不明白如何计算引导扇区的脂肪大小字段。在规范文档中,以下代码出现在第14页。
RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec – 1)) / BPB_BytsPerSec;
TmpVal1 = DskSize – (BPB_ResvdSecCnt + RootDirSectors);
TmpVal2 = (256 * BPB_SecPerClus) + BPB_NumFATs;
If(FATType == FAT32)
TmpVal2 = TmpVal2 / 2;
FATSz = (TMPVal1 + (TmpVal2 – 1)) / TmpVal2;
If(FATType == FAT32) {
BPB_FATSz16 = 0;
BPB_FATSz32 = FATSz;
} else {
BPB_FATSz16 = LOWORD(FATSz);
/* there is no BPB_FATSz32 in a FAT16 BPB */
}从这段代码中我不明白
发布于 2016-05-14 13:06:10
我不知道为什么选择256这个常数,但是这里有一些关于你其他问题的想法。
源代码段下面有一个注释,说明数学是近似的。
注意:上面的数学并不完美。它偶尔会设置一个FATSz,这个扇区对FAT16来说是最大的2个扇区,有时对FAT32来说是8个太大的扇区。然而,它永远不会计算太小的FATSz值。因为拥有一个太大的FATSz是可以的,而以浪费几个扇区为代价,在某些情况下,这种计算比以一种安全的方式关闭它要简单得多。
我阅读代码的方式是,计算是针对FAT16大小的,如果目标实际上是FAT32,则对计算进行调整。
变量TmpVal2的值看起来是一个单位大小,因为为TmpVal1值计算的空间量然后除以TmpVal2的单位大小值,以确定磁盘空间的单位数量。但是,在FAT32的情况下,单元大小小于FAT16,因此需要进行调整。
FAT16似乎为文件分配表使用了特定的大小,并且随着磁盘技术的改进,卷可用的硬盘空间也随之增加,因此群集大小是基于卷大小的。因此,对于较小的卷大小,集群大小,分配单元中的磁盘扇区的数量,比大卷大小时的集群大小要小。请参阅微软FAT16对FAT32的TechNet以及您引用的文档第13页源代码中的表。
对于FAT32,使用标准集群大小为4K,文件分配表存储从固定大小更改为可变大小,并且不再位于磁盘上的固定位置。
本文讨论的是解释了文件系统(FAT、FAT8、FAT16、FAT32和NTFS),详细介绍了这些不同的文件系统版本之间的差异。
维基百科的文章,文件分配表,有相当多的技术信息与其他文章的链接。
您可能还会发现下面的堆栈溢出项目感兴趣。
https://stackoverflow.com/questions/37226654
复制相似问题