【问题标题】:Basics of implementing a file system [closed]实现文件系统的基础[关闭]
【发布时间】:2012-11-07 23:05:07
【问题描述】:

我目前的操作系统课程项目是设计和实现一个基本文件系统。我已经阅读了我们书中关于文件系统的章节,但我不知道从哪里开始。 我知道一些需要的结构(文件控制块、系统范围的打开文件表、每个进程打开的文件表、r+w 缓冲区、目录结构),以及我需要支持的操作(打开、读取、写入、删除,创建,关闭)。

我得到了一个 10MB 的“驱动器”来实现里面的文件系统。 任何有关资源或直接答案的帮助将不胜感激。

编辑:这是作业https://www.dropbox.com/s/971ec21u3yn62wz/Laboratory%20Project%204_5%20Creating%20a%20File%20System.pdf的链接

【问题讨论】:

  • 这甚至不是“不是一个真正的问题”。这只是“不是一个问题”。我建议使用 libfuse,但我不确定它是否是您所追求的
  • 抱歉,我没有提出“真正的问题”是因为我不知道自己在寻找什么。我在这个论坛上看到过类似的问题,例如我的问题,但响应通常是提供 API 的 libfuse 之类的链接。我已经获得了一个大文件来实现这个文件系统,但是在获取伪代码和程序结构时,我不知道从哪里开始。
  • 如何驱动文件系统?谁将请求访问并在其中存储对象?它必须(子集)POSIX 兼容吗?它应该是内核模式吗?
  • 文件系统完全处于用户模式。整个内容将存储在我计算机上的一个文件中,这个文件在我的逻辑视图中只是一个文件系统,对于实际的操作系统来说它只是另一个文件。截至目前,只有当前用户(我)需要访问它。至于符合 POSIX 的部分,我不知道这意味着什么,我认为它不需要这样。
  • 但是,您应该重新表述您的贡献以防止其被关闭。

标签: file unix directory system implementation


【解决方案1】:

您提出了一个非常广泛的问题。而且还不清楚您是否必须实现一个真正的文件系统,但现在看起来您需要实现您的教授定义的一组操作。

你写:

我知道一些需要的结构(文件控制块、系统范围的打开文件表、每个进程打开的文件表、r+w 缓冲区、目录结构)

在我看来,您关注的是错误的事情。这些是实际操作系统用来支持对文件系统的高效访问的内存结构。

  • 文件控制块 - 您的版本可能非常简单
  • 系统范围的打开文件表 - 您不需要它来支持单个用户
  • 每个进程打开的文件表 - 你只需要一个,它可能非常简单。
  • r+w 缓冲区 - 这是一种性能增强,不是分配严格要求的,如果需要,可以在以后添加。
  • 目录结构 - 啊,现在你开始做事了。

我读到作业中提到的“目录结构”是指磁盘结构。这就是你可能需要关注的。你有一大块存储空间,你需要分发小块。所以你需要编写一个存储分配器。真正困难的部分是设计磁盘结构。您必须跟踪哪些块是免费的。文件可以被删除,所以你会发现漏洞。两种简单的方法是使用位图或连续可用空间列表。无论您选择哪种方法,它们都将成为您希望选择另一种的代码的一部分。

您还需要一个结构来跟踪名称。当用户创建一个文件时,他会命名它。为了稍后打开文件,他给出了相同的名称。需要磁盘结构来支持这一点。还有其他元数据:最后修改日期(您的作业特别需要这个)、文件大小、数据位置。您可以使用分配器获取空间来存储元数据。

通常在存储的开头(或附近)有一个固定块来保存配置信息和指向加载文件系统所需的其他存储的指针。

为了更好地了解 Unix 文件系统概念,我可以推荐 Marshall Kirk McKusick 和 George V. Neville-Neil 的“The Design and Implementation of the FreeBSD Operating System”,第 8 章本地文件系统。

http://www.amazon.com/Design-Implementation-FreeBSD-Operating-System/dp/0201702452

特别是这些子章节:

  • 8.8。本地文件存储
  • 8.3。命名
  • 8.9。伯克利快速文件系统

这有助于单独考虑存储分配和命名。

您的作业页面包含一些很好的参考资料。我有机会查看Practical File System Design,这是作者慷慨地在网上发布的。我可以特别推荐这些章节:

  • 第四章 BFS 的数据结构
  • 第 6 章分配策略

还有可能:

  • 附录 A 文件系统构建工具包

也许您遇到的问题是该项目看起来很大而且势不可挡。将其分解成更小的部分确实很有帮助。如果您仍然迷路,请从实施您最了解的部分开始。

让我们回到你的任务的细节。它提到了这些文件系统约束:

  • 文件最大16384字节
  • 磁盘上的分配单元或块每个 512 字节
  • 您的总存储区域为 2-10 MB

在这种情况下的约束并不坏,它们很好,因为它们限制了您必须处理的内容并允许您走捷径。 (我不再多说,因为弄清楚细节是你任务的重点。)

如果您仍然卡住,您可以将源代码读取到一个简单的文件系统,如 FAT。这是 FAT 的一个非常容易理解的描述:

http://www.pjrc.com/tech/8051/ide/fat32.html

(也可以查看*。)

这是一个用于嵌入式应用程序的 FAT C 实现的链接:

http://ultra-embedded.com/?fat_filelib

源代码只有大约 5K 行。

祝你好运。

【讨论】: