如何在FAT文件系统中计算FAT大小

时间:2016-05-14 12:27:20

标签: c fat32 fat

我在C中实现FAT文件系统。我遵循microsoft发布的规范(http://read.pudn.com/downloads77/ebook/294884/FAT32%20Spec%20%28SDA%20Contribution%29.pdf

但我不明白如何计算启动扇区的FAT大小字段。在规范文档中,第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 */ 
}

从这段代码我不明白

  1. 什么是TmpVal2?
  2. 为什么使用256号?
  3. 为什么如果它是FAT32除以2?

1 个答案:

答案 0 :(得分:2)

我不确定为什么会选择256的常数,但是这里有一些关于你的其他问题的想法。

源代码段下方有一条注释,表示数学是近似值。

  

注意:上述数学运算不能很好地完成。它偶尔会设定   一个FATSz,最多2个扇区对于FAT16来说太大了,偶尔也会   FAT32最多8个扇区。它永远不会计算FATSz   然而,价值太小了。因为有一个FATSz是可以的   事实上,这是太大了,以牺牲一些部门为代价   这个计算非常简单,而不是弥补它   在某些情况下以安全的方式离开。

我读取代码的方式是计算FAT16大小,然后如果目标实际上是FAT32则调整计算。

变量TmpVal2的值看起来是单位大小,因为为TmpVal1的值计算的空间量除以单位大小值TmpVal2 in以确定磁盘空间的单位数。但是在FAT32的情况下,单位尺寸小于FAT16,因此需要进行调整。

似乎FAT16使用特定大小的文件分配表,并且随着磁盘技术的改进,卷可用的硬盘空间增加,群集大小基于卷大小。因此,对于较小的卷大小,群集大小(分配单元中的磁盘扇区数)小于大卷大小的群集大小。请参阅您引用的文档的第13页上的FAT16 vs. FAT32 in Microsoft TechNet以及源代码中的表。

使用FAT32时,使用4K的标准群集大小,文件分配表存储从固定大小更改为可变大小,不再位于磁盘上的固定位置。

此artice File systems (FAT, FAT8, FAT16, FAT32, and NTFS) explained详细介绍了这些不同文件系统版本之间的差异。

维基百科的文章File Allocation Table提供了大量技术信息,并附有其他文章的链接。

您还可以找到以下有关的stackoverflow文章。

Converting the cluster number stored in FAT table (of FAT12 filesystem) for reading from a floppy disk

Why did Windows use the FAT structure instead of a conventional linked list with a next pointer for each data block of a file?