Linux中结构iov_iter的目的是什么?

时间:2016-12-10 10:23:58

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

struct iov_iter的目的是什么?此结构正在Linux内核中使用,而不是struct iovec。 iter界面没有任何好的文档。我在LWN上找到了一份文件,但我无法理解。有谁能帮我理解Linux内核中使用的iter接口?

1 个答案:

答案 0 :(得分:1)

iovec的一个目的,即LWN article预先声明,是以多个块处理数据。

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

使用POSIX readv / writev或(在我们的情况下为iov_iter API)可减少系统调用次数,从而减少所涉及的开销。虽然在内核中这并不能转换为像上下文切换这样昂贵的操作,但它仍然是一个小问题。当他们无法知道在不久的将来是否会有更多的数据时,驱动程序也可能比许多较小的块更有效地处理更大的数据块 - 对于网络驱动程序尤其如此,尽管我和#39 ;我不知道在那里使用iov_iter

同一情况的另一个实例是原始磁盘的I / O. 设备,只允许I / O开始和结束块 边界。用户可能偶尔想要执行随机访问或覆盖一小块缓冲区,例如,块的开始和/或其余部分为零。 这样的情景正是iovec旨在解决的问题;你可以构造一个iovec,它可以让你在几个不连续的缓冲区上进行整个块操作,甚至可能包括一个" scratch"缓冲区用于转储您读取的块的部分并且不关心处理,以及用于在writev结束时链接的预置零缓冲区,以将块的其余部分清零。同样,我应该指出可以使用带有关联复制和/或清零的连续缓冲区,但iov_iter API提供了一个替代抽象,开销更少,并且可能更容易推理阅读代码。

矢量处理或并行计算等类似操作的术语是" 分散/收集处理"。