Unix文件系统UFS实现解析
1. UFS概述
UFS(Unix文件系统)被实现为一个可加载的文件系统模块,包含vfs和vnode对象的实例。其中,UFS的vnode接口实现文件操作,而UFS的vfs接口则实现文件系统管理。
UFS文件系统的实现主要分为以下五个部分:
- 一个vfs对象实例,以及用于挂载和卸载文件系统、收集文件系统统计信息的方法。
- 实现文件操作的vnode方法。
- 使用标准目录名查找缓存的目录实现。
- 用于将文件映射到存储设备磁盘块的块映射算法。
- 用于在vnode不再被引用后仍将其保留在内存中的inode缓存。
UFS实现了用于文件访问的vnode接口和用于文件系统管理的vfs接口。它与持久存储的设备驱动程序、用于存储和检索元数据的块缓冲区缓存、用于缓存路径名的目录名查找缓存以及用于缓存文件数据的虚拟内存系统进行交互。
2. 文件到磁盘块的映射
基于磁盘的文件系统的核心是块映射算法,这些算法实现了磁盘上的文件系统格式。对于UFS,主要有两个函数实现磁盘格式:bmap_read()和bmap_write()。
-bmap_read():查询文件系统,确定文件块所在的物理磁盘扇区,即查找包含所需块磁盘地址的直接/间接块。该函数用于文件读写操作,以定位磁盘块。它接受一个inode和偏移量作为输入参数,输出参数为磁盘地址指针和长度指针。函数会搜索inode的直接、间接和双重间接块,以找到与所提供偏移量对应的磁盘块的磁盘地址。同时,它还会从偏移量处