Linux文件访问机制深度解析
1. 文件读写基础
文件访问是一个复杂的过程,涉及到VFS抽象、块设备处理和磁盘缓存的使用。文件读写操作主要通过read()和write()系统调用来实现,对应的服务例程会调用文件对象的读写方法,这些方法可能依赖于具体的文件系统。
对于基于磁盘的文件系统,读取文件是以页为单位进行的。如果进程请求读取少量字节且数据不在内存中,内核会分配一个新的页框,将文件的相应部分填充到页中,添加到页缓存,最后将请求的字节复制到进程地址空间。大多数文件系统的读取方法由generic_file_read()函数实现。
写入操作相对复杂,因为文件大小可能会改变,内核可能需要在磁盘上分配或释放物理块。许多基于磁盘的文件系统通过generic_file_write()函数实现写入方法,如Ext2、System V/Coherent/Xenix和Minix等;而一些日志和网络文件系统则使用自定义函数。
1.1 文件读取流程
generic_file_read()函数接收以下参数:
-filp:文件对象的地址
-buf:用户模式内存区域的线性地址,用于存储从文件读取的字符
-count:要读取的字符数
-ppos:指向存储读取起始偏移量的变量的指针
该函数的执行步骤如下: