在中文网站里,对结构体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内核4.1在file_operations的read_iter和write_iter相关推荐

  1. 操作系统与存储:解析Linux内核全新异步IO引擎io_uring设计与实现

    作者:draculaqian,腾讯后台开发工程师 引言 存储场景中,我们对性能的要求非常高.在存储引擎底层的IO技术选型时,可能会有如下讨论关于IO的讨论. http://davmac.org/dav ...

  2. Linux内核:一文读懂文件系统、缓冲区高速缓存和块设备、超级块

    目录 前言 第一部分 Linux文件系统堆栈 VFS数据结构 文件系统初始化顺序 Dentries 打开文件-说起来容易做起来难! 虚拟文件系统 前言 第二部分 Linux文件系统堆栈 当我们键入&q ...

  3. linux read函数_浅谈Linux内核IO体系之磁盘IO

    前言 Linux I/O体系是Linux内核的重要组成部分,主要包含网络IO.磁盘IO等.基本所有的技术栈都需要与IO打交道,分布式存储系统更是如此.本文主要简单分析一下磁盘IO,看看一个IO请求从发 ...

  4. 深入linux内核架构--虚拟文件系统VFS

    [推荐阅读] Linux内核源码分析--内核启动之zImage自解压过程 你应该知道的Linux内核基础及内核编译 深入理解LINUX内核堆栈 [零声教育]vico老师教你怎么学习Linux内核 值得 ...

  5. Linux内核文件操作

    Linux内核文件操作 前言 一.文件操作结构体 二.VFS之file_operations对象 1.文件打开filp_open 2.文件关闭filp_close 3.文件读取vfs_read 4.文 ...

  6. Linux内核学习:EXT4 文件系统在 Linux 内核系统中的读写过程

    目录 1 概述 2 虚拟文件系统 与 Ext4 文件系统 2.1 sys_write( ) 代码跟踪 2.2 sys_write( ) 过程分析 2.3 sys_write( ) 的核心部分 vfs_ ...

  7. Linux内核驱动 --ioctl函数解析

    1.前言 当我们在讨论linux内核驱动开发时,就不得不提到ioctl这个及其重要的函数.它是字符类设备驱动程序中实现对设备控制的接口之一. ioctl是设备驱动程序中对设备的I/O通道进行管理的函数 ...

  8. linux内核的论文,Linux kernel 初探

    在了解内核之前,先要会编译.调试内核. 编译内核 安装依赖: sudo apt-get update sudo apt-get install git fakeroot build-essential ...

  9. USB总线-Linux内核USB设备驱动之UAC2驱动分析(十)

    1.概述 UVC(USB Audio Class)定义了使用USB协议播放或采集音频数据的设备应当遵循的规范.目前,UAC协议有UAC1.0和UAC2.0.UAC2.0协议相比UAC1.0协议,提供了 ...

  10. Linux 内核 C 语言深度解析

    课程简介 在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时,相信大家和我一样,经常会遇到一些"看似熟悉",但一仔细分析又不是很懂的 C 语言"稀奇古怪& ...

最新文章

  1. 非科班通过几个月的培训入行人工智能现实吗?
  2. linux禁用用户账号,技术|在 Linux 系统中禁用与解禁用户的账号
  3. springboot 之 webscoket 服务端推送
  4. 【渝粤题库】广东开放大学 公共部门人力资源管理 形成性考核
  5. click() bind() live() delegate()区别
  6. Apache Flink 官方文档--流(DataStream API)-旁路输出
  7. eclipse添加约束文件
  8. 电池管理系统(BMS)
  9. 有哪些防护措施可以解决DDOS攻击?
  10. emlog模板酷黑自适应CoolBlack主题 黑的有质感
  11. 机动目标运动分析——IMM篇
  12. BOOT ROM 初始化内容、启动设备、镜像烧写
  13. 关于VB提示ByRef参数类型不符的分析
  14. 概率论与数理统计:随机变量、分布律,分布函数,密度函数
  15. STM32定时器延时函数
  16. 【项目经验】--环保项目
  17. 如何写好年终总结年终总结应该怎么写
  18. SqlServer数据库测评
  19. 人工智能-线性代数之矩阵篇
  20. xp系统远程计算机需要网络打印机驱动,WinXP手动添加TCP/IP端口及安装打印机驱动(系统向导安装,不需要任何软件)...

热门文章

  1. Begging_Rust(译):做算术(第二章)
  2. 解决java.util.ConcurrentModificationException:null
  3. wordpress图像大小_为WordPress优化图像
  4. 如何在 HTML 中调整图像大小?
  5. 在腾讯云上搭建基于Nodejs的网站
  6. __bridge,__bridge_transfer和__bridge_retained详解
  7. 24点游戏开发实例(Qt含源码)
  8. VMware安装macOS High Sierra V10.13.6完整版
  9. 天正对应cad版本_天正建筑t20适用哪个版本cad
  10. java计算机毕业设计家用电器销售网站源码+mysql数据库+系统+lw文档+部署