5.2打开文件
在操作系统中就是确定进程操作哪个文件。这个确定过程由两个事件构成:
1.将用户进程task_struct中的*filp[20]与内核中的file_table[64]进行挂接。
2.将用户进程需要打开的文件对应的i节点在file_table[64]中进行登记。
*filp[20]:掌控一个进程可以打开的文件,既可以打开多个不同的文件,也可以同一个文件多次打开,每打开一次文件(不论是否是同一个),就要在*filp[20]中占用一个项记录指针。一个进程可以同时打开的文件次数不能超过20次。
file_table[64]是管理所有进程打开文件的数据结构,不但记录了不同的进程打开不同的文件,也记录了不同的进程打开同一个文件,还记录了同一个进程多次打开同一个文件。与*filp[20]类似,只要打开一次文件,就要在file_able[64]中记录.(所以一个进程最多打开20次文件,但所有进程打开文件的总和不能超过64?)
文件的i节点:是记载文件属性的最关键的数据结构。在操作系统中i节点和文件是一一对应的,找到i节点就能唯一确定文件。
inode_table[32]:内核通过inode_table[32]掌控正在使用的文件i节点数,每个被使用的文件i节点都要记录在其中。
打开文件的本质就是要建立*filp[20],file_table[64],inode_table[32]三者之间的关系。
建立关系的这个过程分为三个步骤:
1.将用户进程task_struct中的*filp[20]与内核中的file_table进行挂接。
2.以用户给定的路径名“/mnt/user/user1/user2/hello.txt”为线索,找到hello.txt文件的i节点。
3.将hello.txt对应的i节点在file_table[64]中进行登记。
具体的操作是在进程中调用open()函数实现打开文件,该函数最终映射到sys_open()系统调用函数执行。映射过程以及sys_open()函数的基本执行情况已经在4.4.1节。
5.2.1将进程的*filp[20]与file_table[64]挂接
5.2.2获取文件i节点
5.2.3将文件i节点与file_table[64]挂接
5.3读文件
读文件就是从用户进程打开的文件中读取数据,读文件由read函数完成。
5.3.1确定数据块在外设中的位置
5.3.2将数据块读入缓冲块
5.3.3将缓冲块中的数据复制到进程空间
5.4新建文件
新建文件就是根据用户进程要求,创建一个文件系统中不存在的文件。新建文件由creat()函数实现。
5.4.1 查找文件
5.4.2 新建文件i节点
新建hello.txt 文件 i 节点,将会在user2目录文件(作出目录文件的示意图)中写入hello.txt文件对应的新目录项信息。
5.4.3 新建文件目录项
只要在user2目录文件中寻找到空闲项,就在此位置加载新目录项,如果缺失找不到空闲项,就在外设上创建新的数据块来加载(此过程示意图类似P234所示)。
5.5 写文件
操作系统对写文件操作的规定是:进程空间的数据先要写入缓冲区中,然后操作系统在适当条件下,将缓冲区中的数据同步到外设上。而且,操作系统只能以数据块(1 KB)为单位,将缓冲区中的缓冲块(1 KB) 的数据同步到外设上。这就需要在同步之前,缓冲块与外设上要写入的逻辑块进行一对一绑定,确定外设上的写入位置,以此保证用户空间写入缓冲块的数据能够准确地同步到指定逻辑块中。
首先介绍如何确定绑定关系
5.5.1 确定文件的写入位置
5.5.2 申请缓冲块
5.5.3 将指定的数据从进程空间复制到缓冲块
5.5.4 数据同步到外设的两种方法
5.6 修改文件
5.6.1 重定位文件的当前操作指针
5.6.2 修改文件
5.7 关闭文件
关闭文件对应的是打开文件,是在close()函数中完成的。
5.7.1 当前进程的filp与file_table[64]脱钩
5.7.2 文件i节点被释放
5.8 删除文件
删除文件对应的是新建文件。删除文件与关闭文件有所不同:关闭文件只是解除当前进程与hello.txt文件在file_table[64]中指定挂接点的关系,而删除操作的效果表现为所有进程都无法访问到hello.txt这个文件。
5.8.1 对文件的删除条件进行检查
5.8.2 进行具体的删除工作
5.9 本章小节
操作系统对文件的一切操作,都可以分为两个方面:对super_block,d_super_block,m_inode,d_inode,i节点位图,逻辑块位图这类文件管理信息的操作以及对文件数据内容的操作。新建,打开,关闭,删除文件属于对文件管理信息的操作。读文件,写文件和修改文件则主要是操作文件数据内容。
操作系统管理信息就是建立或解除进程与文件的关系链条,链条的主干为task_struct中的*filp[20]——file_table[64]——inode_table[32].进程就可以沿着关系链条,依托缓冲区与硬盘进行数据交互。当关系链条解除后,进程则不再具备操作指定文件的能力。如果文件管理被更改,则操作系统要将此更改落实在硬盘上,以免失去对文件数据内容的控制。