本笔记主要针对 linux/fs/read_write.c
中的系统调用进行分析。
read
系统调用的基本处理流程如下:
sys_read
直接调用返回 ssize_t ksys_read(unsigned int fd, char __user *buf, size_t count)
:fdget_pos
从 int
类型的 fd
转换为用户所打开的文件结构体对象 struct fd
。struct fd
定义如下:C struct fd { struct file *file; unsigned int flags; };
.file != NULL
时:file_ppos
获取当前文件的偏移量ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
:file->f_mode
判定文件是否可读,否则返回 -EBADF
。file->f_mode
判定打开方式是否可读,否则返回 -EINVAL
。access_ok
判定进程是否有权访问传来的内存区域,否则返回 -EFAULT
。rw_verify_area
判定进程访问的文件区域是否可读,否则原值返回该函数的值。f_op->read
,如果没有定义 f_op->read
则调用 f_op->read_iter
。若都未定义则返回 -EINVAL
。fsnotify_access
告知事件监听系统该文件已被读取。add_rchar
增肌进程的读取字节数计数器。inc_syscr
增加进程的读操作次数计数器。.file == NULL
,则返回 -EBADF
。