Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Filesystems 基本文件系统实现_Filesystems_Fat - Fatal编程技术网

Filesystems 基本文件系统实现

Filesystems 基本文件系统实现,filesystems,fat,Filesystems,Fat,我得到了2k字节来制作一个超精简的文件系统,我考虑制作一个精简版的FAT16 我唯一的问题是理解如何将脂肪储存在体积中。假设我每个块使用2个字节,因此我有1024个块。我需要一个有1024行的表,每行我将保存一个文件的下一个块 由于此块中的每个块都可以寻址其他1023块,因此我无法看到此表如何不使用我的整个2k空间。我不知道如何将此表保存到硬盘中,并且只使用几个字节,而不只是使用1024块来编写1024行表。考虑到您可以实现一个平面文件系统,并且有这么小的空间可以使用,我会考虑类似的文件系统,而

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

我唯一的问题是理解如何将脂肪储存在体积中。假设我每个块使用2个字节,因此我有1024个块。我需要一个有1024行的表,每行我将保存一个文件的下一个块


由于此块中的每个块都可以寻址其他1023块,因此我无法看到此表如何不使用我的整个2k空间。我不知道如何将此表保存到硬盘中,并且只使用几个字节,而不只是使用1024块来编写1024行表。

考虑到您可以实现一个平面文件系统,并且有这么小的空间可以使用,我会考虑类似的文件系统,而不是像FAT16这样的分层文件系统。就您的目的而言,即使是FAT16的扁平文件系统前身也过于复杂

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

你不需要一个DOS引导映像,而且你没有移动磁盘驱动器的关注点,所以不要设置磁道0-2,把VToC磁道放在磁盘中间,让我们把VToC放在轨道0上。包含空闲扇区位图、第一个目录扇区的位置以及其他内容的VTOC

如果我们为VTOC保留整个磁道0,我们将剩下112个16字节扇区。对于位图来说,这些将被压缩为14个字节,这表明我们真的不需要整个轨迹0

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

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

我们将把VLS放在轨道0区

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

VLS还应命名此卷。苹果DOS3.3只是使用了一个卷号,但也许我们想用几个字节来代替ASCII名称

VLS还需要指向第一个目录扇区。我们需要至少2个字节。我们有128个磁道,这意味着我们至少需要7位。让我们使用两个字节:磁道和扇区。这就是你进入设计选择本质的地方。我们现在可以考虑通过定义256个轨道移动到4 KIB体积大小。或者,在这一点上,我们可能认为16字节扇区太小,并增加它们,以便我们以后可以超过4kib。不过,现在让我们继续使用16字节扇区

VFSB只需要一个扇区:2kib卷÷每个扇区16字节=128个扇区÷每个字节8位=16字节。但是,考虑到上面的想法,我们可以考虑在VLS中为VFSB扇区后面的VL扇区设置一个字节,以允许更大的体积。 苹果DOS3.3目录扇区的想法应该直接转化为这个新的文件系统,除了每个扇区只有16个字节可供使用之外,我们无法描述每个扇区7个文件。我们需要2个字节作为指向下一个目录扇区的指针,剩下14个字节。每个文件都应该有一个字节作为标志:已删除、只读等。这意味着每个目录扇区可以有一个13字节的文件名来表示一个文件,或者每个目录扇区可以有两个6字节的文件名来表示两个文件。我们可以做7个单字母的文件名,但那太差劲了。如果我们采用3个字符的文件名,在考虑每个文件的标志字节后,每个目录扇区有3个文件,剩下2个额外的字节需要定义。不过,我会选择每个扇区1到2个文件

这正是你所需要的。剩下的就是实施和扩展


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

2k看起来确实很低。但是每个块2字节对IMHO来说不是很有用。也许你应该把它们做成这个尺寸的20倍(或最接近的2次方)。我想你也必须减少文件名的大小?另外,如果你只能寻址2048个字节,那就是10位寻址,但你可能想保持少于一个字节,这意味着你至少需要2位的移位,这是每个块的最小大小为4字节。每个块有16个字节,您可以得到一个6位地址(左2位用于标记)。@didierc True。但我真正的问题是将胖表保存到磁盘。它将使用多少磁盘空间?这就是我未能理解的。我不知道FAT16的实现细节,我只是在考虑简单的基于块的设备注意事项。文件系统运行时,是2 kB的RAM规格,还是2 kB的代码空间用于文件系统的实现?