iov_iter操作

iov_iter是Linux内核中用于处理用户空间数据缓冲区的迭代器,由Nick Piggin于2007年引入。它简化了内核处理多个数据块的任务,特别是在内存管理和文件系统中。iov_iter的type字段描述数据读写方向,iov_offset指示数组中的元素位置,count表示数组总数。使用iov_iter涉及初始化、复制数据到或从迭代器以及管理数据页面。虽然主要在内核内部使用,但正逐步扩展到更多子系统。
摘要由CSDN通过智能技术生成

由来

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山羊哥-老宋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值