文件系统服务
文件系统服务负责处理所有与文件系统相关的操作,因此内核和用户空间的程序都需要通过文件系统服务来访问文件系统。
文件系统会向上暴露一些文件接口,其自身会维护一些缓存数据以及文件系统的元数据,并且在必要时向下调用块设备服务来读写数据。
关于向上的接口,你可以采取任何的实现,只要符合前面要求的应用接口即可。但是,我们还是希望大家使用一些方便的接口,便于其他内核线程使用。
通常情况下,文件系统模块还会记录一些元数据,以及一部分缓存数据,以便提高文件系统的性能。缓存包括但不限于文件数据、目录数据、文件元数据等。在 Linux 中,缓存的文件数据会被称为 page cache。Page cache 会在内存中缓存文件数据,对 mmap 特别有用。
文件系统设计
文件系统的设计与需求有关,我们这里对性能和效率都没有什么要求,一切以方便实现和调试为主。
所有的文件系统都需要有一个超级块 (super block),用于持久地保存文件系统的元数据,如文件系统块的大小等。超级块通常会被放在文件系统的第一个块,以便文件系统驱动在初始化时读取。
此外,文件系统基本都有索引部分和数据部分,用于管理文件的数据以及文件系统空闲块。
关于具体的实现,可以参考rcore 的设计。为了方便调试,除了为你的内核提供支持外,你最好还要在实现一个制作镜像或编辑镜像的工具(可以共用一套库)。