本篇笔记记录了OSTPE中介绍的一种简单的文件系统VSFS的实现。
文件系统,就是一种关于如何在磁盘这种块设备中建立文件、文件夹概念的一套规范
块大小定义
为了方便,文件系统需要以一种单元来操作磁盘,这个单元就是块。VSFS选择常见的块大小——4KB
,并且只使用这一种大小。比如,下面是一个具有256KB的磁盘的视图,我们把它分割成64个块:
为了实现文件系统都要存什么额外的牛马?
要落到物理磁盘上,就只有扇区、磁道的概念,你向上面写数据就是对一个单元的充磁和消磁操作,操作系统想要在这之上建立文件和文件夹的概念,首先就要在磁盘上组织出一些数据结构,来记录一些信息,比如用户定义的文件名与数据在磁盘上的物理位置的映射。下面是文件系统要考虑保存的一些东西
- 用户保存的数据(文件中的内容)
- 文件/文件夹的元信息(名字、创建修改时间、权限等),文件数据在哪些块中(文件系统通常使用
inode
结构来保存一个文件的这些数据) - inode的表
- 记录哪些数据块和inode块已被分配
- 文件系统的元信息(比如有多少
inode
、文件系统类型等)
上图中,一块块的D
就是数据块,用来保存用户数据;小写d
块是数据块的位图,用于保存哪些数据块的分配状态,I
块中保存了若干inode
节点,小写i
是inode
分配情况的位图,超级块S
用于记录文件系统的元信息。
inode
inode列表,也就是下图这东西,其中保存了若干inode
,若inode
条目为256字节,那么5个4KB块就可以容纳4096/256*5=80
个inode。
所以,我们系统中的80个inode可以被看作一个数组,它们的编号为0~79,每个inode
可以保存一个文件或文件夹的信息,如下图:
一定要记住,
inode
通过编号定位,每一个inode可以确定一个文件或文件夹的内容(怎么确定稍后再说),所以inode编号也被称作文件的低级名称
无论是对于文件还是目录,
inode
都只保存其元信息,其内容信息保存在数据块中,稍后会看到如何通过inode
确定数据块
本文讨论的只是文件系统的一种实现,不要拘泥于这个细节,而是学习它的思想。实际上,有的文件系统甚至没有
inode
的概念
inode定位数据块的几种方式
直接定位
inode
中保存一个或多个直接指针,它们指向文件/文件夹对应的数据块。
缺点就是当文件/文件夹内容过大,超出指针数 * 块大小能保存的范围,就没法存了
多级索引(间接指针)
使用间接指针连接到某个数据块,然后使用数据块存储指针项,指向新的数据块。假设磁盘地址是4字节,一个4K块就能多出1024个额外数据块,文件最大大小增加到了(12 + 1024) * 4K = 4144KB
。
更大的文件就采用更多级的间接指针,这是指数级的增长。
其它方法
设计inode与数据块的映射并没有一个正确的办法,实际上还有基于范围、使用链表等方式,各有优缺点吧。
目录组织
快下班了,再说吧
标签:文件,实现,inode,文件系统,保存,文件夹,数据 From: https://www.cnblogs.com/lilpig/p/16858611.html