我已经获得了2k字节来制作超简约文件系统,我考虑制作一个剥离版本的FAT16。
我唯一的问题是了解如何在卷中存储FAT。假设我每个块使用2个字节,因此我有1024个块。我需要一个包含1024行的表,并且在每行中我将保存文件的下一个块。
由于每个块可以处理其他1023块,我无法看到该表如何不使用我的整个2k空间。我不明白如何将此表保存到我的硬盘驱动器中,只使用几个字节而不是仅使用1024个块来写入1024行表。
答案 0 :(得分:2)
鉴于你被允许实现一个平面文件系统并且有一个很小的空间可以使用,我会看一些类似于Apple DOS 3.3 filesystem的东西,而不是像FAT16这样的分层文件系统。即使是FAT16前身的平面文件系统FAT12,也非常复杂。
我建议你将2 kiB音量分成16字节“扇区”的256字节“音轨”,以使用Apple DOS 3.3命名法。在您自己的实现中将它们称为您喜欢的。如果您在设计阶段重复使用相同的术语,它只是帮助您映射概念。
您不需要DOS启动映像,并且您不需要关注移动磁盘驱动器头的seek time,因此不要将磁道0-2放在一边并放置VTOC轨道在磁盘的中间,让我们将VTOC置于轨道0上.VTOC包含自由扇区位图,第一个目录扇区的位置以及其他内容。
如果我们为VTOC保留整个轨道0,我们将剩下112个16字节扇区。对于位图,这些将只包含14个字节,这表明我们真的不需要整个轨道0。
让我们将轨道0的前两个扇区放在一边,并在自由扇区位图中包含轨道0。这会导致一定程度的冗余,因为我们总是将前两个扇区映射为“已使用”,但它使实现更简单,因为现在没有特殊情况。
让我们将Apple DOS 3.3的VTOC概念分为两部分:卷标区(VLS)和无卷扇区位图(VFSB)。
我们将VLS置于0 0扇区0上。
让我们为magic number留出VLS的前2-4个字节,以将此卷文件标识为属于您的文件系统。如果没有这个,卷文件的唯一识别特征是它们的大小为2 kiB,这意味着您的代码可能会被诱导丢弃一个碰巧大小相同的无辜文件。您希望获得更多针对数据销毁的保险。
VLS也应该命名此卷。 Apple DOS 3.3只使用了卷号,但我们可能希望使用几个字节代替ASCII名称。
VLS还需要指向第一个目录扇区。我们至少需要2个字节。我们有128个磁道,这意味着我们需要至少7位。我们使用两个字节:track和sector。这是您深入了解设计选择的细节。我们现在可以考虑通过定义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可能包含指向第一个目录扇区的指针,该扇区描述包含引导映像的文件。