【问题标题】:FAT12/FAT16 - what determines the sector counts? [closed]FAT12/FAT16 - 什么决定了扇区数? [关闭]
【发布时间】:2011-11-18 03:36:48
【问题描述】:

目前我正在阅读 Ramdisk 源代码。在 RamDiskFormatDisk 函数中,我遇到了问题。

一段代码如下:

if (fatEntries > 4087) {
    fatType =  16;
    fatSectorCnt = (fatEntries * 2 + 511) / 512;
    fatEntries   = fatEntries + fatSectorCnt;
    fatSectorCnt = (fatEntries * 2 + 511) / 512;
}
else {
    fatType =  12;
    fatSectorCnt = (((fatEntries * 3 + 1) / 2) + 511) / 512;
    fatEntries   = fatEntries + fatSectorCnt;
    fatSectorCnt = (((fatEntries * 3 + 1) / 2) + 511) / 512;
}

你能解释一下它对我的意义吗?

【问题讨论】:

  • 您在哪一部分遇到了问题?
  • 方程式。为什么 fatSectorCnt 应该这样计算?
  • 这个常数4087是来自FAT12格式的限制。 FAT12 不能有超过 4K 条目的 FAT 表。这个数字是 2^12 减去 FAT12 本身的服务数据的几个条目。这是因为 FAT12 中的簇具有 12 位数字。
  • 我知道常数限制。我的意思是,算法,为什么要乘以 2 或 3 并进行其他计算
  • (x+511)/512 表示“除以 512,向上取整. Similarly with (x+1)/2”。 C 中的整数除法总是截断(丢弃小数点后的任何内容)。我不熟悉 FAT,所以我不知道 *2 和 *3,但似乎每个条目有两个扇区。

标签: c ramdisk fat


【解决方案1】:

只需向上滚动几行:http://jcomeau.unternet.net/src/ramdisk/RAMDISK.C

就在引用代码之前,有一个 fatEntries 和注释的计算:

//
// Calculate number of sectors required for FAT
//
fatEntries =
    (bootSector->bsSectors - bootSector->bsResSectors -
        bootSector->bsRootDirEnts / DIR_ENTRIES_PER_SECTOR) /
            bootSector->bsSecPerClus + 2;

//
// Choose between 12 and 16 bit FAT based on number of clusters we
// need to map
//

而这个函数是RamDiskFormatDisk

此例程格式化新磁盘。

因此,根据此函数的(间接)输入中的 RAM 磁盘大小,它将计算 RAMdisk 中有多少扇区(扇区 = 512 字节),然后 - 需要多大的 FAT 表(FatEntries ) 来描述所有部门。 FAT 表中的每个条目描述一个单独的簇,默认值为 2 个扇区 = 1 个簇。

如果簇数较少,小FAT表会更好,磁盘格式会选择FAT12。如果 RAM 盘的簇不能用 FAT12 中使用的那么短的 FAT 表来描述;函数将选择 FAT32。

实际限制:http://en.wikipedia.org/wiki/File_Allocation_Table

FAT12 - 最多 4084 个簇 (2^12‑12); 32 MB,最大的集群。

FAT16 - 最多 65524 个簇 (2^16‑12);最大集群可达 2 GB

因此,FAT12 适用于软盘或几 MB ram 磁盘; FAT16 可以在最大 GB 的任何大小的 ramdisk 上工作。

【讨论】:

  • 是的,因为通常不欢迎提出过于简单的问题,例如“什么是代码 (x+511) / 512 以及为什么”。推荐链接是stackoverflow.com/faq#close
猜你喜欢
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 2014-08-03
相关资源
最近更新 更多