首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算FAT文件系统中的FAT大小

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

Stack Overflow用户
提问于 2016-05-14 12:27:20
回答 1查看 3K关注 0票数 0

我正在用C实现一个FAT文件系统,我遵循微软(http://read.pudn.com/downloads77/ebook/294884/FAT32%20Spec%20%28SDA%20Contribution%29.pdf)发布的规范

但我不明白如何计算引导扇区的脂肪大小字段。在规范文档中,以下代码出现在第14页。

代码语言:javascript
复制
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?
EN

回答 1

Stack Overflow用户

发布于 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),详细介绍了这些不同的文件系统版本之间的差异。

维基百科的文章,文件分配表,有相当多的技术信息与其他文章的链接。

您可能还会发现下面的堆栈溢出项目感兴趣。

转换存储在FAT表( FAT12文件系统)中的群集号,以便从软盘读取

为什么Windows使用FAT结构而不是为文件的每个数据块使用带有下一个指针的常规链接列表?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37226654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档