实现文件系统的基础知识

时间:2012-11-19 22:47:53

标签: file unix directory system implementation

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

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

编辑:这是指派https://www.dropbox.com/s/971ec21u3yn62wz/Laboratory%20Project%204_5%20Creating%20a%20File%20System.pdf

的链接

1 个答案:

答案 0 :(得分:6)

你问过一个非常广泛的问题。目前尚不清楚是否必须实现真正的文件系统,但现在看来你需要实现一些你的教授所定义的操作。

你写道:

  

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

在我看来,你专注于错误的事情。这些是真实操作系统用来支持对文件系统的有效访问的内存结构。

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

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

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

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

为了更好地概述Unix文件系统概念,我可以推荐Marshall Kirk McKusick和George V. Neville-Neil编写的“FreeBSD操作系统的设计和实现”,第8章本地文件系统。

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

特别是这些子章节:

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

这有助于人们分别考虑存储分配和命名。

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

  • 第4章BFS的数据结构
  • 第6章分配政策

另外可能:

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

也许你遇到的问题是项目看起来很大而且势不可挡。它真的有助于将其分解为更小的部分。如果你仍然迷失,那么首先要实施你最了解的部分。

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

  • 文件大小最多 16384字节
  • 磁盘上的分配单元或块均 512字节
  • 您的总存储空间 2-10 MB

在这种背景下的约束并不坏,这很好,因为它们限制了你必须处理的内容,并允许你削减一些角落。 (我不再说了,因为弄清楚细节是你的任务的重点。)

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

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

(另请查看维基百科。)

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

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

源代码只有大约5K行。

祝你好运。