文件系统的布局

文件系统通常保存在磁盘上。在本实验中,第三个磁盘(即 disk0,前两个磁盘分别是 ucore.img 和 swap.img)用于存放一个 SFS 文件系统(Simple Filesystem)。通常文件系统中,磁盘的使用是以扇区(Sector)为单位的,但是为了实现简便,SFS 中以 block (4K,与内存 page 大小相等)为基本单位。

SFS 文件系统的布局如下图所示。

image

第 0 个块(4K)是超级块(superblock),它包含了关于文件系统的所有关键参数,当计算机被启动或文件系统被首次接触时,超级块的内容就会被装入内存。其定义如下:

struct sfs_super {
    uint32_t magic;                                  /* magic number, should be SFS_MAGIC */
    uint32_t blocks;                                 /* # of blocks in fs */
    uint32_t unused_blocks;                         /* # of unused blocks in fs */
    char info[SFS_MAX_INFO_LEN + 1];                /* infomation for sfs  */
};

可以看到,包含一个成员变量魔数 magic,其值为 0x2f8dbe2a,内核通过它来检查磁盘镜像是否是合法的 SFS img;成员变量 blocks 记录了 SFS 中所有 block 的数量,即 img 的大小;成员变量 unused_block 记录了 SFS 中还没有被使用的 block 的数量;成员变量 info 包含了字符串"simple file system"。

第 1 个块放了一个 root-dir 的 inode,用来记录根目录的相关信息。有关 inode 还将在后续部分介绍。这里只要理解 root-dir 是 SFS 文件系统的根结点,通过这个 root-dir 的 inode 信息就可以定位并查找到根目录下的所有文件信息。

从第 2 个块开始,根据 SFS 中所有块的数量,用 1 个 bit 来表示一个块的占用和未被占用的情况。这个区域称为 SFS 的 freemap 区域,这将占用若干个块空间。为了更好地记录和管理 freemap 区域,专门提供了两个文件 kern/fs/sfs/bitmap.[ch]来完成根据一个块号查找或设置对应的 bit 位的值。

最后在剩余的磁盘空间中,存放了所有其他目录和文件的 inode 信息和内容数据信息。需要注意的是虽然 inode 的大小小于一个块的大小(4096B),但为了实现简单,每个 inode 都占用一个完整的 block。

在 sfs_fs.c 文件中的 sfs_do_mount 函数中,完成了加载位于硬盘上的 SFS 文件系统的超级块 superblock 和 freemap 的工作。这样,在内存中就有了 SFS 文件系统的全局信息。

results matching ""

    No results matching ""