第七篇章 文件系统

  • Post author:
  • Post category:其他



日期:2022-10-13


版本号:V1.0


作者:snow


  • 基础概念


1.1、安装点


虽然当前shell进程可以以文件的形式进行数据交互,但是仅限于根文件系统中文件,还不能于其他外围存储设备(U盘、硬盘、固态硬盘、FLASH等)中的文件进行数据交互,故还需要构建在根文件系统基础上,将外设的文件系统加入到根文件系统中,然后系统就可以通过跟文件系统访问外设的文件。


mount /dev/hd1 /mnt


mount代表挂载命令


/dev/hd1代表硬盘


/mnt代表挂载点的路径名称


每个硬盘与虚拟盘一样,都有自己的根节点,系统只需要找到硬盘的根节点在硬盘中位置,然后将这个位置连接到根文件系统的已有的节点中,就可以通过根文件系统进行访问。为理解方便,将硬盘的根节点称安装点,安装点在根文件系统的连接位置称为挂接点


二、文件系统的安装


本章将会以硬盘为例,讲述硬盘文件系统如何挂载到根文件系统中,其他外围存储设备基本流程一致。


2.1、获取硬盘设备号


(1)通过根节点在根文件系统中搜索dev的目录项,进而找到其i节点号


(2)根据dev的i节点号找到hd1的目录项,进而找到其i节点号


(3)通过hd1的i节点号获取其i节点,并从属性中提取其设备号


(注:外存插入、拔出以及系统启动时,系统的驱动程序会根据设备变化后的情况在/dev更新其i节点信息,例如判断其基本属性、分配设备号、注册相关驱动等)


2.2、申请硬盘挂接点


(1)通过根节点在搜索mnt的目录项,找到其i节点号


(2)根据mnt的i节点号找到其i节点


(3)在i节点中申请一个子节点/mnt/hd1,作为硬盘的挂载点


2.3、挂载硬盘


(1)在系统的超级块管理结构中申请一个空闲项进行初始化并将其上锁


(2)系统根据硬盘的设备号从硬盘中读取获取硬盘的超级块


(3)将硬盘的逻辑块位图和i节点等信息备份到申请的超级块管理结构中


(4)硬盘的超级块解锁


(5)将硬盘的i节点s_imount成员设置为在虚拟盘的挂载点(即/mnt/hd1的i节点)


(6)将/mnt/hd1的i节点设置为跨设备节点(寻找到该节点时,对超级块中所有社被s_mount成员进行匹配,即可递归使用)


三、文件操作


3.1、打开文件


open函数(目标文件名称 模式 以及权限)


3.1.1 进程与内核文件管理表连接


(1)在当前进程的*filp[]中申请一个空闲项(指针为空)


(2)在内核的*file_table[]中申请一个空闲项(引用次数为0)


(3)将进程的文件管理表指针指向内核文件管理表的空闲项


(4)该内核文件管理表的空闲项的引用次数+1


3.1.2 搜索目标文件i节点


(1)通过文件系统搜索目标文件的i节点


(2)将目标文件的i节点信息备份至i节点管理inode中,便于后续访问


3.1.2内核文件管理表登记目标文件


(1)将目标文件的i节点的文件相关属性以及inode位置写入到文件管理表的相应项中


(2)返回目标文件管理项在进程文件管理表指针中的偏移位置(小彩蛋:也就是我们常用的文件句柄)


3.2、读取文件


read (文件句柄 读取数量 缓冲区指针)


3.2.1 读取前检查


(1)文件句柄是否在进程文件管理表指针管理范围内


(2)读取的数据数量是否有效


(3)进程文件管理表指针中的文件句柄是否指向一个有效的内核文件管理项


3.2.1 确定目标数据的数据块号


(1)从filetable中获取目标文件的i节点位置


(2)从filetable中获取文件当前的状态属性:当前指针偏移量、引用计数器等


(3)通过i节点确定待操作的逻辑块的位置,然后根据逻辑块中索引信息确定数据块在设备中的位置(当大于512会使用i节点中i_zone信息,当大于512*512时,继续嵌套定位)


3.2.2 读取目标逻辑块至内核缓冲区


(1)根据设备号和逻辑块编号读取读取硬盘数据至内核缓冲区中


3.2.3 从内核缓冲区备份至用户缓冲区


(1)将内核缓冲区中的硬盘数据拷贝用户的缓冲区


(2)读取完毕完毕后释放内核缓冲区空间


3.3、新建文件


creat (路径名、文件名、权限)


3.3.1 为新文件建立i节点


(1)根据路径名和文件名判断目标文件的i节点是否已经存在


(2)若已存在,直接返回新建失败


(3)在inode_table中申请一个空闲项


(4)加载硬盘的i节点位图,同时获取一个空闲的i节点号,随后将该节点号置为可用


(5)设置该i节点的基本属性(用户id 组id 权限 设备 i节点号等)


3.3.2 为新文件建立目录项


(1)通过路径名搜索路径所在i节点


(2)在路径i节点中新建一个目录项


(3)在新建目录项填写新建文件的文件名


(4)在新建目录项中填写新文件的i节点号


3.3.3 在内核与进程中登记新文件


(1)在当前进程中申请一个空闲指针


(2)在内核中申请一个空闲文件管理项


(3)将进程文件管理指针指向该管理项


(4)在进程管理项中填写新文件的的属性(i节点、权限、模式、引用次数等)


3.4、写入文件


write(文件句柄 内容 长度)


3.4.1 获取写入数据块位置


(1)简称文件句柄是否已经在进程和内核中进行登记(未登记则非法返回)


(2)根据文件句柄中得当前写入指针偏移量、文件据比你高的i节点中数据块索引表、写入长度,获取待写入得数据块的块号


(3)如果未能找到待写入的数据块号,则申请相应的数据块,并将这些数据块位置更新的该文件的i节点中(尚未将新的i节点信息同步硬盘中)


(4)将带写入的数据块在缓冲区管理结构中进行注册


3.4.2 写入缓冲块


(1)通过缓冲区管理结构申请空闲缓冲块


(2)将数据块中现有的数据加载到空闲缓冲块(若为新建文件则内容应为空)


(3)通过文件句柄中当前偏移量、当前块写入数量,将用户的数据填写到内核缓冲块中


(4)调整文件信息(大小、当前文件i节点为脏数据=b_dirt置1)


3.4.3 同步硬盘


(1)搜索当前inode管理项哪个i节点是脏数据


(2)从设备加载该i节点所在的数据块至缓冲块


(3)将内核中的新的i节点信息同步至缓冲块中


(4)将新i节点缓冲块写回至硬盘中


(5)update将数据数据缓冲块写回硬盘中


(6)释放相关缓冲块


注:在写入过程中,若缓冲区满(无法申请相应的写入缓冲块),需要先等待update进程写入或主动执行同步过程进行写入,以便写入完成后释放相应的缓冲块。


3.5 修改文件


策略即先读取后修改然后写回,原理略


3.6 关闭文件


3.6.1 解除进程与文件管理表的连接


(1)当前文件的进程文件管理结构指针不再指向内核文件管理表


3.6.2 文件管理表状态更新


(1)内核文件管理表中该文件引用次数减1


3.6.3 释放文件i节点


(2)若文件的i节点引用次数减1,若该i节点引用次数将为0,则将其从i节点管理项中释放。


3.7 删除文件


3.7.1 检测删除条件


(1)获取文件的i节点


(2)从i节点获取文件的用户权限


(3)判断文件类型(若为目录文件,则不能删除)


3.7.2 断开路径名与文件链接


(1)在路径名的i节点的目录管理项中上,删除待目标文件的名称以及i节点号信息


(2)该文件的链接次数减一


(3)i节点置为脏数据


(4)修改时间同步


(5)通过update进程同步目录项i节点信息


3.7.3 删除数据块


由于i节点链接次数减为0,会触发删除i节点操作


(1)在内核中标记文件的数据块位图为未使用


(2)将这些数据块脏状态和同步状态清0


(3)等待update进程将数据块位图写回硬盘


3.7.4 删除硬盘i节点


(1)读取目标文件i节点数据块


(2)将数据中目标文件i节点信息清0


(3)等待update进程将该数据块写回硬盘


3.7.5 删除内核i节点


(1)由于内核中该i节点引用次数已减为0,则在inode惯例项中将其删除


(2)目标文件的目录i节点引用次数减一(若减为0也会删除)



版权声明:本文为fenfen4705原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。