文件系统 - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 文件系统 在 磁盘上部署特殊的存储结构,参看 磁盘存储结构
- 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结构管理了最后一组空闲块,形式和管理块一样
- 管理块是磁盘的一个块,前101个字有效
释放了一个管理块后的结构
- 申请占用空闲块的步骤
- 若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直接由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块在内存中的缓存块
- rkmount INODE块的i_addr[0]存放子系统设备号
- 附图
- 子文件系统装载参看
- 一个文件/目录的权限由inode结构的i_mode 的末九位表示
文件权限字位
- 权限常量 IREAD IWRITE IEXEC 参看inode.h
- inode的类型由inode结构的i_mode 的 13-14 位表示
- 一般用 (inode.i_mode && IFMT) 获取 类型号
- 类型号 可能值
- 常量定义 参看 inode.h