每次尝试发现这一点都只能产生大量有关驱动器几何形状和最大卷大小的信息。

另外,如果需要额外的 FAT(对其进行碎片化),额外的范围有多大?

我想知道,这样我就可以考虑将 FAT 缓存在 640K 中。

12

  • 3
    这将取决于硬盘的大小、扇区大小以及您如何将其分区为逻辑卷、使用哪种文件系统和簇大小。这决定了驱动器上的簇数量和 FAT 的大小(以某些单位为单位)。如果您能给出一个典型的数字,那么就会有一个典型的答案。初始大小是卷所需的大小,因为它的大小是固定的,所以它永远不会增长。


    – 


  • 1
    不,我没有考虑簇大小。有时大型硬盘被模拟为 DOS,其扇区数量是原始扇区的四分之一,大小是原始扇区的四倍。这种情况很少见,但有可能。无论如何,如果我们假设簇大小与扇区无关,扇区大小可能无关紧要。好的,那么 ST220 有多大?


    – 

  • 1
    “顺便说一句,文件分配表可以扩展(添加),但这需要将其分成两个区段。” 胡说,单个 FAT 始终是连续的。即使不删除所有包含的数据,也可以扩大文件系统或更改其格式,因此 FAT 可以“扩展”。但最终结果始终是连续的 FAT,因为没有驱动程序支持将 FAT 分成两个或更多区段。


    – 

  • 2
    粗略浏览一下 FAT 布局的描述,就会发现它必须是连续的。没有规定如何定位进一步不连续的范围。


    – 


  • 2
    是的, /fileio/… – 当然,MFT 所需的大小取决于文件数量,而不是磁盘簇的数量(尽管显然两者通常是相关的)


    – 



最佳答案
2

刚刚在带有 DOS 3.30 和默认 47MB 硬盘的网页模拟器上进行了尝试。

由于 DOS 3.30 仅支持使用 FDISK 进行最大 32MB 的分区,因此可以在扩展分区中将其划分为 32MB 的 C:驱动器和大约 15MB 的 D:驱动器。

格式化时没有特殊参数,C: 使用 512 字节扇区,每个簇 4 个扇区,簇大小为 2KB。通过使用 echo 创建 3 字节文件并使用 CHKDSK 进行验证,发现它占用 2048 字节。有两个 FAT 副本。磁盘上的总扇区数为 65467。每个 FAT 有 64 个扇区。因此大约有 16366 个簇,这意味着一个 FAT16 系统。每个簇在 FAT 中占用 2 个字节,因此每个 FAT 大约需要 32732 字节。用扇区大小 512 除以该值,您将得到 64 个 FAT 扇区,这与 DOS 所述完全一致。

因此,32MB 驱动器需要 64 个扇区或 32KB 用于单个 FAT,而对于两个 FAT 副本,则需要将其翻倍至 128 个扇区(即 64KB)。

有趣的是,15MB D: 驱动器似乎使用 4KB 簇大小(8 个扇区),每个 FAT 有 12 个扇区。这意味着它使用 FAT12 文件系统。因此,3784 个簇中有 30277 个扇区。

使用更新的 MS-DOS 3.31,可以将整个 47MB 驱动器分区为一个分区,使用 2KB 簇大小。

我没有测试 20MB 驱动器 – 它可以格式化为 FAT16 或 FAT12,具体取决于其选择的阈值。

1

  • 谢谢!我的结论是,当您还必须缓存数据缓冲区时,在 640K 系统上默认缓存 32K 可能太多了。我很怀念我不得不考虑这些事情的时光。再次感谢。


    – 


FAT 的大小取决于文件系统的大小。在中,计算方法如下:

; We calculate the number of sectors required in a FAT. This is done as:
; # of FAT Sectors = TotalSectors / SectorsPerCluster * # of bytes in FAT to
; represent one cluster (i.e. 3/2) / BytesPerSector (i.e. 512)

(3/2 适用于 FAT12 文件系统;对于 FAT16,它是乘以 2)。

在 MS-DOS 3.3(Compaq DOS 除外)中,文件系统的最大扇区数为 65536,因此 FAT 所需的最大扇区数为65536 / SectorsPerCluster * 2 / BytesPerSector(最后一个分区向上舍入)。

因此,FAT 的大小取决于驱动器格式化的簇大小以及正在使用的扇区大小 – 通常是 512 字节,但在方案中,可以增加扇区大小以允许大于 32Mb 的文件系统,同时仍使用 16 位扇区号。

FAT 的大小(以及是否有第二份副本 —— 几乎总是有)是在驱动器格式化时设置的,因此 FAT 永远不会出现碎片。

在 FAT16 文件系统上,FAT 可以获得的最大值是 128k(2 字节/簇,65536 簇),但我认为这仅限于比 MSDOS 3.3 创建的卷大得多的卷。

0