我已经获得了 2k 字节来制作一个超简约的文件系统,我考虑制作一个精简版的 FAT16。
我唯一的问题是了解如何将 FAT 存储在卷中。假设我每个块使用 2 个字节,因此我有 1024 个块。我需要一个包含 1024 行的表,并且在每一行中我将保存文件的下一个块。
由于这个块中的每一个都可以寻址其他 1023 个块,所以我看不出这张表如何不会使用我的整个 2k 空间。我不明白如何将此表保存到我的硬盘驱动器中并仅使用几个字节而不是仅使用 1024 块来编写 1024 行表。
我已经获得了 2k 字节来制作一个超简约的文件系统,我考虑制作一个精简版的 FAT16。
我唯一的问题是了解如何将 FAT 存储在卷中。假设我每个块使用 2 个字节,因此我有 1024 个块。我需要一个包含 1024 行的表,并且在每一行中我将保存文件的下一个块。
由于这个块中的每一个都可以寻址其他 1023 个块,所以我看不出这张表如何不会使用我的整个 2k 空间。我不明白如何将此表保存到我的硬盘驱动器中并仅使用几个字节而不是仅使用 1024 块来编写 1024 行表。
鉴于您可以实现一个平面文件系统并且有这么小的空间可以使用,我会看类似Apple DOS 3.3 文件系统的东西,而不是像 FAT16 这样的分层文件系统。即使是 FAT16 的平面文件系统前身FAT12,对于您的目的来说也过于复杂。
我建议您将 2 kiB 的卷分成 256 字节的“轨道”和 16 字节的“扇区”,以使用 Apple DOS 3.3 命名法。在您自己的实现中称它们为您喜欢的名称。如果您在设计阶段重用相同的术语,它只会帮助您映射概念。
您不需要 DOS 引导映像,也无需担心移动磁盘驱动器磁头的寻道时间,因此不要留出磁道 0-2 并将 VTOC 磁道放在磁盘中间,让我们把我们的 VTOC 放在磁道 0 上。VTOC 包含空闲扇区位图、第一个目录扇区的位置以及其他内容。
如果我们为 VTOC 保留整个磁道 0,我们将剩下 16 字节扇区中的 112 个。这些将只打包成位图的 14 个字节,这表明我们真的不需要完整的磁道 0。
让我们将磁道 0 的前两个扇区放在一边,并将磁道 0 包含在空闲扇区位图中。这会导致一定程度的冗余,因为我们将始终将前两个扇区映射为“已使用”,但它使实现更简单,因为现在没有特殊情况。
让我们将 Apple DOS 3.3 的 VTOC 概念分为两部分:卷标扇区 (VLS) 和无卷扇区位图 (VFSB)。
我们将把 VLS 放在磁道 0 扇区 0 上。
让我们留出 VLS 的前 2-4 个字节作为一个幻数,以将此卷文件标识为属于您的文件系统。没有这个,你的卷文件的唯一识别特征是它们的大小是 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 可能包含指向第一个目录扇区的指针,该指针描述了包含引导映像的文件。