基本文件系统实现

Basic File System Implementation

我得到了 2k 字节来制作一个超简约的文件系统,我考虑制作一个精简版的 FAT16。

我唯一的问题是了解如何将 FAT 存储在卷中。假设我每个块使用 2 个字节,因此我有 1024 个块。我需要一个包含 1024 行的 table,并且在每一行中我将保存文件的下一个块。

由于这个块中的每个块都可以寻址其他 1023 个块,所以我看不出这个 table 怎么不会使用我的整个 2k space。我不明白如何将此 table 保存到我的硬盘驱动器中并仅使用几个字节而不是仅使用 1024 块来写入 1024 行 table.

考虑到您可以实现平面文件系统并且可以使用如此小的 space,我会考虑像 Apple DOS 3.3 filesystem rather than a hierarchical filesystem like FAT16. Even the flat filesystem predecessor of FAT16, FAT12 这样的东西,对于您的目的来说过于复杂。

我建议您将 2 kiB 的卷分成 256 字节 "tracks" 和 16 字节 "sectors," 以使用 Apple DOS 3.3 命名法。在您自己的实施中将它们命名为您喜欢的名称。如果您在设计阶段在这里重复使用相同的术语,它只会帮助您映射概念。

您不需要 DOS 引导映像,也不需要担心 seek time 移动磁盘驱动器磁头,因此不要留出磁道 0-2 并将VTOC 磁道位于磁盘中间,让我们将 VTOC 放在磁道 0 上。VTOC 包含空闲扇区位图、第一个目录扇区的位置和其他内容。

如果我们为 VTOC 保留整个磁道 0,我们将剩下 16 字节扇区中的 112 个。对于位图,这些将打包成只有 14 个字节,这表明我们真的不需要为此使用整个轨道 0。

让我们将磁道 0 的前两个扇区放在一边,并将磁道 0 包含在空闲扇区位图中。这会导致一定程度的冗余,因为我们总是将前两个扇区映射为 "used,",但它使实现更简单,因为现在没有特殊情况。

让我们将 Apple DOS 3.3 的 VTOC 概念分为两​​部分:卷标扇区 (VLS) 和卷自由扇区位图 (VFSB)。

我们将把 VLS 放在磁道 0 扇区 0 上。

让我们留出 VLS 的前 2-4 个字节用于 magic number 以将此卷文件标识为属于您的文件系统。如果没有这个,您的卷文件的唯一识别特征是它们的大小为 2 kiB,这意味着您的代码可能会被诱导丢弃一个恰好大小相同的无辜文件。您需要比这更多的数据破坏保险。

VLS 也应该命名这个卷。 Apple DOS 3.3 只使用了卷号,​​但也许我们想使用几个字节来代替 ASCII 名称。

VLS 还需要指向第一个目录扇区。为此,我们至少需要 2 个字节。我们有 128 条轨道,这意味着我们至少需要 7 位。让我们使用两个字节:磁道和扇区。在这里,您可以了解设计选择的本质。我们现在可以考虑通过定义 256 个轨道来移动到 4 kiB 卷大小。或者,也许在这一点上我们认为 16 字节的扇区太小,并增加它们以便我们以后可以超过 4 kiB。不过,让我们暂时坚持使用 16 字节扇区。

VFSB 只需要一个扇区:2 kiB 容量÷每个扇区 16 个字节 = 128 个扇区÷每个字节 8 位 = 16 个字节。但是,考虑到上述想法,我们可能会考虑在 VLS 中留出一个字节用于 VL 之后的 VFSB 扇区数量,以允许更大的卷。

Apple DOS 3.3 目录扇区的想法应该可以直接转化为这个新的文件系统,除了每个扇区只有 16 个字节可以使用,我们不能描述每个扇区 7 个文件。我们需要 2 个字节作为指向下一个目录扇区的指针,剩下 14 个字节。每个文件都应该有一个标志字节:已删除、只读等。这意味着我们可以为每个目录扇区 1 个文件使用 13 字节文件名,或者为每个目录扇区 2 个文件使用两个 6 字节文件名。我们可以 做 7 个单字母文件名,但那很蹩脚。如果我们采用您的 3 个字符文件名的想法,那么在考虑每个文件的标志字节后,每个目录扇区有 3 个文件,剩下 2 个额外的字节要定义。不过,我会选择每个扇区 1 或 2 个文件。

这正是您所需要的。剩下的就是实现和扩展了。

扩展的另一个想法:如果我们想将其用作可启动磁盘介质怎么办?这些东西通常确实需要引导加载程序,那么我们是否需要将 VLS 和 VFSB 扇区向下移动 1,以将磁道 0 扇区 0 留给引导映像?或者,VLS 可能包含指向第一个目录扇区的指针,该目录扇区描述包含引导映像的文件。