🖥️XV6-FileSystem-Structure
2023-5-30|2023-5-30
Anthony
type
status
date
slug
summary
tags
category
icon
password
本Blog基于任职于美国波特兰洲立大学的教授@hhp3在Youtube上对xv6内核的讲解视频本期讲解xv6中的文件系统的结构,视频链接在下面
术语
在现实世界中,文件系统有很多种,比如minix使用的xt4, 或者XFS。在xv6中使用的文件系统叫做xv6fs
文件树
xv6的文件系统由一棵树形结构的目录和若干挂载的文件组成。所有的内容都在同一个设备上(磁盘上)

需要注意的是在xv6中没有文件名称的概念,对文件的访问直接由路径决定。同一个文件也可以挂载在不同的目录下,比如我们通过路径
/a/f/k
和路径 /c/g
访问的文件是一致的文件类型
在xv6中的文件类型可以为目录,文件(Regular file)以及device。对于xv6中,在文件树中的device 只有console。不过我们也可以有其他device。
在其他的文件系统中(如unix的或者linux的系统)文件类型还有 char device, block device, symbolic link, named pipes, sockets。
文件属性
对于xv6中的每个文件,其属性包括
- i-number
- 大小(多少字节)
- 类型(directory, regular, device)
- hard links的数量(即父亲的数量,如果为0,那么该文件应该被删除
- 在磁盘的位置(一堆block numbers)
文件属性由i-nodes保存,但inodes不存在于任何文件中,而是存磁盘的某个地方。当我们访问文件时,由内核读取。(因此肯定有一个给inode的cache)
Hard Links
在许多操作系统中都实现了hard link以及soft link。但是xv6中没有soft link的概念。在xv6中,一个文件可以有多个hard link,也就是说可以有多个父亲。但是每一个目录都只能有一个父亲。(除了根节点没有父亲)
Soft Links(Symbolic Links)对于软链,即文件有可能不直接储存文件本身,而是储存文件的地址。比如路径/a/b/c中储存的是 /a/b/d,那么实际的文件就是/a/b/d。软链可以指向其他的磁盘,我们也可以将软链理解成shortcut。
对于Hard link, 文件就只能在那,不能有其他的获取方式。
I-numbers
我们知道,我们可以通过路径名字获取文件,但是路径并不是唯一的。对于每一个文件来说,xv6都会给其分配一个独有的数字,它永远都不会改变,直到其被删除,该数字才会被释放。
对于根目录,其I-number为1
磁盘结构

- Boot Record不会被kernel使用。其作用是用于booting和startup阶段将内核加载到内存中
- Super block指出了其他block的位置
- 我们使用了6个blocks来储存inodes
- 使用3个blocks来储存bitmap。bitmap用于指示每一个块的使用状态。
- data blocks就是用来存数据的。
super block

superblock的结构如上图(数字仅仅为参考)
magic number的作用是校验。
Inodes 详解

我们知道inodes被存储在专门存放inode的block中,每一个block都可以存放若干个inode(我们这里假设是4),但是由于inodes本身不能很好的align,因此每一个block都会有一定的空间被浪费。
我们可以在fs.h找到inode的定义
其中我们最为关心的是addrs字段。其用来储存目录以及文件的数据的块地址。
需要注意的是xv6中的直接映射块只有12个,其余的是非直接映射块。因此addrs[0-11]都指向了一个block,而addrs[12]会指向DATA BLOCKS中的其中一块,该块储存了指向其他block的地址。由于xv6中一个块的大小是1024,一个块号是4bytes,因此非直接映射的块就有256个。因此总块就是256+12=268个。
因此一个文件只能用268个inode储存,大小就是268*1024 也就是268kb。
FS.h
xv6在
fs.h
中定义了文件系统的格式,该文件系统的格式同时被内核和用户所使用。