我目前的操作系统课程项目是设计和实现一个基本的文件系统。我已经阅读了我们书中关于文件系统的章节,但我不知道从哪里开始。我知道一些需要的结构(文件控制块、系统范围的打开文件表、每个进程打开的文件表、r+w 缓冲区、目录结构),以及我需要支持的操作(打开、读取、写入、删除,创建,关闭)。
我已经获得了一个 10MB 的“驱动器”来实现里面的文件系统。任何有关资源或直接答案的帮助将不胜感激。
我目前的操作系统课程项目是设计和实现一个基本的文件系统。我已经阅读了我们书中关于文件系统的章节,但我不知道从哪里开始。我知道一些需要的结构(文件控制块、系统范围的打开文件表、每个进程打开的文件表、r+w 缓冲区、目录结构),以及我需要支持的操作(打开、读取、写入、删除,创建,关闭)。
我已经获得了一个 10MB 的“驱动器”来实现里面的文件系统。任何有关资源或直接答案的帮助将不胜感激。
你问了一个非常广泛的问题。而且还不清楚您是否必须实现一个真正的文件系统,但现在看起来您需要实现您的教授定义的一组操作。
你写:
我知道一些需要的结构(文件控制块、系统范围的打开文件表、每个进程打开的文件表、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
特别是这些子章节:
这有助于单独考虑存储分配和命名。
您的作业页面包含一些很好的参考资料。我有机会查看了Practical File System Design,作者在网上慷慨地发布了它。我可以特别推荐这些章节:
加上也许:
也许你遇到的问题是这个项目看起来很大而且势不可挡。将其分解成更小的部分确实很有帮助。如果您仍然迷路,请从实施您最了解的部分开始。
让我们回到你的任务的细节。它提到了这些文件系统约束:
在这种情况下,约束并不坏,它们很好,因为它们限制了您必须处理的内容并允许您走捷径。(我不再多说,因为弄清楚细节是你任务的重点。)
如果您仍然卡住,您可以将源代码读取到一个简单的文件系统,如 FAT。这是 FAT 的一个非常容易理解的描述:
http://www.pjrc.com/tech/8051/ide/fat32.html
(另请查看维基百科。)
以下是用于嵌入式应用程序的 FAT 的 C 实现的链接:
http://ultra-embedded.com/?fat_filelib
源代码只有大约 5K 行。
祝你好运。