【问题标题】:Basic File System Implementation基本文件系统实现
【发布时间】:2015-04-16 07:42:42
【问题描述】:

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

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

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

【问题讨论】:

  • 2k 确实看起来很低。但是每块 2 字节并不是很有用恕我直言。也许你应该把它们做成那个大小的 20 倍(或者最接近 2 的幂)。我想你也必须减少文件名的大小?
  • 另外,如果你只能寻址 2048 个字节,那就是 10 位寻址,但你可能希望保留不到一个字节,这意味着你至少需要移动 2 位,这是最少的每个块的大小为 4 字节。每个块有 16 个字节,你会得到一个 6 位地址(剩下 2 位用于标记)。
  • @didierc 是的。但我真正的问题是将 FAT 表保存到磁盘。它将使用多少磁盘空间?这就是我无法理解的。
  • 我不知道FAT16的实现细节,我只是在考虑简单的基于块的设备考虑。
  • 文件系统运行时规范是 2 kB 的 RAM,还是文件系统实现的 2 kB 代码空间?

标签: filesystems fat


【解决方案1】:

鉴于您可以实现一个平面文件系统并且有这么小的空间可以使用,我会考虑像Apple DOS 3.3 filesystem 这样的东西,而不是像FAT16 这样的分层文件系统。即使是 FAT16 的平面文件系统前身 FAT12,对于您的目的来说也过于复杂。

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

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

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

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

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

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

让我们为magic number 留出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 可能包含指向第一个目录扇区的指针,该指针描述了包含启动映像的文件。

【讨论】:

    猜你喜欢
    • 2011-01-12
    • 2011-02-14
    • 2012-11-07
    • 1970-01-01
    • 2011-04-02
    • 2011-06-14
    • 2021-09-02
    • 2021-05-30
    • 2012-11-08
    相关资源
    最近更新 更多