Linux虚拟文件系统如何处理read、write等系统调用
调用链路与转交位置说明
read系统调用执行流程(write逻辑完全对称)
- 系统调用入口处理
SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)首先完成参数合法性校验,调用fdget_pos(fd)获取文件描述符对应的struct file实例和当前文件偏移量。这个struct file就是open阶段通过do_filp_open创建的对象,已经提前和目标文件所属的文件系统/设备驱动的操作集完成绑定。 - VFS通用层处理
接下来调用VFS层通用接口vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos),这层逻辑与具体文件系统无关,统一完成权限校验、读取范围合法性检查等前置操作。 - VFS到具体实现的转交点(核心分界)
- 任务转交的核心逻辑就在
vfs_read内部:直接调用你贴出的struct file_operations结构体中挂载的回调函数。如果file->f_op->read非空,就直接执行该回调;如果文件系统未实现read回调,VFS会自动调用do_sync_read,转而调用file->f_op->aio_read完成同步读取。 - 此处的
file->f_op完全由目标文件的类型决定:打开ext4文件对应ext4_file_operations、打开XFS文件对应xfs_file_operations、打开字符设备文件对应驱动注册的自定义file_operations,该赋值逻辑在open阶段do_filp_open执行过程中完成。
- 具体文件系统/驱动处理
- 如果是普通磁盘文件系统:回调实现会先查询页缓存,命中则直接将数据拷贝到用户空间返回;未命中则调用地址空间操作集
mapping->a_ops->readpage提交IO请求到块层,块层完成IO调度后调用磁盘驱动读取物理扇区,数据加载到页缓存后再拷贝到用户空间。 - 如果是字符设备、套接字等特殊文件:
f_op->read直接执行对应驱动/子系统的私有逻辑,直接返回数据。
write逻辑说明
write流程和read完全对称:SYSCALL_DEFINE3(write) → 校验参数获取struct file → 调用vfs_write → 执行file->f_op->write/do_sync_write回调转交给具体文件系统/驱动实现。
内容的提问来源于stack exchange,提问作者Preet Derasari
相关产品推荐
相关产品推荐

