上周日实验室例会主要涉及linux文件操作的内核实现。主要讨论了linux下对文件进行操作时,系统内部调用了那些函数以及它们是怎么相互配合的。
linux系统是怎样对不同介质和不同的文件系统提供统一的文件操作接口呢?答案是:VFS。系统中所有文件系统不但依赖VFS(虚拟文件系统),而且也靠它来协同工作,我们来认识一下系统虚拟文件系统中的几个成员吧。在见识它们庐山真面目前,先看下用户调用了系统调用write()后的过程,首先被一个通用的系统调用sys_write处理,该函数找到文件描述符所在的文件系统实际给出的写操作,然后执行操作。实际文件系统的写方法是文件系统实现的一部分,数据最终通过该操作写入介质。如下图:
一超级块
存储一个已经安装的文件系统的控制信息,代表一个已经安装的文件系统;每次一个实际的文件系统被安装时,内核会从磁盘的特定位置读取一些控制信息填充超级块对象。一个安装实例和一个超级块对象一一对应。超级块中的s_type记录文件系统类型。
二索引节点(inode)
代表一个文件,包含了内核在操作文件或目录时需要的全部信息,仅当文件被访问时才在内存建立
三目录项对象(dentry)
代表一个目录项,是路径的组成部分,可以是文件和目录,为了方便查找路径和解析引入的。没有对应的磁盘结构,VFS根据字符串路径现场创建它,不存在于磁盘上。目录项有被使用、未被使用和负状态。负状态是d_inode指向NULL,理论上没有存在必要,其实还是可以快速查找的,此外目录项有缓存,加快查找
四文件对象
文件对象是进程打开的文件,进程之间处理的是文件,文件对象是已经打开的文件在内存中的表示,由open创建由close销毁,多个进程可以打开操作同一个文件,同一个文件可能存在多个文件对象,它仅仅在进程的观点上代表打开的文件,文件对象指向目录项对象,目录项才和实际的文件一一对应,也和索引节点一一对应。
它们之间的关系如下:
其中task_struct为进程结构体。