Linux内核4.1在file_operations的read_iter和write_iter

 

在中文网站里,对结构体file_operations的描述中仍大多停留在旧版本,包含

ssize_t (*aio_read)(struct kiocb *  , char __user *  buffer, size_t  size ,  loff_t   p);
可以看出,这个函数的第一、三个参数和本结构体中的read()函数的第一、三个参数是不同 的,
异步读写的第三个参数直接传递值,而同步读写的第三个参数传递的是指针,因为AIO从来不需要改变文件的位置。
异步读写的第一个参数为指向kiocb结构体的指针,而同步读写的第一参数为指向file结构体的指针,每一个I/O请求都对应一个kiocb结构体);
初始化一个异步读 -- 可能在函数返回前不结束的读操作.如果这个方法是 NULL, 所有的操作会由 read 代替进行(同步地).

ssize_t (*aio_write)(struct kiocb *, const char __user *  buffer, size_t  count, loff_t * ppos);
      初始化设备上的一个异步写.参数类型同aio_read()函数;

 

而从4.1版本开始,关于异步读写的函数已经被read_iter和write_iter取代了。

这样的优化设计到两个结构体:

struct iovec {
	void __user *iov_base;
	__kernel_size_t iov_len;
    };  

struct iov_iter {
	const struct iovec *iov;
	unsigned long nr_segs;
	size_t iov_offset;
	size_t count;
    };

任何需要提交异步I/O的内核代码都需要用这些结构来表示。从循环驱动程序的角度来看,问题在于iovec结构体处理用户空间地址。但是表示块I/O操作的BIO结构以结构页指针的形式处理物理地址。因此,两个子系统之间存在阻抗不匹配,这使得AIO无法用于回路驱动器。

 

优化的最终结果是增强了iov_iter结构和周围的支持代码,该代码允许AIO操作以用户空间(结构iovec)或内核空间(结构bio)的形式表示。

fs.h in kernel 4.0 has:

struct file_operations {
struct module *owner;
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
...  

fs.h in kernel 4.1 has:

struct file_operations {
struct module *owner;
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
int (*iterate) (struct file *, struct dir_context *);

 

参考资料:https://lwn.net/Articles/535034/

你可能感兴趣的:(linux,c语言,操作系统)