在中文网站里,对结构体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;