linux - Linux中结构体iov_iter的用途是什么?

标签 linux linux-kernel linux-device-driver embedded-linux

struct iov_iter 的用途是什么? Linux 内核中使用该结构代替 struct iovec。 iter 接口(interface)没有任何好的文档。我在 LWN 上找到了一份文档,但我无法理解。谁能帮我理解 Linux 内核中使用的 iter 接口(interface)吗?

最佳答案

iovec 的一个目的,即 LWN article前面说过,是以多个 block 的形式处理数据。

如果你有许多离散的缓冲区,用指针链接起来,并且想要一次性读/写它们,你可以简单地将其替换为多个读/写操作,但在某些情况下,语义与读/写边界相关 - 因此不能在不改变含义的情况下简单地拆分操作。另一种方法是将所有数据复制进出连续的缓冲区,这是一种浪费,我们希望不惜一切代价避免。

使用 POSIX readv/writev 或在我们的例子中使用 iov_iter API,可以减少系统调用的数量,从而减少所涉及的开销。虽然在内核中这不会转化为像上下文切换这样昂贵的操作,但这仍然是一个小问题。当驱动程序无法知道不久的将来是否会出现更多数据时,它们也可能比处理大量较小的数据 block 更有效地处理较大的数据 block - 对于网络驱动程序尤其如此,尽管我不知道 atm 中使用了 iov_iter

相同情况的另一个实例是原始磁盘的 I/O 设备,只允许 I/O 开始和结束 block 边界。用户有时可能想要执行随机访问或在 block 的开头覆盖一小部分缓冲区和/或将其余部分清零。 类似的场景正是 iovec 想要解决的问题;您可以构造一个 iovec ,它使您能够执行分布在多个离散缓冲区上的整个 block 操作,其中甚至可能包括一个“临时”缓冲区,用于转储您读取的 block 的部分且不关心处理,以及一个预清零缓冲区,用于在 writev 末尾链接以将 block 的其余部分清零。再次,我应该指出,您可以使用具有关联复制和/或归零的连续缓冲区,但是iov_iter API提供了一种开销更少的替代抽象,并且在阅读代码时可能更容易推理。

矢量处理或并行计算中此类操作的术语是“分散/聚集处理”。

关于linux - Linux中结构体iov_iter的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41074458/

相关文章:

c - 为什么不能在内核中使用科学记数法

android - 内核开发新手 : "Virtual" input driver in kernel?

linux - 如何使用 Travis CI 将多个 docker 容器部署到 gcloud?

linux - 使用 shell 脚本对文件进行排序然后删除旧文件

linux - 打印当前目录子目录中以 .c 结尾的所有(非隐藏)文件

linux - 连接字符设备和物理PCIe驱动

linux - codeigniter框架上传保存在linux mint上

linux - clock_nanosleep 是否受 adjtime 和 NTP 影响?

linux - 为什么我收到 "killall -q -USR1 udhcpd"错误消息?

c - 我如何查看对内核模块所做的更改?