完成了创建文件流程的介绍,下面就是向文件写数据了。今天我们主要介绍一些Ext2文件系统写数据的主要流程及核心代码。
为了便于理解Ext2文件系统写数据的流程,本文先从整个Linux文件系统的角度分析一下写数据的流程,因此本文包含了部分VFS内容介绍。本文主要包含2部分内容,一部分是从总体上介绍一个写流程是如何从用户态接口到Ext2文件系统的,另一部分是Ext2文件的数据在磁盘上组织及函数流程。
写文件的操作通常由用户态的程序发起,比如在开发的过程中调用系统API(write)。如图是从用户态发起一直到调用Ext2函数的整个调用流程。从用户态到内核态是触发了一个中断,这里我们不关心其具体实现,其作用是触发对内核函数的调用。最开始的内核函数是VFS的函数,VFS是一个中间抽象层,其目的是为用户提供统一的接口,屏蔽不同文件系统间的差异。VFS会调用具体文件系统的函数,对于本文基于的内核版本(5.2)调用是Ext2的ext2_file_write_iter函数。在老版本的Linux内核当中调用的是虚拟文件系统的公共函数generic_perform_write。
图1 整体调用流程
能够调用该文件系统的接口是因为inode在初始化的时候填充了该文件系统的一个文件操作的结构体实现,关于具体细节本文不做解释,后续再另起文详述。
Ext2文件系统文件操作结构体实现如代码所示,这里包含了Ext2文件系统实现的可以对文件进行的操作。包括对文件内容的读写、查找和缓存同步等等。