操作系统文件系统 | 天一阁

操作系统文件系统

虚拟这两个字太讨厌了。虚拟文件系统一点都不虚拟,做了很多实在的工作。

文件系统
  • 对于要长期保存的数据,独立保存起来,这块数据叫做一个文件。文件和目录形成文件系统。

  • 裸机情况下,硬盘只能根据地址定位一段数据的读写,没法用。需要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给应用进程