iovec_iter操作
由来
iov_iter它是由Nick Piggin于2007 年首次为2.6.24内核添加的。但是在过去的一年中,人们一直在努力扩展此API,并在内核的更多部分中使用它。例如,在3.19的合并中,它将看到它进入网络子系统的第一步。
内核中最常见的任务之一是处理用户空间提供的数据缓冲区,可能是分成几个块。也许并不奇怪,这是内核代码经常出错的任务,从而导致错误以及可能的安全问题。内核包含一个原语(称为“ iov_iter ”),该原语旨在简化此任务。尽管当前iov_iter的使用主要限于内存管理和文件系统层,但它正在慢慢扩展到内核的其他部分。该接口目前未公开,本文将尝试解决这种情况。
iov_iter
iov_iter的本质上是一个iovec的迭代器。struct iovec定义在**/include/uapi/linux/uio.h**文件中
struct iovec
{
void __user *iov_base; /* BSD uses caddr_t (1003.1g requires void *) */
__kernel_size_t iov_len; /* Must be size_t (1003.1g) */
};
{
void __user *iov_base; /* BSD uses caddr_t (1003.1g requires void *) */
__kernel_size_t iov_len; /* Must be size_t (1003.1g) */
};
他的结构和POSIX定义的用户空间的iovec结构相同,并与readv()之类的系统调用一起使用。顾名思义,“vec”表明iovec是一个数组的形式体现。
iov_iter
iov_iter定义在**/include/linux/uio.h**文件中。
struct iov_iter {
/*
* Bit 0 is the read/write bit, set if we're writing.
* Bit 1 is the BVEC_FLAG_NO_REF bit, set if type is a bvec and
* the caller isn't expecting to drop a page reference when done.
*/
unsigned int type;
size_t iov_offset;
size_t count;
union {
const struct iovec *iov