文件系统 - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Table of Contents

概述

INODE结构

  • INODE结构 为文件系统用来表示文件和目录的管理结构
  • UNIX V6 使用了两套INODE结构
    • 磁盘INODE结构,是磁盘INODE区的存储结构,一个磁盘INODE结构长度为32个字节
    • 核心INODE结构,是磁盘INODE结构的内存映像,并加入了一些控制信息
  • 参看struct inode

文件索引结构

综述

  • 文件索引结构 是 由INODE结构指示文件包含的磁盘块 的机制
  • 文件根据包含块的多少,分为三类
    • 小文件
    • 大文件
    • 巨型文件

小文件

  • 文件块数 1~8块
  • 结构如图

小文件索引结构

  • INODE结构 i-addr数组每个元素直接指向物理块

大文件

  • 文件块数 9~7*256 块
  • 结构如图(不包含虚线内部分)

大文件/巨型文件索引结构

  • i-addr数组
    • [0]~[6] 各指向一个索引表块,每个索引表(2*256字节)指向256个物理块
    • [7] 不使用

巨型文件

  • 文件块数 7*256+1 ~ 7*256+256*256
  • 结构如上图(包括虚线内部分)
  • i-addr数组
    • [0]~[6] 和大文件结构相同
    • [7]指向间接索引表块,每个间接索引表块指向256个索引表块,每个索引表块指向256个物理块

磁盘存储结构

  • 磁盘的第0块 一般存放机器启动程序,与UNIX核心代码无关
  • 磁盘的第1块 ,称为超级块,结构为struct filsys,用于管理文件系统
  • 磁盘的第2 ~ s-isize+1块,为inode区,用于存放inode块(struct inode),
    • 磁盘中每个inode结构长度为32个字节,一个磁盘块为512字节,可存放16个inode
    • 总长s-isize(定义在struct filsys)
  • 磁盘的第s-isize ~ s-fsize-1块,为一般存储块区
  • 磁盘的盘块总数为 s-fsize(定义在struct filsys)

空闲块管理

  • 举例说明文件系统的空闲块管理

磁盘文件系统的空闲块管理结构

  • 例子一共管理249个空闲块
  • 先说明使用的数据结构:管理块
    • 管理块是磁盘的一个块,前101个字有效
      • 第一个字存放这个管理块总共管理的空闲块数
      • 后100个字,为空闲块指针数组,指向各空闲块(首元素指向上一个管理块)
    • 从磁盘起始地址,前99个空闲块管理在磁盘第一个管理块
      • 其[1]元素(空闲块指针数组首元素)为0,作为空间用尽标志
    • 其后99个空闲块管理在磁盘第二个管理块
      • 其[1]元素(空闲块指针数组首元素)指向上一管理块
    • filsys结构管理了最后一组空闲块,形式和管理块一样

释放了一个管理块后的结构

  • 申请占用空闲块的步骤
    • 若filsys的s-free数组有多于一个的有效元素,弹出最后一个以占用
    • 若filsys的s-free数组只剩下[0]元素了,且不为0,则
      • 根据s-free[0]的指针找到上一个管理块,并将其前101个字复制到filsys结构,此时filsys取代了这个管理块的作用,如图
      • 返回被取代的管理块以占用
    • 若filsys的s-free[0] == 0,磁盘空间用尽,抛出错误
    • 参看alloc

  • 释放占用块的步骤
    • 将占用块加入 filsys的s-free数组管理
    • 若数组满,则执行 与申请占用空闲块 的相反步骤
    • 参看free

空闲INODE管理

  • 空闲INODE直接由filsys结构进行管理
  • filsys只管理100个空闲INODE块
  • 如果filsys管理的空闲INODE块用尽,则线性查找100个空闲块置入filsys进行管理

装载文件系统

  • mount[] 数组用于描述已装载的文件系统,定义在 struct mount
  • 系统启动时,在iinit中将 主设备 装载到mount[0]
  • 当每存在一个子设备,/dev 文件夹下存在一个文件与其对应
    该文件INODE的i_addr[0]存放该设备的设备号
  • 当在shell中执行
    /etc/mount /dev/rk2 /rkmount

    将设备rk2装载到/rkmount,形成子文件系统
    • 附图

      • rkmount INODE块的i_addr[0]存放子系统设备号
        • rkmount 称为 块/字符设备 装载INODE
      • mount[x]为子文件系统装载块
      • m_bufp 指向子文件系统filsys块在内存中的缓存块
  • 子文件系统装载参看

勾连

文件权限

文件权限字位

  • 权限常量 IREAD IWRITE IEXEC 参看inode.h

inode类型

⚠️ **GitHub.com Fallback** ⚠️