虚拟这两个字太讨厌了。虚拟文件系统一点都不虚拟,做了很多实在的工作。
文件系统
-
对于要长期保存的数据,独立保存起来,这块数据叫做一个文件。文件和目录形成文件系统。
-
裸机情况下,硬盘只能根据地址定位一段数据的读写,没法用。需要os进行统一分配和管理
-
文件描述符,“描述符”,类似还有全局描述符,页目录描述符,其实就是一个struct,里面有各种属性信息。文件被打开后,os会在内核记录被打开文件的属性,还包括状态和信息
- 文件指针,最近一次读写位置,每个进程维护自己
- 打开次数
- 文件磁盘位置,缓存
-
os:文件就是数据块;用户:文件是数据结构
-
文件读写必须以块为单位,内存是以字节为单位:
- 读:读出一块,返回对应部分;写:读出一块,修改,写回一块
-
目录实现
- 列表、hash表
- 根目录在磁盘中位置固定
- PWD,当前工作路径
文件系统分层
类unix文件系统,把标准输入,输出,磁盘文件,网络socket都看成文件。这样就会给程序员,有统一的读写接口。最基础的接口无非就是open, read, write, close。整体分层如下:
- libc的接口(如:open,read)
- syscall接口(sys_read, sys_write)
- vfs接口 (vfs_open, vfs_read)
- 为什么有这层?主要是为了同一个不同io的接口。统一都使用inode表示一个文件。inode是个索引节点,通过inode,可以找到文件具体在磁盘上的位置。
- 具体文件系统接口
- 每个文件系统都有自己的数据结构,主要是如何把数据放到磁盘上
- 一般来说,都是前面有个superblock,记录整体信息
- 然后是根目录的inode。对于目录的inode就是记录了每一项的inode位置。
- 通过目录inode,就可以找到文件的inode。
- 文件的inode记录每块数据的存储位置。
- 设备接口(driver)
- 具体向io发起指令的部分,跟外设相关
文件系统功能
分配磁盘空间
管理文件块
空闲空间管理
分配算法
文件操作
-
打开:
- 内核会记录所有打开的文件
-
读文件
- 获取字节所在数据块
-
写文件
- 先读一块,修改,然后写会
基本数据结构
文件系统基本数据结构,这些全部是在硬盘上的
-
文件卷控制块(superblock)
- 对应文件系统,空余块
- 在磁盘上位置是固定的,他指向目录项
- 文件系统mount的时候,就是读取这部分数据
-
文件控制块
- 每个文件一个
- 数据块位置
-
目录项
- 指向文件数据块,父目录,子目录
文件描述符
- 对应打开的文件
- 文件状态信息
- 系统有系统级全局的打开文件表,每个进程有自己的打开文件表
- 打开文件,目录项和文件都需要被打开
加载内存时间
- 卷控制块:文件系统挂载时,载入内存
- 文件控制块:当文件被访问的时候
- 目录节点:在遍历文件路径
文件分配
- 三种分配方式:连续、链式、索引
- 索引分配:在文件头里指向索引块,索引块保存指向每个数据块指针
- 对于大文件,用链式索引块,或多级索引块
- UFS多级索引分配,文件头包含13个指针
文件打开操作
- 先找到对应设备
- 从对应设备的mount的fs,进行lookup
- 找到文件inode,读磁盘加载
- 保存对应文件inode,到file列表
- 返回fd给应用进程