assembly - 为什么很少使用 FAT#2?

标签 assembly filesystems fat

<分区>

我从 Peter Abel 的书 IBM PC 汇编语言和编程 中阅读了 FAT#2 的单行解释。

它说:

Although FAT2 is still maintained, its use has never been implemented.

维基百科说:

The FAT Region.

This typically contains two copies (may vary) of the File Allocation Table for the sake of redundancy checking, although rarely used, even by disk repair utilities.

我可以想到使用它的两个强有力的理由

  1. 所有 FAT 系统都有一个(除非一个禁用它)
  2. 它是内置的

我知道 FAT 是一个非常古老的文件系统,但为什么 FAT#2 从未并且很少被实现?

最佳答案

假设“FAT2”表示 FAT(文件分配表)的第二个副本,那么基本问题是它几乎没有实际用途,但我不确定它是否真的从未使用过。

FAT 是 FAT 文件系统中的一个中心数据结构,它是如此重要以至于文件系统本身就是以它命名的。它不仅是一个包含哪些簇已分配或未分配的表,它还存储构成每个文件的簇的链表。如果 FAT 中的单个扇区损坏,可能会丢失大量文件,因此在某些时候有人认为拥有 FAT 的备份副本是个好主意。

但问题是,如果 FAT 已损坏,您如何判断 FAT 的哪个副本是正确的?这将备份副本的用途限制为从主 FAT 读取导致读取错误的情况。因此,至少在理论上,如果在读取文件时操作系统在读取 FAT 时遇到错误,它可以尝试备份副本。

然而,物理磁盘错误并不是 FAT 损坏的唯一途径。特别是,磁盘修复实用程序(如 chkdsk)并非真正设计用于修复由读取错误引起的文件系统损坏。它们只是为了修复由于将错误数据写入磁盘而导致的损坏。最常见的情况是计算机在写入磁盘的过程中关机。在那种情况下,文件系统很容易处于不一致状态。特别是如果操作系统正在更新 FAT,它可能更新了主副本但没有更新备份副本,或者它可能更新了备份副本但没有更新主副本。无法知道是哪一个。

我不确定操作系统是否真的会在读取错误后检查备份 FAT。这很难说,因为它很少在实践中产生影响。在过去 20 年左右制造的硬盘上,单个扇区读取错误并不常见,因为它们会在故障扇区变坏之前重新映射它们。驱动器在完全失效之前往往没有磁盘错误。即使在软盘上,物理磁盘错误也往往会影响整个磁道,这会删除 FAT 的两个副本。

查看 Linux 和 FreeBSD FAT 文件系统实现的源代码,如果从主 FAT 读取失败,它似乎不会尝试备份 FAT。我不知道微软的三个主要实现(MS-DOS、Windows 95 或 Windows NT)有什么用。

关于assembly - 为什么很少使用 FAT#2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37465008/

相关文章:

8086 中的汇编代码

performance - X86 Broadwell 上的吞吐量 FMA 和乘法

linux - nasm,86_64,linux ,"hello world"程序。当链接时,它说 "relocation truncated to fit"

linux - 在 VFS 之上缓冲

python - 当 Python Watchdog 的目录发生任何变化时如何运行函数?

filesystems - 如何使用 SD 卡以 48 ksamples/s 的速度记录 16 位数据?

c - 在 DOS/FAT 中缩小或部分截断文件

assembly - 在 Assembly 的过程调用中将寄存器保存在堆栈上

node.js - 在没有 GridFS 的情况下将文件存储在 mongoDB 中

c - 在 C 中获取 Fat12 磁盘的卷标